- 国际化的目的是根据用户语言环境的不同,向用户输出与之相应的页面。
Spring MVC的国际化主要有:
- JSP页面信息国际化;
- 错误消息国际化。
Java国际化的思想:
- 将程序中的信息放在资源文件中,程序根据支持的国家及语言环境,读取相应的资源文件。资源文件是key-value对,每个资源文件中的key是不变的,但value则随不同国家/语言变化。
- 在Java程序的国际化主要通过两个类来完成:
- java.util.Locale:用于提供本地信息,通常称它为语言环境。不同的语言,不同的国家和地区采用不同的Locale对象来表示。
- java.util.ResourceBundle:称为资源包,包含了特定于语言环境的资源对象。当程序需要一个特定于语言环境的资源时(如字符串资源),程序可以从适合当前用户语言环境的资源包中加载它。采用这种方式,可以编写独立于用户语言环境的程序代码,而与特定语言环境相关的信息则通过资源包来提供。
- 为了实现Java程序的国际化,必须事先提供程序所需要的资源文件。资源文件的内容是由很多key-value对组成,其中key是程序使用的部分,而value则是程序界面的显示。
- 资源文件的命名可以有如下3种形式:
- baseName.properties
- baseName_language.properties
- baseName_language_country.properties
- baseName是资源文件的基本名称,由用户自由定义。但是language和country就必须为Java所支持的语言和国家/地区代码。例如:
- 中国大陆: baseName_zh_CN.properties
- 美国: baseName_en_US.properties
- Java中的资源文件只支持ISO-8859-1编码格式字符,直接编写中文会出现乱码。可以使用Java命令native2ascii.exe解决资源文件的中文乱码问题。使用Eclipse编写资源属性文件,在保存资源文件时,Eclipse自动执行native2ascii.exe命令。因此,在Eclipse中资源文件不会出现中文乱码问题。
java.util.Locale类的常用构造方法如下:
public Locale(String language)public Locale(String language, String country)//其中language表示语言,取值是由小写的两个字母组成的语言代码。//country表示国家或地区,取值由大写的两个字母组成的国家或地区代码。//Java并不能支持所有国家和语言,如果需要获取Java所支持的语言和国家,//可以通过调用Locale类的getAvailableLocales方法获取,该方法返回一个Locale数组,//该数组里包含了Java所支持的语言和国家。
Spring MVC的国际化
Spring MVC的国际化建立在Java国际化的基础之上,Spring MVC框架的底层国际化与Java国际化一致。
Spring MVC将Java国际化的功能进行了封装和简化,开发者使用起来会更加简单快捷。
由15.1节中,可知国际化和本地化应用程序时,需要具备以下两个条件:
1、 将文本信息放到资源属性文件中。
2、 选择和读取正确位置的资源属性文件。
在Spring MVC中,不能直接使用ResourceBundle加载资源属性文件,而是利用bean(messageSource)告知Spring MVC框架要将资源属性文件放到哪里。
<bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><!-- <property name="basename" value="classpath:messages" /> --><property name="basename" value="/WEB-INF/resource/messages" /></bean>//“classpath:messages”指的是classpath路径下的//messages_zh_CN.properties文件和messages_en_US.properties文件。//也可以将国际化资源文件放在其他的路径下,如:/WEB-INF/resource。
- 在Spring MVC中,可以使用语言区域解析器bean选择语言区域。该bean有3个常见实现:AcceptHeaderLocaleResolver、SessionLocaleResolver以及CookieLocaleResolver。
—AcceptHeaderLocaleResolver:根据浏览器HttpHeader中的accept-language域判定(accept-language域中一般包含了当前操作系统的语言设定,可通过HttpServletRequest.getLocale方法获得此域的内容)。不支持改变Locale,即不能调用LocaleResolver接口的setLocale(HttpServletRequest request, HttpServletResponse response,Locale locale)方法设置Locale。
—SessionLocaleResolver:根据用户本次会话过程中的语言设定决定语言区域(如:用户进入首页时选择语言种类,则此次会话周期内统一使用该语言设定)。
—CookieLocaleResolver:根据Cookie判定用户的语言设定(Cookie中保存着用户前一次的语言设定参数)。
