SpringMVC中资源国际化使用实践

本文介绍SpringMVC框架中的国际化实现方式,包括通过配置LocaleResolver和LocaleChangeInterceptor动态改变本地化设置的方法,以及使用JSTL fmt标签和ResourceBundleMessageSource实现资源文件的国际化。

默认情况下,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可使其直接访问路径 -->  
<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资源国际化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值