SpringMVC中资源国际化使用实践

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: SpringMVC中资源国际化使用实践

默认情况下,SpringMVC根据Accept-Language请求头参数判断客户端的本地区域类型。当接受到请求时,SpringMVC会在请求上下文中查找一个本地化解析器(LocalResolver) ,找到后使用它获取请求所对应的本地化类型信息。


SpringMVC还允许装配一个动态更改本地化类型的拦截器LocaleChangeInterceptor,这样通过指定一个请求参数就可以控制单个请求的本地化类型。


Spring架构的大多数部分都支持国际化,就像Spring MVC框架一样。DispatcherServlet允许您使用客户端的区域设置自动解析消息。这是通过LocaleResolver对象完成的。


当请求传入时,DispatcherServlet会查找区域设置解析程序,如果找到了,它会尝试使用它来设置区域设置。通过使用RequestContext.getLocale()方法,可以检索由区域设置解析程序解析的区域设置。



【1】基础介绍

① 什么是国际化


  • 在页面上能够根据浏览器语言设置的情况对文本(不是内容), 时间, 数值进行本地化处理
  • 可以在 bean 中获取国际化资源文件 Locale 对应的消息
  • 可以通过超链接切换 Locale, 而不再依赖于浏览器的语言设置情况

如何实现?


  • 使用 JSTL 的 fmt 标签
  • 在 bean 中注入 ResourceBundleMessageSource 的示例, 使用其对应的 getMessage 方法即可
  • 配置 LocalResolverLocaleChangeInterceptor


② fmt标签

页面使用标签如下所示(记得引入fmt标签):

/*设置依赖的资源化文件baseName--i18n*/
<fmt:bundle basename="i18n">
   <fmt:message key="date"></fmt:message>: 
   <fmt:formatDate value="${date }"/>,
   <fmt:message key="salary"></fmt:message>:
   <fmt:formatNumber value="${salary }"></fmt:formatNumber>
</fmt:bundle>
    ...


③ 注入bean

springMVC.xml配置ResourceBundleMessageSource

<!-- 配置国际化资源文件  解析i18n.properties-->
<bean id="messageSource"
  class="org.springframework.context.support.ResourceBundleMessageSource">
  <property name="basename" value="i18n"></property>
</bean>


配置 LocalResolver 和 LocaleChangeInterceptor

<!-- 配置 SessionLocalResolver 作用于切换请求连接时,显示不同的语言风格 ;
可使i18n属性其作为对象存储在session-->
<bean id="localeResolver"
  class="org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>
<mvc:interceptors>
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>

其工作原理如下图所示:


通过将LocaleChangeInterceptor添加到某个HandlerMapping实例中,可以启用区域设置更改。它检测请求中的一个参数并相应地更改区域设置(在dispatcher的应用程序上下文中调用LocaleResolver上的setLocale方法)。下一个示例显示,对包含名为siteLanguage的参数的所有*.view资源的调用现在会更改区域设置。例如,请求URL为https://www.sf.net/home.view?siteLanguage=nl,将站点语言更改为荷兰语。以下示例显示了如何拦截区域设置:

<bean id="localeChangeInterceptor"
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
    <property name="paramName" value="siteLanguage"/>
</bean>
<bean id="localeResolver"
        class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>
<bean id="urlMapping"
        class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="localeChangeInterceptor"/>
        </list>
    </property>
    <property name="mappings">
        <value>/**/*.view=someController</value>
    </property>
</bean>

配置

<!-- mvc:view-controller可使其直接访问路径 -->  
<mvc:view-controller path="/i18n" view-name="i18n"/>
<mvc:view-controller path="/i18n2" view-name="i18n2"/>


④ 测试实例

页面测试代码

三个i18n.properties,不再说明

<fmt:message key="i18n.user"></fmt:message>
<a href="i18n2">I18N2 PAGE</a>
<!--通过url,切换Local-->
<a href="i18n?locale=zh_CH">中文</a>
<a href="i18n?locale=en_US">英文</a>

后台测试代码

@Autowired
private ResourceBundleMessageSource messageSource;
@RequestMapping("/i18n")
public String testI18n(Locale locale){
  //使用messageSource 获取资源国际化文件中key在locale下的值
  String val = messageSource.getMessage("i18n.user", null, locale);
  System.out.println(val); 
  return "i18n";
}

【2】资源国际化实例

① 实现类配置

SpringMVC进行资源国际化主要是通过ResourceBundleMessageSource实现的,xml如下配置:

<bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="i18n"></property>  
</bean>


② 国际化资源文件

资源文件i18n.properties

i18n.username=Username
i18n.password=Password

i18n_zh_CN.properties:

i18n.username=\u7528\u6237\u540D(用户名)
i18n.password=\u5BC6\u7801(密码)


i18n_en_US.properties:

i18n.username=Username
i18n.password=Password

③ 测试示例

测试页面

<!-- 加载的为i18n_zh_CN.properties 与语言无关  -->
<fmt:bundle basename="i18n_zh_CN" prefix="i18n.">
  <fmt:message key="username"></fmt:message>
</fmt:bundle>
<!--  资源国际化 --> 
<br><br>
<fmt:message key="i18n.username"></fmt:message>
<br><br>
<fmt:message key="i18n.password" ></fmt:message>
<br><br>

result:当语言为en时,将为英文;当语言为zh时,将为中文。

注意:以下无论语言为何,均显示用户名-加载的为i18n_zh_CN.properties 与语言无关

<fmt:bundle basename="i18n_zh_CN" prefix="i18n.">
  <fmt:message key="username"></fmt:message>
</fmt:bundle>


点击查看Java资源国际化处理:Java资源国际化


目录
相关文章
|
Java
SpringMVC-国际化
SpringMVC-国际化
57 0
|
Java Spring
springmvc-国际化&中英文切换&文件上传&下载
springmvc-国际化&中英文切换&文件上传&下载
|
编解码 前端开发 Java
springMVC--数据验证以及国际化
springMVC--数据验证以及国际化
123 0
|
前端开发 Java 应用服务中间件
Spring MVC-08循序渐进之国际化(基于Session-SessionLocaleResolver)
Spring MVC-08循序渐进之国际化(基于Session-SessionLocaleResolver)
65 0
|
前端开发 IDE Java
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
Spring MVC-08循序渐进之国际化(AcceptHeaderLocaleResolver)
134 0
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)下
SpringMVC的数据验证和JSR 303国际化显示(十一)下
371 0
SpringMVC的数据验证和JSR 303国际化显示(十一)下
|
前端开发 Java 数据库连接
SpringMVC的数据验证和JSR 303国际化显示(十一)中
SpringMVC的数据验证和JSR 303国际化显示(十一)中
213 0
SpringMVC的数据验证和JSR 303国际化显示(十一)中
|
前端开发 JavaScript Java
SpringMVC的数据验证和JSR 303国际化显示(十一)上
SpringMVC的数据验证和JSR 303国际化显示(十一)上
218 0
SpringMVC的数据验证和JSR 303国际化显示(十一)上
|
存储 前端开发
SpringMVC的国际化操作(十)下
SpringMVC的国际化操作(十)下
250 0
SpringMVC的国际化操作(十)下
|
前端开发 Java Spring
SpringMVC的国际化操作(十)上
SpringMVC的国际化操作(十)上
293 0
SpringMVC的国际化操作(十)上