1、第六节,国际化,韩 冰 cris_,2,本章学习任务,国际化概述 Java内置的国际化自学了解 Struts2中的国际化入门 资源文件读取顺序 Struts2访问国际化信息的不同方式 指定语言信息的不同方式,2018/11/20,.概述,国际化(Internationalization),通俗点讲就是让软件实现对多种语言的支持,可以通过简单的设置让软件支持的语言从一种切换到另一种。当然,最直观的就是界面显示了,比如一个实现了国际化的软件,可以很容易的从英文界面切换成中文界面。在日常工作中也常见到国际化的软件,比如Eclipse就是多语言的,只要安装了相应的语言包,在启动的时候指定语言参数就可以
2、实现软件界面的快速转换。 在设计多语言实现的时候,要注意两点:不能给软件开发带来过多的额外负担。在改变语言或者添加一种语言的时候,不能修改已经写好的软件。 Struts2作为一款成熟的web框架,自然也支持国际化,使用Struts2的时候,只要把对应的资源文件放在指定的地方,不用修改程序的主体,就可以对应新的语言要求。具体如何实现,后面再详细描述,先来看看Java内置的国际化。,2018/11/20,.Java内置的国际化,Struts2的国际化也不是无本之木,它依赖于Java内置的国际化机制,只是在Java内置的国际化机制的基础上增加了跟Struts2其他组件的融合,使得其他组件也可以非常方
3、便的使用国际化。,2018/11/20,.Java内置的国际化-准备国际化信息文件,Java内置的国际化,以java.util.ResourceBundle和java.util.Locale两个类为中心。其中, java.util.Locale负责选择合适的语言,而java.util.ResourceBundle负责根据注入的java.util.Locale对象来选择国际化信息的来源,返回国际化信息。如果我们的软件支持中文和英文两种语言,而以中文作为默认的语言。则会出现三种语言,默认的语言(中文)、中文和英文,当然,其实只有两种语言中文和英文。但是,以中文为默认的语言是非常必要的。有时候,软件
4、需要应对的语言不一定只有中文和英文;如果法国的朋友想要使用软件呢?由于不存在法文的信息,这时候只能返回默认的语言,那就是中文了。在这种情况下准备国际化资源文件,一般准备三个文件,分别是默认语言、中文与英文的文件。每个文件都以properties为扩展名,内容以key-value对的形式存在,其中key是如何引用这条信息,而value就是这条信息真正要显示的内容了。综上所述,可以准备如下三个文件作为国际化信息的文件。,2018/11/20,.Java内置的国际化-准备国际化信息文件,(1)默认语言文件:message.properties注意:在这个文件中,本应该在“=”后面写上中文,但是,我们
5、没有这样做,这是因为Java内置的国际化在处理中文的时候还需要一步特殊处理,这在后面有专门的章节处理,因此这里就没有使用中文了。,2018/11/20,.Java内置的国际化-准备国际化信息文件,(2)中文语言文件:message_zh_CN.properties注意:故意在两行之前都加了一个#,这在properties文件中代表注释的意思,也就是说这个message_zh_CN.properties实际上是空的。,2018/11/20,.Java内置的国际化-准备国际化信息文件,(3)英文语言文件:message_en_US.properties先不去考虑客户端怎么写,观察一下这三个文件的命
6、名。它们拥有共通的前缀message,代表了它们是同一组国际化信息的不同语言;它们各自的后缀代表了自己的语言,其中没有后缀(message.properties)的文件,代表这是默认语言文件。,2018/11/20,.Java内置的国际化-准备国际化信息文件,2:使用ResouceBundler和Locale选择多语言信息将上面的三个文件拷贝到工程的src目录下备用。然后就可以在Java程序中引用这些多语言信息了。在引用多语言信息的时候,要做三件事情:引用哪种语言。引用哪组多语言文件。引用这种语言的这组文件里的哪条信息。,2018/11/20,.Java内置的国际化-准备国际化信息文件,【测试
7、代码看备注】Locale类里预置了许多语种,上面代码中引用的Locale.SIMPLIFIED_CHINESE对应zh_CN,Locale.US对应en_US,Locale.FRANCE对应fr_FR;也就确定了前面所说的文件名后缀。ResouceBundle.getBundle方法传入的第一个参数就是要引用哪组文件,也就确定了前面所说的文件名前缀。由前缀和后缀共同作用取得的ResourceBundle对象就代表了一个文件中的所有多语言信息,它的getString方法传入的参数就是前面所说的key,而且返回值就是实际需要的value。,2018/11/20,.Java内置的国际化-准备国际化信
8、息文件,【对中文的支持】Locale类里预置了许多语种,上面代码中引用的Locale.SIMPLIFIED_CHINESE对应zh_CN,Locale.US对应en_US,Locale.FRANCE对应fr_FR;也就确定了前面所说的文件名后缀。ResouceBundle.getBundle方法传入的第一个参数就是要引用哪组文件,也就确定了前面所说的文件名前缀。由前缀和后缀共同作用取得的ResourceBundle对象就代表了一个文件中的所有多语言信息,它的getString方法传入的参数就是前面所说的key,而且返回值就是实际需要的value。,2018/11/20,. Struts2中的国
9、际化入门,引用国际化信息资源文件默认语言文件:message.properties中文语言文件:message_zh_CN.properties英文语言文件:message_en_US.properties,2018/11/20,. Struts2中的国际化入门-在JSP中访问国际化信息,在jsp中,可以直接选用Struts2的text标签来访问国际化信息,其中text标签的name属性就是要引用哪个key。示例如下:,2018/11/20,.Java内置的国际化-指定浏览器使用的语种,首先,要去掉stuts.xml中的对中文支持所设置的常量,以防止对运行结果的干扰。注意:这一点非常重要,否则
10、你将观察不到语言的变化。然后,可以在浏览器中设置选用的语言。以笔者的浏览器为例,打开浏览器的属性页,如下图所示:,2018/11/20,2018/11/20,2018/11/20,2018/11/20,2018/11/20,. Struts2访问国际化信息的不同方式,只保留全局级国际化信息资源文件。并在message.properteis中增加一个带有参数的国际化信息。,2018/11/20,. Struts2访问国际化信息的不同方式,Struts2的常量设置还可以使用Struts2的常量设置来覆盖浏览器的语言设置。比如前面的示例,在struts.xml中加上struts.locale这个常量
11、,值为需要使用的语言,示例如下:这时候,会发现无论怎么修改浏览器的语言设置,Struts2都会去访问中文信息了。,2018/11/20,. Struts2访问国际化信息的不同方式-由用户选择语言,以上的两种设置,还可能满足不了日常需求:常量设置太死板,加上了常量设置,就不方便访问其他语言的信息了。浏览器语言设置太麻烦。用户想修改访问的语言时,必须到浏览器的属性对话框去一顿勾选。对于一般用户来讲,这太繁琐。幸好Struts2提供了最灵活的、也是级别最高的方式,那就是由用户选择语言。用户只要在提交请求的时候加上request_locale这个参数,并提供对应的值就可以自由选择语言了。这得力于Str
12、uts2的i18n内建拦截器,defaultStack拦截器栈引用了i18n拦截器,因此,能很方便的由用户来选择语言。i18n拦截器在Action运行之前会检查请求中是否包含了一个叫做“request_locale”的参数,如果存在此参数,则会用它的值建立一个Locale对象,并用这个Locale对象去覆盖Struts2的常量设置和浏览器的语言设置。除此之外,i18n拦截器还会把这个Locale对象放到名为WW_TRANS_I18N_LOCALE的Session属性中去,而这个属性也会覆盖Struts2的常量设置和浏览器的语言设置。因此,只需要传入一次request_locale参数,sess
13、ion就会记住用户的选择,整个网站就会都变成用户选择的语言了。来示例一下,第一次访问结果页面的时候,输出相关的session属性,如下:,2018/11/20,. Struts2访问国际化信息的不同方式-由用户选择语言,由于当前的struts.xml设置常量struts.locale的值为zh_CN, 所以,第一次访问将会使用常量设置的中文, 而且session中也没有WW_TRANS_I18N_LOCALE这个属性。运行结果如下:,2018/11/20,2018/11/20,三种方式的覆盖关系,对于这三种指定语言种类的方式,其优先级为:用户指定参数 struts.xml中配置常量 浏览器设置
14、而且,用户参数指定的方式,只需要设置一次就可以了,在整个session生命周期内,都不用再次设置。,2018/11/20,Struts 2 国际化的运行机制,Struts 2中,通过 ActionContext.getContext().setLocale(Locale arg)设置用户的默认语言,不过这种方式完全是一种手动方式,而且需要编程实现。 为了简化设置用户默认语言环境, Struts 2 提供了一个名为 i18n 的拦截器 (Interceptor ),并将其注册在默认的拦截器栈中(defaultStack ) 。,2018/11/20,Struts 2 国际化的运行机制,2018/11/20,创建下拉列表框、选择程序语言,实现用户自行选择程序语言功能,只需提供一个下拉框列表,并且当用户选择下拉框中某一项时,系统将该下拉项的值作为 request _locale 参数提交给 Struts 2 .,学习是不断的提问和总结,请对本章节中所遇到的问题,进行提问和讨论,让大家一起进步!,