软件的国际化问题又叫i18n问题,先来看两个案例
案例一:Google
首先给大家看下Google的主页面
大家都知道Google的页面可以在中文简体、中文繁体、英文和其它语言之间切换的。那么这种语言间的切换是怎么实现的呢?是不是为每种语言都开发了一套google搜索引擎呢?
当然不是了,Google支持那么多种语言,要是为每种语言都编写一套代码,那是相当大的工作量,而且也不好维护。我们都知道编程是一种艺术,是需要动脑子的,Google有那么多的天才工程师,他们是不可能用这么笨的办法的。
案例二:软件汉化
再举个例子,大家都知道软件的汉化吧,我们从官网下载的某个软件可能不支持简体中文,但是大神们会为我们提供软假的汉化版好汉化补丁,
这样界面上的英文就会全部被替换为中文。
思考一个问题:软件的源代码我们是无法获得的,所以我们也无法通过修改代码来实现软件汉化。那么软件是怎样被汉化的呢?
通过以上案例,我们可以推测:支持多种语言的软件,它的UI上显示的文字都不是写在源代码里的。它一定是在代码外部,独立于二进制文件而单独存在的。
软件的国际化要解决那些问题呢?
总的来说就是要解决硬编码的问题,具体指:
- 页面字符串硬编码
- 异常消息的硬编码
- 提示信息的硬编码
提示:硬编码就是指将字符串全部写死在程序代码里边
。
那么怎样解决这些问题呢?
很简单,将软件中所有用于显示的字符串都放在外部的“资源文件”里边,每种语言都对应一个资源文件,让软件读取资源文件就可以了,中文版的软件读取中文的资源文件,英文版的软件读取英文的资源文件。
下面为大家介绍java是怎样实现国际化的。
java实现国际化很简单,需要“两个类和一套资源文件”
- Locale类
该类内部封装了语言和对应的国家,如zh_CN,en_US等。拿到了此类的对象,就知道使用哪种语言的资源文件了
- ResourceBundle类
该类根据资源文件的Basename和指定的Locale对象可以读取资源文件中的字符串
- 一套资源文件(.properties)
资源文件简单易用,就是简单的纯文本文件,它由一系列的key=value对组成,如下所示:
中文的资源文件MessagesBundle_zh_CN.propertiesk1=hellok2=good bye
英文的资源文件MessagesBundle_en_US.propertiesk1=你好k2=再见
上代码演示java对国际化的实现
资源文件
I18NExample类
public static void main(String[] args) {
//创建Locale对象
Locale locale=new Locale("zh","CN");
//创建ResourceBundle对象
ResourceBundle rb=ResourceBundle.getBundle("com.tgb.i18n.resources.MessagesBundle",locale);
//打印资源文件中的信息
System.out.println(rb.getString("k1"));
System.out.println(rb.getString("k2"));
}
执行结果
如果Locale指定的是英文"en_US"
//创建Locale对象
Locale locale=new Locale("en","US");
执行结果将会变为
如何根据操作系统的语言配置,自动识别语言类型呢
//创建Locale对象
Locale locale=Locale.getDefault();
这样,操作系统是什么语言,软件就使用什么语言显示
注意事项
- 资源文件的命名:Basename+Locale信息.properties;如上所示:Basename=MessagesBundle,英文资源文件的Locale="en_US",中文的是"zh_CN"
- 所有资源文件都必须使用相同的Basename,这样做的好处是:只需获取Locale信息就能确定使用哪个资源文件了
- 有一个不带Locale信息的资源文件,当指定的Locale信息不存在时,会使用该资源文件,如上面的MessagesBundle.properties.
Struts对国际化的支持依赖于java的国际化,后续文章会为大家介绍Struts对国际化的支持,敬请期待。