1、中关村国际软件人才教育联盟 第二十三讲 软件本地化 中关村国际软件人才教育联盟 2 目标 软件本地化的概念 Locale对象 数字与货币 日期与时间 文本 资源包 图形用户界面的本地化 中关村国际软件人才教育联盟 3 软件本地化 应用程序能够根据使用它的用户所在的国家和所使用的语言,提供符合他们习惯的表现方式 软件本地化包括以下几个内容: 数字与货币的本地化 日期与时间的本地化 文本的本地化 图形用户界面的本地化 资源包 中关村国际软件人才教育联盟 4 Locale 4-1 在 Java程序中,软件本地化离不开 Locale对象的支持 Locale对象可以用来描述下面几个元素: 语言 国家 变
2、形(可选) 例如: 在美国,使用的 locale为:语言英语,国家美国 在中国,使用的 locale为:语言汉语,国家中国 为什么要区分语言和国家? 因为一个国家可能有多种官方语言。比如瑞典就有 4种 中关村国际软件人才教育联盟 5 Locale 4-2 如何以标准化的方式来表示语言和地点? 使用国际标准化组织( ISO)定义的语言和国家编码 常用语言和国家编码如下(注意大小写): 语言 编码 Chinese zh English en Japanese ja Korean ko 国家 编码 China CN United States US Japan JP Korea KR ISO-639
3、语言编码 ISO-3166国家编码 中关村国际软件人才教育联盟 6 Locale 4-3 建立一个 Locale对象:将语言、国家编码作为参数传递给 Locale类的构造函数: Locale usEnglish=new Locale(“en”,”US”); 或者只给定语言而不给定国家: Locale jap=new Locale(“ja”,”); 这种类型的 Locale只能用来查找相关的语言,不能用来确定当地的货币和日期的格式化方式 为了方便, JDK预定义了许多 Locale对象。如: Local.CHINA Local.JAPAN Local.US Local.KOREA JDK也预定义
4、了一些语言 Locale对象。如: Local.CHINESE Local.JAPANESE Local. KOREAN Local.ENGLISH 中关村国际软件人才教育联盟 7 Locale 4-4 用 Locale对象来做什么? 它本身并没有太大的作用。需要它的真正原因是:要把它提供给能够使用 locale的方法 例如: String类 toLowerCase方法和toUpperCase方法可以接受一个类型为 Locale的参数,因为对于不同的 locale来说,形成大写字母的规则也不相同 Locale类中有一个 getDisplayName方法,可以返回一个用于描述 locale的字符
5、串: Locale loc=new Locale(“de”,”CH”); System.out.println(loc. getDisplayName(Locale.GERMAN); 输出结果为: Deutsch (Schweiz) 中关村国际软件人才教育联盟 8 数字与货币 2-1 数字与货币的格式化与 locale是息息相关的。你可使用下面的步骤,对特定 locale的数字进行格式化: 首先获得一个特定的 locale对象 使用一个工厂方法获得一个格式化器对象 用格式化器对象对数字进行格式化 工厂方法是 “ 格式化器 ” java.text.NumberFormat类的静态方法,带有一个
6、Locale类型的参数。工厂方法共有 3个: getNumberInstance /返回的对象能够对数字进行格式化 getCurrencyInstance /返回的对象能够对货币量进行格式化 getPercentInstance /返回的对象能够对百分比进行格式化 NumberFormat类的静态方法 getAvailableLocales可以返回一个系统当前支持的 locale的数组 中关村国际软件人才教育联盟 9 数字与货币 2-2 对德语中的货币值进行格式化的例子: Locale loc=new Locale(“de”,”DE”); NumberFormat currFmt= Numbe
7、rFormat. getCurrencyInstance(loc); double amt=123456.78; System.out.println(currFmt.fromat(amt); 输出结果: 123.456,78 DM /它的货币符号是 DM 如果你想读取一个按照某个 locale的约定输入的数字,使用 parse方法,该方法自动使用默认的 locale: TextField inField; NumberFormat fmt= NumberFormat. getNumberInstance(); Number input=fmt. parse(inField.getText().trim(); double x=input. doubleValue(); 中关村国际软件人才教育联盟 10 数字本地化示例 程序代码详见 NumberFormatTest.java,程序输出结果如下: