国际化: 理解Java平台上的Locale
关键词: 鲍尔默称 凭借Windows群集 打垮linux时间问题 语言和地理环境对我们的文化产生重要影响.我们同他人之间的交流以及生活中的事件都发生在语言和地理环境所产生的一个系统里.由于语言和环境的不同,以至需要我们来制定一个适合的方式来达到向他人表述我们自己或者我们的想法的目的.为了有效地与他人交流,需要考虑对方的文化,环境以及使用对方的语言.
类似地,一套有实效的软件系统也要考虑用户的语言和地理区域.语言和区域形成了本地环境,描述了软件本地化的配置和上下文.在Java平台上,通过java.util.Locale对象来描述本地化.
本文为在Java平台上的编程人员讲解Locale对象以其含义.
本文分成如下几部分:
. 定义
. 构造
. 预先准备的各Locale
. 识别可支持的Locale
. 以字符串来表述Locale
. 使用 Locale
. 获取Locale的信息
. 总结
定义
Locale确定了一种专门的语言和区域.通过使用java.util.Locale对象来为那些区域敏感型的对象定制格式化数据以及向用户的展示.Locale影响到用户界面的语言,情形映射,整理(排序),日期和时间的格式以及货币格式.Locale在很多文化背景和语言敏感型的数据操作上的要求很严格.
java.util.Locale是个轻量级对象,包含为数不多的几个重要成员:
. 一个语言代号
. 一个国家或者区域的可选项
. 一个另一形式代号的可选项
谈到或者书写Locale时,为了方便使用,可用缩写.在这样的缩写表述里,使用下划线来把Locale对象的每部分隔开来:
[_ [_ ]]
这三部分内容提供了足够的信息让其他些个区域敏感型对象为了特定的语言文化来修饰它们的行为.举例讲,java.text.NumberFormat对象格式化出来的数字同在德语拼写的奥地利和瑞士是有区别的.
表一,不同Locale的格式化输出
Locale formatted Numbers
======================================
German (Germany) 123.456,789
German (Switzerland) 123'456.789
English (United States) 123,456.789
Locale对象是个标识符,像jva.text.NumberFormat,java.text.DateFormat这样的区域敏感型的对象都会提供本地化的数字或者日期的格式.举例说,java.text.DateFormat类在其实例化过程中用Locale对象来正确地定出日期的格式.
以下部分讲述locale的各成分
ISO 639制定了语言代号,国际标准组织为世界上的大多数语言指派2个或者3个字母来代表.Locale用2个字母代号标识出想要的语言.表二列出这样的几个语言代号.
表二, ISO 639标准里的语言代号的例子
Language Code
=====================
Arabic ar
German de
English en
Spanish es
Japanese ja
Hebrew he
语言环境是Locale对象里的重要组成部分,因为它描述了特定用户群的语言.你的应用程序需要用这此信息来为用户提供与其语言一致的用户界面.
当然,语言并没描绘了整个Locale.举一例,即使把 de 作为本地语言代号, 单单的一个 de 并不能让你知道到底是哪一地区的的人讲的德语.一些国家把德语作为官方语言或者作为第二种语言.一个国家与另一个国家里的德语的区别之一就是排列顺序.由于这样的原因以及另外些原由,语言并不总能充分地准确地定义一个区域.
国家(区域)代号
另一个国际标准ISO 3166定义了国家代号.这个标准为世界上的大多数主要区域以及每个国家定义了2到3个的缩写字母.跟语言代号对比,国家代号是用大写字符的.表三给出了一些代号定义.Locale用两字母的代号来替代标准里也同样支持的3字母的代号
表三,ISO 3166标准中的一些国家代号的定义
Country Code
====================
China CH
Canada CA
France FR
Japan JP
Germany DE
国家代号是Locale的重要组成部分.对应日期的java.text.Format对象,时间,数字和货币都对国家代号很敏感.有了国家代号就可更好地确认Locale里的语言部分.举例来说,在加拿大和法国都说法语的,然而确切的用法和语言表达习惯却是不一样的.这些不同之处可以用Locale里的国家代号来区分出来.例如, 代号fr_CA(加拿大法语)跟fr_FR(法国法语)就不一样.
方言
操作系统,浏览器以及其他软件供应商可用这个代号来提供附加的功能或者到达语言和国家代号所不能实现的定制.比如说,一家软件公司也许会为一特定操作系统指定一个locale,于是开发人员为西班牙的Macintosh操作系统创建了es_ES_MAC或者为Windows操作系统创建es_ES_WIN的本地化.
Java平台历史上的一个例子就是使用EURO变量来为欧洲用户实现本地化.Java 2平台1.3标准版过度时期里就为欧洲的这些国家的本地化使用了这个变量.比如,尽管已经存在了 de_DE(德国德语)的本地化,但还是将 de_DE_EURO(欧洲的德国德语)加进了Java环境里.由于欧元是那些接受欧元流通国家里的标准货币,因此这个变量就从 J2SE1.4版本里剔除了.多数应用程序可能不需要这个代号.
构造
Locale类有如下几个构造器:
. Locale(String language)
. Locale(String language, String country)
. Locale(String language, String country, String variant)
以下展示每个构造器如何使用:
//创建一个通用英语的locale.
Locale locale1 = new Locale("en");
//创建一个加拿大英语的locale.
Locale locale2 = new Locale("en", "CA");
//创建一个美式英语的locale
//硅谷的英语
Locale locale3 = new Locale("en", "US", "SiliconValley");
用ISO 639的两字母代号表示的en代表了英语.ISO 3166的代号CA和US分别代表加拿大和美国.有个特别:如上代码片段里最后一行上用一个可选变量en_US_SiliconValley创建locale.