[摘编]Java中的国际化(Internationalization)/本地化(Localization)

一、名词解释

国际化(Internationalization)是设计一个适用于多种语言和地区的应用程序的过程。适用于多种语言和地区的含义是当使用不同语言及处于不同的地区的用户在使用这个应用程序时,应用程序必须使用他们能看懂的语言和符合他们文化习惯来显示信息。国际化有时候被简称为i18n,因为有18个字母在国际化的英文单词的字母i和n之间。

二、国际化的程序特征

  • 有一个附加的本地化数据(localized  data)及拥有在全世界各个地区执行的能力。
  • 文本的元素,比如状态信息或GUI截面的lables,不是直接写(hardcoded)在程序中,而是被存储在本地化的数据中,并且能被程序正确的动态的使用。
  • 支持新的语言时,不需要修改程序,不需要重新编译。
  • 文化差异的数据,比如日期和货币,必须根据拥护的语言和习惯显示不同的格式。
  • 可以被迅速的本地化。

本地化(Localization)是指通过增加本地描述的构件(locale-specific components )和文字翻译工作来使应用程序适应于不同的语言和地区的过程。本地化有时候被简称为l10n,应为有10个字母在本地化的英文单词的字母l和n之间。通常本地化最耗时的工作应该是文字翻译。本地化工作者们要根据地区的具体需求来为日期、数字和通货等数据建立新的格式。其他类型的数据,象声音,图象等,也需要根据具体需要来决定是否本地化。

三、国际化步骤

我们可按如下步骤来实现一个程序的国际化:

1、建立properties文件——本地化数据

     properties文件的名字需遵守固定格式,形如“basename_LL_CC.properties”或“basename_LL.properties”。其中,LL表示语言代码(如“zh”),CC表示国家代码(如“CN”)。例如,中文的本地化数据可存储在文件“message_zh.properties ”中。

2、创建Local对象——不同语言和国家的标识

        java.util.Local是JDK提供的标准API。这个类用来标识国家和语言。
        我们可以创建一个local对象:
                 Local locale = new Locale("en","US");
        这个对象标志了一个地方,这个地方是美国,并且这里的语言是英语。

3、创建ResourceBundle对象----本例中实现国际化的主要角色

         java.util.ResourceBundle是JDK提供的标准API。它实际上是个抽象类,同时它提供了创建它的子类的静态工厂方法。在例子程序中我们实际上使用的是ResourceBundle的子类PropertyResourceBundle的对象。通过它,我们可以根据Local对象来读取不同的properties文件,从而取得不同的信息。
         可用如下语句创建这个对象:
         ResourceBundle rb = ResourceBundle.getBundle("MessagesBundle",  locale);

4、用ResourceBundle读取信息——本地化实现了

    读取了propeties文件后,我们就可以用ResourceBundle的实例通过getString(String Key)方法来取得信息了。

四、程序示例

1、创建一个工程,并在应用程序根路径下创建如下三个文件:

  • classMain.java
  • message_zh.properties
  • message_en.properties

简单起见,每个文件中只写入一行数据:
        message_zh.properties:
                msg0="Chinese locale"        
        message_en.properties:
                msg0="English locale" 

2、在classMain.java中填写如下代码:

import java.util.*;

public class classMain{
    public static void main(String args[])
    {
         Locale local = new Locale("en","US");
         ResourceBundle rb = ResourceBundle.getBundle("message",local);
         System.out.println(rb.getString("msg0"));
         
         local = new Locale("zh","CN");
         rb = ResourceBundle.getBundle("message",local);
         System.out.println(rb.getString("msg0"));
    }
 }

编译运行便可得如下结果:

"English locale"
"Chinese locale"


参考: http://wenku.baidu.com/view/2ef69bc52cc58bd63186bda5.html

原文地址:https://www.cnblogs.com/jancco/p/2488988.html