Locale

定义
-------------------------------------------------------------------------------
Locale确定了一种专门的语言和区域.通过使用java.util.Locale对象来为那些区域敏感型
的对象定制格式化数据以及向用户的展示.Locale影响到用户界面的语言,情形映射,整理
(排序),日期和时间的格式以及货币格式.Locale在很多文化背景和语言敏感型的数据操作上
的要求很严格.

java.util.Locale是个轻量级对象,包含为数不多的几个重要成员:
. 一个语言代号
. 一个国家或者区域的可选项
. 一个另一形式代号的可选项

谈到或者书写Locale时,为了方便使用,可用缩写.在这样的缩写表述里,使用下划线来把Locale
对象的每部分隔开来:
<language code>[_<country code>[_<variant code>]]

这三部分内容提供了足够的信息让其他些个区域敏感型对象为了特定的语言文化来修饰它
们的行为.举例讲,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.
这个locale比第一个locale更明细.不仅说明了是美式英语,还特地讲指出是硅谷那边的.其
目的之一是让开发者可以定制用户的本地化,这个变量可以是任何你想要的值.


虽然编译与运行环境不关心你是否指定了你自己的语言或者是别的国家地区,但是你应当用ISO标准
里定义的代号来区别.强制自己去用ISO标准里的定义,这样可确保同其他应用程序或者代码标准兼容.
更为重要的一点是,区域敏感型的类库仅用ISO代号.比如,java.text.NumberFormat类对于de_DE的本地
化是能明白的,但是却不知如何处置虚构的foo_biz.假如用非ISO标准的定义,你不得不写程序代码去实
现支持那些非ISO标准定义的代号.


预定义的Locale
-------------------------------------------------------------------------------------------

Locale类里有几个Locale类型的静态成员实例.比如说,Locale.FRANCE 就是预先就准备好
的代表法国法语.你可在想要的地方用Locale.FRANCE也可以用new Locale("fr", "FR")的
方式来实现.表四给出了一些预定义的现成Locale对象实例
Locale Name              Locale
================================
Locale.CHINA                 zh_CN
Locale.CHINESE                 zh
Locale.SIMPLIFIED_CHINESE   zh_CN
Locale.TRADITIONAL_CHINESE  zh_TW
Locale.PRC                 zh_CN
Locale.TAIWAN                 zh_TW
Locale.ENGLISH                 en
Locale.UK                 en_GB
Locale.US                 en_US
Locale.FRANCE                 fr_FR
Locale.FRENCH                 fr

这些个预定义的Locale对象的实例的存在确实很方便.然而,仅列出的这几个静态成员是有限
的,不完整的,并不需要对每个重要的locale都要来描述.支持区域敏感型的类的locale并不需
要在Locale类里有Locale类型的成员常量.比如说,Locale类里就没有代表南美洲的常量.虽然
没有,但是照样支持包括日期格式和数字格式这样的区域敏感型的类.

由于仅存在极少量的预先准备好的locale,以至你可能回避这些静态实例.但是确实存在或者
你会在别人的代码里碰到,所以在此对它们有所提级,尽管它们很方便,但是不靠它们,你的代
码也是可行的.


识别支持的Locales
-------------------------------------------------------------------------------
Java平台支持什么样的locale?你可创建你想要的任何locale,然而你的运行时刻环境不一定
全支持你创建的这些locale.

那么你想知道你可以创建什么样的locale呢?答案很简单:你可创建任何你要的locale.构造器
不会在乎非ISO标准的参数.但是从这个提问里引出来:对什么样的locale,类库能提供更多信息
呢?对什么样的locale,库能提供整理,时间,日期,数字和货币的信息呢?也许你会依靠脚本或干
脆你来写能支持运行环境的系统.
.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值