1、I18N---国际化(Internationalization):一个Web应用程序在运行时能够根据客户端请求所来自的国家和语言显示不同的用户界面。这样 ,当需要在应用程序中添加对一种新的语言的支持时,无需修改应用程序的代码。
2、Locale
对象表示了特定的地理、政治和文化地区,该类在java.util.*下
static Locale | getDefault() 获得此 Java 虚拟机实例的当前默认语言环境值。 |
String | getCountry() 返回此语言环境的国家/地区代码,将为空字符串或大写的 ISO 3166 两字母代码。 |
|
如下:
Locale defaultLocale=Locale.getDefault();
System.out.println("default country="+defaultLocale.getCountry());
System.out.println("default language="+defaultLocale.getLanguage());
结果为:
default country=CN
default language=zh
如何支持国际化:需要编写配置文件
(1)命名规则:baseName+Locale
现在有个配置文件test.properties
key1=你好
key2=再见
接着将此文件批量转化为unicode编码:步骤如下~~
(1)打开dos窗口,进入test.properties所在的目录
(2)然后输入native2ascii.exe test.properties MessagesBuddle_zh_CN.properties 这样就批量生成了unicode编码,结果如下:
key1=\u4f60\u597d
key2=\u518d\u89c1
(3)通过如下代码获取:
Locale defaultLocale=Locale.getDefault();
ResourceBundle rb= ResourceBundle.getBundle("MessagesBundle",defaultLocale);
System.out.println(rb.getString("key1"));
System.out.println(rb.getString("key2"));
ResourceBundle:资源包包含特定于语言环境的对象。当程序需要一个特定于语言环境的资源时(如 String
),程序可以从适合当前用户语言环境的资源包中加载它。使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。
MessagesBuddle:缺省的文件。
|
|
这样以来得到的结果就不会是乱码了。
结果为:
你好
再见
自己构造一个Locale
Locale(String language, String country)
根据语言和国家/地区构造一个语言环境。
因此可以根据这个构造Locale
如下:
Locale currentLocale=new Locale("en","US");
ResourceBundle rb= ResourceBundle.getBundle("MessagesBundle",currentLocale);
System.out.println(rb.getString("key1"));
System.out.println(rb.getString("key2"));
得到的结果为:
hello
goodbye
因此设置
Locale currentLocale=new Locale("语言","国家");就可以得到不同的语言结果。
总结:
(1)缺省的Locale是由操作系统决定的;
(2)Locale由语言和国家代码构成;
(3)国际化资源文件是由baseName+Locale构成的,其中baseName为任意合法的字符串,如MessagesBundle_zh_CN.properties;
(4)中文--->unicode命令:native2ascii 源文件 目标文件 【批量】 当然可以单个转换。
Java支持I18N的编程步骤如下:
(1)创建properties文件,如有需要,用native2ascii转换
(2)创建Locale对象(在java.util*包里)
(3)创建ResourceBundle对象
*该对象用于分离跟本地相关的数据
**如果找不到对应的属性文件,使用默认的属性文件
***
static ResourceBundle | getBundle(String baseName, Locale locale) 使用指定的基本名称、语言环境和调用者的类加载器获取资源包 |
第一次参数表示从哪个资源文件中获取数据;第二个参数是Locale对象,表示要选择哪个资源属性文件。
(4)从ResourceBundle对象中获取数据。通过getXXX()方法。