(笔记)Spring MVC学习指南_国际化

国际化是开发支持多语言和数据格式的应用程序的技术,无需重写编程逻辑。
本地化是将国际化应用程序改成支持特定语言区域(locale)的技术。语言区域是指一个特定的地理、政治或者文化区域。一个要考虑语言区域的操作,就称作区分语言区域的操作。例如,显示日期就是一个区分语言区域的操作,因为日期必须以用户所在的国家或者地区使用的格式显示。2014年11月15日,在美国显示为11/15/2014,但在澳大利亚则显示为15/11/2014。
国际化应用程序的具体方式取决于有多少静态数据需要以不同的语言显示出来。这里有两种方法:
(1)如果大量数据是静态的,就要针对每一个语言区域单独创建一个资源版本。这种方法一般适用于带有大量静态HTML页面的Web应用程序。
(2)如果需要国际化的静态数据量有限,就可以将文本元素,如元件标签和错误消息隔离成为文本文件。每个文本文件中都保存着一个语言区域的所有文本元素译文。随后,应用程序会自动获取每一个元素。每个文本元素无需重新编译应用程序,便可轻松地进行编译。
1.语言区域
java.util.Locale类表示一个语言区域。一个Locale对象包含3个主要元件:language、country和variant。Language无疑是最重要的部分,但是,语言本身有时并不足以区分一个语言区域。参数variant是一个特定于供应商或者特定于浏览器的代号。例如,用WIN表示Windows,用MAC表示Macintosh,用POSIX表示POSIX。两个variant之间用一个下划线隔开,并将最重要的部分放在最前面。
构造Locale对象时,要使用Locale类的其中一个构造器:
public Locale(java.lang.String language)
public Locale(java.lang.String language, java.lang.String country)
public Locale(java.lang.String language, java.lang.String country, java.lang.String variant)
语言代号是一个有效的ISO语言码(ISO 639),参数country是一个有效的ISO国家码,由两个字母组成,ISO 3166中指定为大写字母。
Locale locale = new Locale(“en”, “CA”);
此外,Locale类提供了static final域,用来返回特定国家或语言的语言区域,如CANADA_FRENCH,CHINA,CHINESE,ENGLISH、FRANCE、FRENCH,UK,US等。
因此,也可以通过调用其static域来构造Locale对象。
Locale locale = Locale.CANADA_FRENCH;
此外,静态的getDefault方法会返回用户计算机的语言区域。
Locale locale = Locale.getDefault();
2.国际化Spring MVC应用程序
国际化和本地化应用程序时,需要具备以下条件:
-将文本元件隔离成属性文件
-选择和读取正确的属性文件
(1)将文本元件隔离成属性文件
被国际化的应用程序是将每一个语言区域的文本元素都单独保存在一个独立的属性文件中。每个文件中都包含key/value对,并且每个key都唯一表示一个特定语言区域的对象。key始终是字符串,value可以是字符串,也可以是其他任意类型的对象。
英文版的属性文件:
greetings = Hello
farewell = Goodbye
德文版的属性文件:
greetings = Hallo
farewell = Abschiedsgruß
汉语版的属性文件:
greetings = 你好
farewell = 再见
现在,要学习java.util.ResourceBundle类。它能使你轻松地选择和读取特定于用户语言区域的属性,以及查找值。ResourceBundle是一个抽象类,但它提供了静态的getBundle方法,返回一个具体子类的实例。
public static ResourceBundle getBundle(java.lang.String baseName)
public static ResourceBundle getBundle(java.lang.String baseName, Locale locale)
ResourceBundle有一个基准名,它可以是任意名称。但是,为了让ResourceBundle正确地选择属性文件,这个文件名中最好必须包含基准名ResourceBundle,后面再接下划线、语言码,还可以选择再加一条下划线和国家码。basename_languageCode_countryCode
MyResources_en_US.properties
MyResources_de_DE.properties
MyResources_zh_CN.properties
(2)选择和读取正确的属性文件
ResourceBundle rb = ResourceBundle.getBundle(“MyResources”, Locale.US);
这样会加载ResourceBundle在相应属性文件中的值。
如果没有找到合适的属性文件,ResourceBundle对象就会返回到默认的属性文件。默认属性文件的名称为基准名加一个扩展名properties。在这个例子中,默认文件就是MyResources.properties。如果没有找到默认文件,则将抛出java.util.MissingResourceException。
随后,读取值,利用ResourceBundle类的getString方法传入一个key。
public java.lang.String getString(java.lang.String key)
如果没有找到指定key入口,将会抛出java.util.MissingResourceException。
在Spring MVC中,不直接使用ResourceBundle,而是利用messageSource bean告诉Spring MVC要将属性文件保存在哪里。

    <bean id="messageSource"        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>/WEB-INF/resource/messages</value>
                <value>/WEB-INF/resource/labels</value>
            </list>
        </property>
    </bean>

ResourceBundleMessageSource,它是不能重新加载的。这意味着,如果在任意属性文件中修改了某一个属性key或者value,并且正在使用ResourceBundleMessageSource,那么要使修改生效,就必须先重启JVM。另一方面,也可以将ReloadableResourceBundleMessageSource设为可重新加载。
这两个实现之间的另一个区别是:使用ReloadResourceBundleMessageSource时,是在应用程序目录下搜索这些属性文件。而使用ResourceBundleMessageSource时,属性文件则必须放在类路径下,即WEB-INF/class目录下。
3.告诉Spring MVC使用哪个语言区域
为用户选择语言区域时,最常用的方法或许是通过读取用户浏览器的accept-language标题值。
选择语言区域的其他方法还包括读取某个session属性或者cookie。
在Spring MVC中选择语言区域,可以使用语言区域解析器bean。它有几个实现,包括:AcceptHeaderLocaleResolver、SessionLocaleResolver、CookieLocaleResolver。
所有这些实现都是org.springframework.web.servlet.i18n包的组成部分。

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

4.使用message标签
在Spring MVC中显示本地化消息的最容易方法是使用Spring的message标签。为了使用这个标签,要在使用该标签的所有JSP页面最前声明这个taglib指令。

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

message标签的属性

属性描述
arguments该标签的参数写成一个有界字符串、一个对象数组或者单个对象
argumentSeparator用来分隔该标签参数的字符
code获取消息的key
htmlEscape接受True或者False,表示被渲染文本是否应该进行HTML转义
javaScriptEscape接受True或者False,表示被渲染文本是否应该进行javaScript转义
messageMessageSourceResolvable参数
scope保存var属性中定义的变量的范围
text如果code属性不存在,或者指定码无法获取消息时,所显示的默认文本
var用于保存消息的有界变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值