Java Web 学习(7) —— Spring MVC 之国际化

时间:2023-03-10 02:05:10
Java Web 学习(7) —— Spring MVC 之国际化

Spring MVC 之国际化

i18n 与 l10n

internationalization:国际化,以 i 开头,以 n 结尾,中间 18 个字母,简称 i18n。

localization:本地化,以 l 开头,以 n 结尾,中间 10 个字母,简称 l10n。

语言区域

java.util.Local表示一个语言区域。有 3 个元素:String language(语言), String country(国家), String variant(方言)。

  • language:ISO 语言代号,如:zh汉语,en英语,es西班牙语。
  • country:ISO 国家代号,如:CN中国,CA加拿大,US美国。
  • variant:操作系统,浏览器以及其他软件供应商可用这个代号来提供附加的功能或者达到语言和国家代号所不能实现的定制,两个variant间以下划线分开,且重要的放在最前。
public Locale(String language, String country, String variant) {
// ...
} public Locale(String language, String country) {
this(language, country, "");
} public Locale(String language) {
this(language, "", "");
}

Spring MVC 国际化

1. 将文本组件隔离成属性文件

Properties 继承 Hashtable,表示持久的属性集。

英语属性文件:

greetings = Hello
farewell = Goodbye

汉语属性文件:

greetings = \u4f60\u597d
farewell = \u518d\u89c1

命名方式为:基准名_语言代码_国家代码,即:message_en_US.properties,message_zh_CN.propertie。默认文件为:message.properties

2. 选择和读取正确的属性文件

Java 中使用ResourceBundle解决国际化问题,ResourceBundle是一个抽象类,通过调用静态方法来获得实例。

public static ResourceBundle getBundle(java. lang. String baseName)
public static ResourceBundle getBundle(java. lang. String baseName, Locale locale)

Spring MVC 中,不直接使用ResourceBundle,而是配置messageSource bean

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="cacheSeconds" value="10"></property>
<property name="basenames">
<list>
<!-- 属性文件位置 -->
<value>/WEB-INF/resources/message</value>
</list>
</property>
</bean>

以上配置以ReloadableResourceBundleMessageSource作为实现,也可以使用ResourceBundleMessageSource

区别:

  • 使用 ResourceBundleMessageSource,修改属性文件后,必须先重启 JVM。而 ReloadableResourceBundleMessageSource 可通过配置cacheSeconds重新加载。
  • 使用 ReloadableResourceBundleMessageSource,是在应用程序目录下搜索这些属性文件。而 ResourceBundleMessageSource,属性文件则必须放在类路径下,即 WEB-INF/class目录下。

选择语言区域

获取语言区域的方式:

  • 读取浏览器 accept-language 标题值
  • 读取 session
  • 读取 cookie

相应地,Spring MVC 语言区域解析器 bean 的实现:

  • AcceptHeaderLocaleResolver
  • SessionLocaleResolver
  • CookieLocaleResolver
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver"></bean>

显示页面

通过 Spring 的 message 标签显示本地化信息。

<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<spring:message code="greetings"/>

注意:如显示中文,JSP页面编码和属性文件编码应为"UTF-8"

参考资料:《Spring MVC 学习指南》 Paul Deck 著