第十一章:国际化程序实现原理

国际化程序实现原理

  所谓的国际化程序指的是同一个程序代码可以根据不同的国家实现不同的语言描述,但是程序处理的核心业务是相同的(任何的一个项目中的重要部分就是它的处理业务)。

  现在假设有一款世界都认可的企业管理平台,那么这个企业的老板决定将这个产品推广到全世界各个大型上市公司,于是这些公司可能来自于中国、美国、德国,那么在这样的情况下,首先要考虑的问题是什么呢?

  通过分析后可以发现,如果想要实现国际化程序开发,那么要解决的问题就在于以下两点:

1、如何可以定义保存文字的信息

2、如何可以根据不同的区域语言的编码读取指定的资源信息

程序本身是一样的,只是文字不一样,仅此而已。

Locale类

  通过分析,如果要想实现国际化,那么首先需要解决的就是不同的国家用户的区域和语言的编码问题,而在java.util包中提供有专门描述区域和语言编码的类:Locale类(since 1.1),而后主要可以使用Locale类中的两个构造方法进行实例化。

  此时需要的是国家和语言的代码,而中文的代码:zh_CN、美国英语的代码:en_US,对于这些区域和语言的编码最简单的获得方式就是通过IE浏览器。

  如果说现在要想自动获得当前的运行环境,那么现在就可以利用Locale类本身默认的方式进行实例化 

   在实际的开发过程之中,很多人可能并不关心国家和语言的编码,所以为了简化开发,Locale也将世界上一些比较著名的国家的编码设置为了常量。

 

  使用常量的优势在于可以避免一些区域编码的繁琐(不用IE查了).

ResourceBundle读取资料源文件

  现在已经准备好了资源文件,那么随后就需要进行资源文件的读取操作了,而读取资源文件主要依靠的是java.util.ResourceBundle类完成,此类定义如下。

  ResourceBundle是一个抽象类,如果说现在要想进行此类对象的实例化可以直接利用该类中提供的一个static方法完成

  baseName:描述的是资源文件的名称,但是没有后缀(cn.mldn.message.Messages);

 根据key读取资源内容:

 

  如果资源没有放在包里面,则直接编写资源名称即可。 

  在进行资源读取的时候数据的key一定要存在,如果不存在则会出现如下异常信息(第一个异常是的)

java.util.MissingResourceException:Can't find resource for bundle java.util.PropertyResourceBundle,key infos

(错误资源异常,无法发现绑定的资源key,这个的异常记一下MissResourceException)

实现国际化程序开发

  现在国际化程序的实现前期准备已经全部完成了,也就是说依靠资源文件、Locale、ResourceBundle类就可以实现国际化的处理操作,那么下面来进行国际化程序的实现(核心关键:读取资源信息)。

  现在加上没有默认的区域的资源文件,一共定义了三个资源:

 

3、通过程序进行指定区域的资源信息加载

  此时在进行ResourceBundle类读取资源的时候并没有设置一个明确的Locale对象,但是"Message_zh_CN"文件起作用了,因为这个方法里面默认加载的(下图看getBundle的源码)

4、如果现在有需要也可以修改当前的Locale环境,则可以使用ResourceBundle类中的如下方法

 

  原来可以在进行处理的时候可以根据不同的语言环境实现指定区域的内容的接受

  如果现在有指定区域资源文件存在的时候,那么没有设置区域的资源文件的信息将不会被读取。

比如上面代码中Locale loc = Locale.GERMAN;获得德国的,而现在没有德国的,就读不到,读默认的本地环境。

资源读取顺序:读取指定区域的资源文件 > 默认的本地资源 > 公共的资源(没有区域设置的)

格式化文本显示(消息格式化)

  如果说现在某一位用户登陆成功了,那么一般都会显示这样的信息“Xxx,欢迎您的光临!”,也就是说这个时候会显示用户名,那么此时如果这些内容保存在了资源文件里面,则就需要通过占位符来进行描述,同时对于读取出来的数据也需要进行消息格式化的处理。 

  如有需要则可以继续添加“{1}”、“{2}”之类的内容,这样就相当分别在两个资源文件里添加了两个占位信息

  此时如果要进行资源读取则会将占位符的信息一起读取出来,所以此时就需要利用MessaegeFormat类进行格式化处理。(打开java.text.MessageFormat)

  现在该怎么用MessageFormat的格式化的操作处理呢?打开MessaegFormat的方法。在MessaegFormat类中提供有一个格式化文本的方法:

范例:格式化文本实现国际化

 

·  如果在日后开发的过程之中见到资源文件里面有“{0}”、“{1}”的结果表示的都是占位符,该信息一定都要进行格式化处理。这就是国际化的程序实现。

原文地址:https://www.cnblogs.com/djlindex/p/11253291.html