Struts1之国际化(一)

软件的国际化问题又叫i18n问题,先来看两个案例

案例一:Google

首先给大家看下Google的主页面


大家都知道Google的页面可以在中文简体、中文繁体、英文和其它语言之间切换的。那么这种语言间的切换是怎么实现的呢?是不是为每种语言都开发了一套google搜索引擎呢?

当然不是了,Google支持那么多种语言,要是为每种语言都编写一套代码,那是相当大的工作量,而且也不好维护。我们都知道编程是一种艺术,是需要动脑子的,Google有那么多的天才工程师,他们是不可能用这么笨的办法的。

案例二:软件汉化
再举个例子,大家都知道软件的汉化吧,我们从官网下载的某个软件可能不支持简体中文,但是大神们会为我们提供软假的汉化版好汉化补丁, 这样界面上的英文就会全部被替换为中文。

思考一个问题:软件的源代码我们是无法获得的,所以我们也无法通过修改代码来实现软件汉化。那么软件是怎样被汉化的呢?

通过以上案例,我们可以推测:支持多种语言的软件,它的UI上显示的文字都不是写在源代码里的。它一定是在代码外部,独立于二进制文件而单独存在的。


软件的国际化要解决那些问题呢?
总的来说就是要解决硬编码的问题,具体指:
  1. 页面字符串硬编码
  2. 异常消息的硬编码
  3. 提示信息的硬编码
提示:硬编码就是指将字符串全部写死在程序代码里边


那么怎样解决这些问题呢?

很简单,将软件中所有用于显示的字符串都放在外部的“资源文件”里边,每种语言都对应一个资源文件,让软件读取资源文件就可以了,中文版的软件读取中文的资源文件,英文版的软件读取英文的资源文件。


下面为大家介绍java是怎样实现国际化的。

java实现国际化很简单,需要“两个类和一套资源文件”

  • Locale类
该类内部封装了语言和对应的国家,如zh_CN,en_US等。拿到了此类的对象,就知道使用哪种语言的资源文件了

  • ResourceBundle类
该类根据资源文件的Basename和指定的Locale对象可以读取资源文件中的字符串

  • 一套资源文件(.properties)
资源文件简单易用,就是简单的纯文本文件,它由一系列的key=value对组成,如下所示:

中文的资源文件MessagesBundle_zh_CN.properties
k1=hello
k2=good bye

英文的资源文件MessagesBundle_en_US.properties
k1=你好
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();
这样,操作系统是什么语言,软件就使用什么语言显示

注意事项
  1. 资源文件的命名:Basename+Locale信息.properties;如上所示:Basename=MessagesBundle,英文资源文件的Locale="en_US",中文的是"zh_CN"
  2. 所有资源文件都必须使用相同的Basename,这样做的好处是:只需获取Locale信息就能确定使用哪个资源文件了
  3. 有一个不带Locale信息的资源文件,当指定的Locale信息不存在时,会使用该资源文件,如上面的MessagesBundle.properties.

Struts对国际化的支持依赖于java的国际化,后续文章会为大家介绍Struts对国际化的支持,敬请期待。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值