说起国际化,第一次接触的时候感到这个功能很神奇,起初很天真的以为是什么国际通讯之类的功能,其实不是的。。。这个功能用中文叫国际化,英文里就有一个很高大上的称呼,叫i18n,其实i18n就是internationalization的偷懒写法,听起来很有逼格。除了i18n,L10n(localization),g11n(globalization),还有m17n(multilingualization),这些解决方案都是为了能让站点的页面能够适应多国语言,当然,如果有必要的话。
其实多语言问题,Java本身就提供了解决方案,util工具包中ResourceBundle就可以解决该问题,ResourceBundle的说明如下写道
......
This allows you to write programs that can:
- be easily localized, or translated, into different languages
- handle multiple locales at once
- be easily modified later to support even more locales
...... 显然,为了能使用国家化,我们需要为每一个需要使用的语言单独配置他们的语言内容。分别新建中文和英文的语言配置文件置于src下
Message_zh.properties
1 username=\u7528\u6237\u540D(用户名)
2 password=\u5BC6\u7801(密码)
Message_en.properties
1 username=username
2 password=password
由于properties只支持iso-8859格式的编码,所以在输入中文的时候会有些问题,只是Eclipse自带的properties编辑器可以进行可视化的文本输入,不需要关注编码。另外我们可以通过Java自带的转码工具native2ascii进行转码。
测试类如下,
getBundle方法接收两个参数,第一个是BaseName,可以理解为资源的基础名,第二个是语言码,中文是zh,英文是en等等,测试类运行完毕之后会给出英文资源文件中username所对应的值,同理Locale设置为中文则输出中文的值。所以资源文件我们以Message_en.properties这种格式来命名,其中en之后还可以添加下划线跟第三个值区域码,但是一般可以省略。
1 package demo.i18n;
2
3 import java.util.Locale;
4 import java.util.ResourceBundle;
5
6 public class I18nTest {
7
8 public static void main(String[] args) {
9 ResourceBundle rb = ResourceBundle.getBundle("Message", Locale.ENGLISH);
10 System.out.println(rb.getString("username"));
11 }
12
13 }
14
基于上面的内容,struts2使用它们配置全局国际化资源,在struts.xml中添加国家化的配置,其中value就是资源的基础名
1 <constant name="struts.custom.i18n.resources" value="Message" />
之后,在页面上使用struts2的标签进行对应语言内容的显示,当然,显示哪种语言需要显式的将语言码作为参数传入,请求地址需要写作/XXX.action?request_locale=en
1 全局国际化<br/>
2 <s:text name="username"/><br/>
除了全局国际化的配置,struts2还提供了包范围和action范围的国际化,其中包范围的国际化,需要将资源文件命名为“package_语言码.properties”的形式,然后置于需要的包下,struts2会优先取得较小范围的国际化资源文件,同时定义全局国际化资源和包国际化资源,那么包范围的资源会优先生效。至于action范围的国际化,因为国际化在日常的开发中本来用的就不是很多,就算真的碰到需要双语开发的情况,或许也是做两套页面,或者直接做两套网站,除非是那种跨国性质的“因特噗啦一吇”,否则不要说struts2的全局国际化的使用,针对包范围和action范围的国际化,都是少有问津。