国际化:理解Java平台上的Locale

  • 语言和地理环境对我们的文化产生重要影响.我们同他人之间的交流及生活中的事件都发生在语言和地理环境所产生的一个系统里.由于语言和环境的不同,以至需要我们来制定一个适合的方式来达到向他人表述我们自己或我们的想法的目的.为了有效地和他人交流,需要考虑对方的文化,环境及使用对方的语言.

      类似地,一套有实效的软件系统也要考虑用户的语言和地理区域.语言和区域形成了本地环境,描述了软件本地化的设置和上下文.在Java平台上,通过java.util.Locale对象来描述本地化.

      本文为在Java平台上的编程人员讲解Locale对象以其含义.

      本文分成如下几部分:

      . 定义

      . 构造

      . 预先准备的各Locale

      . 识别可支持的Locale

      . 以字符串来表述Locale

      . 使用 Locale

      . 获取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或为视窗系统操作系统创建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,库能提供整理,时间,日期,数字和货币的信息呢?也许你会依靠脚本或干脆你来写能支持运行环境的系统.

      以下部分讲述怎么识别出运行库能支持的locales.另外还讲解了可支持文本组件的书写.最后,例举了运行库中和研发包里的几个可用的本地化.

      把locale用在java.util包和java.text包

      运行时刻环境并不必对每个区域敏感型的类都要用locale来支持.每个区域敏感型的类实现为他自身支持的一套locale,这套设置能使类跟类可差别开来.比如,一个格式化数字类支持的locale就跟一个日期类支持的locale有所差别.

      另外,不必所有的运行环境的实现都要支持同一套locale.不过所有的运行环境的实现都必须支持一个locale的最小集合.这个集合非常小,仅是英语环境(U.S).幸好,SUN公司提供的运行环境的实现里提供了更多的支持.尽管这不是形式上所必须的,不过SUN公司提供的各运行环境的实现里为区域敏感型的数据格式提供了同样的一套集合.这样的做法为类提供了一致性.Java 2标准版5.0里对locale支持的指南提供了周详的列表说明.表五给出一部分所支持的locales

      表五,java.util和java.text包里所支持的部分locales

      Language

      Country

      Locale ID

      ==========================================================

      Arabic

      Saudia Arabia

      ar_SA

      Chinese(simplified)

      China

      zh_CN

      Chinese (traditional)

      Taiwan

      zh_TW

      Dutch

      Netherlands

      nl_NL

      English

      Australia

      en_AU

      English

      Canada

      en_CA

      English

      United Kingdom

      en_GB

      English

      United States

      en_US

      French

      Canada

      fr_CA

      French

      France

      fr_FR

      German

      Germany

      de_DE

      Hebrew

      Israel

      he_IL

      Hindi

      India

      hi_IN

      Italian

      Italy

      it_IT

      Japanese

      Japan

      ja_JP

      Korean

      South Korea

      ko_KR

      Portuguese

      Brazil

      pt_BR

      Spanish

      Spain

      es_ES

      Swedish

      Sweden

      sv_SE

      Thai (Western digits)

      Thailand

      th_TH

      Thai (Thai digits)

      Thailand

      th_TH_TH

      你得问一问区域敏感型的类在运行时刻环境里(JRE)到底支持什么locales.每个区域敏感型类支持通过实现方法getAvailableLocales()来支持多种locale.比如:

      Locale[] localeList = NumberFormat.getAvailableLocales();

      java.util和java.text包里有许多类实现了getAvailableLocales()方法.例如,NumberFormat,

      DateFormat,Calendar和BreakIterator.

      Locale类本身也是本本地化成几个locale,在下面例子中,一个德国locale实例以英语(默认情况下是作者的主机),德语和法语提供了信息:

      Locale deLocale = new Locale("de", "DE");

      Locale frLocale = new Locale("fr", "FR");

      System.out.println("Default language name (default): " +

      deLocale.getDisplayLanguage());

      System.out.println("German language name (German): " +

      deLocale.getDisplayLanguage(deLocale));

      System.out.println("German language name (French): " +

      deLocale.getDisplayLanguage(frLocale));

      输出结果如下

      German language name (default): German

      German language name (German): Deutsch

      German language name (French): allemand

      对字符的支持

      文本组件通常不支持单个locale.实际上文本组件常在本地上用一套书写样式来显示.

      尽管不能从各文本组件上获取一个所支持的书写样式列表,不过这样的一个列表却是J2SE 5.0的本地化指南中公开的.

      通常,AWT对等体组件在操作系统的支持下可进行书写样式的展示.如果你的系统是阿拉伯的环境,那么AWT的文本组件会显示阿拉伯文字.在一个阿拉伯环境的系统上,你也能在文本框或文本域里输入阿拉伯文.然而你可别指望不在同一语言环境时这些AWT组件可显示同样的文本.比如在一个英语环境的系统不大可能在文本框里显示阿拉伯文字.

      Java Foundation Classes/Swing (JFC/Swing)组件通常能支持多语言,是因为不依赖主机系统及使用UNICODE作为多语言字符集的编码.因此SWING组件通常可显示多语言字符而AWT的对等体组件就不能.表六显示了一些能支持的字符

      表六.一些可显示的文本字符

      Writing System

      Language

      =======================================================

      Arabic

      Arabic

      Chinese (simplified)

      Chinese

      Chinese (traditional)

      Chinese

      Devanagari

      Hindi

      Hebrew

      Hebrew

      Japanese

      Japanese

      Korean

      Korean

      Latin: Western European

      English, French, German, Italian,

      subset

      Spanish, Swedish, and so on

      Thai

      Thai

      Greek

      Greek

      Cyrillic

      Belorussian, Russian, and so on

      Latin: Baltic subset

      Latvian, Lithuanian

      Latin: Central European subset

      Czech, Hungarian, Polish, and so on

      Latin: Turkic subset

      Turkish and so on

      JRE和SDK的本地化

      运行环境里的几个用户界面元素已根据本地样式进行了本地化.这些元素包括了AWT和SWING的组件及JRE和SDK产生的消息.表七给出了J2SE 5.0提供的所有本地化

      表七.为JRE作的用户界面的翻译

      Language

      Locale ID

      =================================

      Chinese (simplified)

      zh_CN

      Chinese (traditional)

      zh_TW

      English

      en

      French

      fr

      German

      de

      Italian

      it

      Japanese

      ja

      Korean

      ko

      Spanish

      es

      Swedish

      sv

      某些研发工具,比如JAVA编译器,仅随J2SE的软件研发包供给.这些工具为用户提供了出错,出错,警告和其他消息.这些工具及SDK里的实用工具包括编译器里的消息,被翻译为英语或日语.这些翻译的结果在J2SE 5.0里已实现了.

      以字符串形式描述locale

      尽管你使用locale的多数时候需要引用一个Locale对象,不过有些时候用另一种表现形式会非常方便,尤其是进行内部调试时候.Locale对象的toString()方法返回String,他是语言,区域和变种代号的一个串.toString()方法以下划线来把各部分隔开.这样,提供了一种方便的可读性好的形式方便你的调试.

      考虑如下那样创建locale的代码

      Locale l = new Locale("ja", "JP");

      toString()方法将返回 "ja_JP".

      如此的字符串不适合提供给最终用户.大多数用户不熟悉ISO 639和ISO 3166标准中的国家和语言的代号,会觉得这样的字符串不好懂.幸好更有友好用户界面的文本展示,我们将在本文后面中讨论.

      使用locale

      尽管不常见,Locale对象却是在JAVA类库中普遍用到.即使你不明确地需求用locale,JAVA运行环境也会为你提供缺省的设置来实现消息和行为的本地化.当你明确地使用locale,你可为你的应用程式的每个部分使用不同的locale.

      譬如,你可用es_MX,西班牙语(墨西哥)的locale来显示本地化的消息;用en_US,(美式英语)的locale来显示货币和数字.这方式非常适合在美国工作生活的习惯西班牙语的人.尽管用户见到的是西班牙语的菜单,提示和文本,不过应用程式其他地方可见到按照美国习惯的货币和数字.这个简单例子向你展现了怎么在一个应用程式里使用多种locale.如果你的应用程式真是需要这样的locale支持的话,那么你可自主决定应用程式各方面的行为.

      除了像格式化数字,货币,日期和时间这样的区域敏感型的类之外还提供了如同词语分解的整理功能.

      这些类通常以构造器或是工厂方法来实例化.无论哪种形式,你可按照你喜欢的一种来创建一个周详的locale.

      使用缺省Locale

      无论应用程式是否明确指定了周详的locale,区域敏感型的对象都会选用缺省的locale.依赖这缺省的locale非常不明智.在多用户应用程式里,不是每个用户都适合这个缺省的locale,因此应用程式应当为所有的区域敏感型对象明确指定一个适合的locale.缺省的locale是一种为应用程式里所有的区域敏感型对象提供的系统资源.缺省时,也许对用户来说可能是对的,不过应当在多语言和多文化的环境下明确指定,当程式运行在一台机器上为多用户所使用时,这点尤其重要.

      用如下的方法来获得缺省locale:

      public static Locale getDefault()

      有三种途径为应用程式确定出一个缺省的locale.

      第一,除非明确的更改默认的locale,否则getDefault()方法返回值的locale是由JAVA虚拟机首次装载时确定的.这就是说,JAVA虚拟机从系统环境确定出了缺省的locale.系统环境上的locale是由操作系统和用户喜好来确定的;

      第二,某些JAVA运行环境的实现里,用户可通过命令行上设置user.language, user.country及 user.variant信息来覆盖掉系统的缺省locale.

      如的代码会依据这些设置的属性来打印出locale

      import java.util.Locale;

      public class Default {

      public static void main(String[] args) {

      System.out.println(Locale.getDefault());

      }

      }

      根据如上代码来做个实验.运行在U.S的英语系统时候,如上代码会输出en_US. 如果在命令行上给出选项参数,那么你可让程式使用所有你想要的locale.例如,为程式提供如下的命令行参数:

      java -Duser.language=fr -Duser.country=CA Default

      以这样的方式来运行程式的话,将把fr_CA当作默认的locale

      第三,可通过调用setDefault(Locale aLocale)方法来实现. setDefault(Locale aLocale)方法让应用程式设置了一个系统级别的资源.在用此方法设置了缺省的locale后,接着调用Locale.getDefault()就得到了最新设置的locale.

      注意:别在applet中调用setDefault()方法.applet的安全管理不会让你调用这方法的,因为这个方法调用的结果会影响主机上运行着的JAVA虚拟机上的系统级别的资源.

      大多数情况下,对于其他类使用缺省locale意味着完全忽略locale.譬如,你想要以缺省locale格式化一个数字,你能简单地而不必所有参数来创建NumberFormat:

      NumberFormat nf = NumberFormat.getInstance();

      如上代码的情况下使用locale基本上不必你做什么.另外一些区域敏感型的类也是照这样的模式.需要缺省locale的行为的时候不必作特定的工作来创建.不过缺省行为不是适合所有情况的,因此在特别时候你还需要明确指定locale.

      显示使用locale

      在有些计算机的环境中,仅有单一的locale贯穿于整个应用程式的生命周期里.另外一些环境里,应用程式使用一个可变的全局locale.在这些环境里,你可通过编程来改动locale,除非去改动locale,否则他一直保持原先的效果.JAVA应用程式环境非常独特,在应用程式里,可依照你想要的所有方式来使用不同的locale.

      跨国公司在世界上有许多客户.这就意味着这些公司的客户和员工也许使用着不同的语言并且希望公司和公司的软件能适合他们.此外,非常可能也非常常见的事是:公司里有个法国雇员为一位意大利客户处理销售记录.在这种情形下,你必须要控制好业务及用户界面中的对象所使用的locale以便处理和展现数据.应用程式可能在打印销售收据时候使用意大利格式的日期和货币格式,然而又要为习惯英语的雇员列客户清单.更有非常多类似这么复杂的情况没有列在此处.不过JAVA技术提供了灵活的方式来处理如此复杂的情况.

      为了最大限度的灵活性,你必须为区域敏感型的类指定明确的locale.这就意味着你必须为程式的各个方面考虑locale的表现样式或为不同的用户和客户指定locale.

      如果你已为用户方的locale作了考虑,那么在构造器参数列表里明确指定一个locale或在一些特定方法里指定以此来创建区域敏感型的类的实例.设想有个用来作展现的对象里存储了为客户选用的locale:

      Locale userLocale = preferences.getLocale();

      NumberFormat nf = NumberFormat.getInstance(userLocale);

      获取locale的信息

      由于locale对象不包含非常多信息,不过提供了一些有趣的方法.正如你想的,这些信息跟语言,国家和方言是有密切联系的.其中一些是依赖locale的,另一些则不依赖locale.这些情况说明了locale对象为他的方法提供了两种不同形式.locale里的一些信息并非是面向客户或本地化的,另一些则是本地化的并且适合用来为用户展现的.

      不依赖locale的信息

      getLanguage() 方法返回ISO 639 标准中为语言定义的两字母缩写.比如,你创建了ja_JP的locale,那么方法返回的是 ja . 这个方法的完整形式是:

      public String getLanguage()

      ISO 639标准的一个扩展是用三个字母缩写的代号来定义语言的.尽管在J2SE 5.0里不使用这些代号,不过却是有用的.用如下的方法来获得三字母缩写的语言代号:

      public String getISO3Language()

      看个对比的例子:

      Locale aLocale = Locale.JAPAN;

      System.out.println("Locale: " + aLocale);

      System.out.println("ISO 2 letter: "+ aLocale.getLanguage());

      System.out.println("ISO 3 letter: " + aLocale.getISO3Language());

      aLocale = Locale.US;

      System.out.println("Locale:" + aLocale);

      System.out.println("ISO 2 letter: " + aLocale.getLanguage());

      System.out.println("ISO 3 letter: " + aLocale.getISO3Language());

      输出结果如下:

      Locale: ja_JP

      ISO 2 letter: ja

      ISO 3 letter: jpn

      Locale: en_US

      ISO 2 letter: en

      ISO 3 letter: eng

      getCountry()方法返回 ISO 3169标准中两字母缩写定义的国家或区域代号.方法的完整形式: public String getCountry()

      也有个ISO扩展标准里用三字母缩写来定义国家代号:public String getISO3Country()

      看个对比的例子:

      Locale aLocale = Locale.CANADA_FRENCH;

      System.out.println("Locale: " + aLocale);

      System.out.println("ISO 2 letter: " + aLocale.getCountry());

      System.out.println("ISO 3 letter: " + aLocale.getISO3Country());

      输出结果如下:

      Locale: fr_CA

      ISO 2 letter: CA

      ISO 3 letter: CAN

      如果locale对象里设置有方言的字段的话, getVariant()方法返回一个字符串来表示.如果locale对象里没设置方言的字段的话,此方法返回空串.此方法的形式如下:public String getVariant()

      locale类中的如下几个方法可获取所有可用的语言代号和国家代号:

      public static String[] getISOCountries()

      public static String[] getISOLanguages()

      相对于客户来说,研发者更愿意使用getLanguage()方法返回的代号.而客户可能想要如下文中描述的那些不同之处.

      依赖locale的信息

      方法getLanguage(), getCountry(), getVariant()返回的代号对于用户来说不友好.用户并不必懂这些代号,因此locale提供另外的一些方法来提供了更具有可读性的面向客户的信息.

      locale对象提供了一些可返回人能读懂的文本描述的方法.这些文本描述不同于toString()方法返回的字符串.并非把语言,国家和方言这些字段简单的串连起来,而是提供了locale的人可读懂的,本土化了的信息:

      public final String getDisplayLanguage()

      public final String getDisplayCountry()

      public final String getDisplayVariant()

      显示语言

      当你需要以用户习惯的语言来显示的时候,应使用locale对象的getDisplayLanguage()放.此方法返回了可显示的,人能读懂的用户方语言的名称.如果你不给出目标locale的话,这个显示的名称就是缺省的locale的本土化.此方法的两种形式:

      public final String getDisplayLanguage()

      public final String getDisplayLanguage(Locale targetLocale)

      以下举例怎么使用这两个方法:

      Locale deLocale = Locale.GERMANY;

      // 系统默认的locale是 en_US

      String defaultLanguage = deLocale.getDisplayLanguage();

      //目标locale显示地指出了使用的语言

      String targetLanguage = deLocale.getDisplayLanguage(deLocale);

      System.out.println(defaultLanguage);

      System.out.println(targetLanguage);

      输出结果如下:

      German

      Deutsch

      输出的 German 是以美式英语单词来显示locale里所使用的语言.这并没给你留下特别的印象,不过要注意的是:你怎样提供一个目标locale作参数.这种情形中,getDisplayLanguage()试图找到和返回一个本土化了的lcoale中语言组件的版本.

      这一点非常重要,因为你能为客户显示应用程式可支持的客户方语言的每个locale的语言名称.你可在程式里提供一个列表来让用户选他们喜好的locale.

      这就引来一个有趣的问题:怎么在locale的语言环境里呈现locale的语言名称?你可按照如下代码来做:

      String displayLang = aLocale.getDisplayLanguage(aLocale);

      换言之,就是在调用getDisplayLanguage()方法时候以此locale对象作参数.对于其他可显示的locale元素也可使用这个窍门.比如,也能用这种方法来显示国家和方言.如下代码演示了这个窍门.

      Locale[] locales = { new Locale("en", "US"), new Locale("ja","JP"),

      new Locale("es", "ES"), new Locale("it", "IT") };

      for (int x=0; x< locales.length; ++x) {

      String displayLanguage = locales[x].getDisplayLanguage(locales[x]);

      println(locales[x].toString() + ": " + displayLanguage);

      }

      显示国家

      给用户显示locale对象里的国家或地区信息时可按照如下代码:

      public final String getDisplayCountry()

      public final String getDisplayCountry(Locale targetLocale)

      第一种形式的方法为缺省locale提供了本土化的国家名称.第二种形式的方法为目标locale提供了同样的本土化信息.

      Locale deLocale = Locale.GERMANY;

      // default en_US

      String defaultCountry = deLocale.getDisplayCountry();

      // target de_DE

      String targetCountry = deLocale.getDisplayCountry(deLocale);

      System.out.println(defaultCountry);

      System.out.println(targetCountry);

      输出结果如下:

      Germany

      Deutschland

      显示方言

      方言在locale里相对于其他元素用地比较少.然而有时还需要要获取他的信息.

      getDisplayVariant()方法返回locale里的方言部分的显示名称.

      public final String getDisplayVariant()

      public final String getDisplayVariant(Locale targetLocale)

      在JAVA平台使用方言的一个方法是为支持泰国语言.根据约定,对于 th 和 th_TH的locale而使用的NumberFormat对象通常以阿拉伯数字或是泰国格式的阿拉伯数字来使用.对于th_TH_TH的locale的NumberFormat是用泰国数字的,如下面的代码演示:

      Locale[] thaiLocale = {new Locale("th"), new Locale("th","TH"),

      new Locale("th","TH", "TH")};

      for(Locale locale: thaiLocale) {

      NumberFormat nf = NumberFormat.getNumberInstance(locale);

      StringBuffer msgBuff = new StringBuffer();

      msgBuff.append(locale.toString() + ": ");

      msgBuff.append(nf.format(573.34));

      textArea.append(msgBuff.toString() + "\n");

      }

      显示名称

      显示名称仅是简单地组合了本土化语言,国家和刚才演示的方言.方法的形式如下:

      public final String getDisplayName()

      public final String getDisplayName(Locale targetLocale)

      跟locale的toString()方法有所不同.toString()方法是串联起来各个部分并且以下划线分割.

      getDisplayName()方法以括号分割各个部分.

      Locale deLocale = Locale.GERMANY;

      // default en_US

      String defaultCountry = deLocale.getDisplayName();

      // target de_DE

      String targetCountry = deLocale.getDisplayName(deLocale);

      System.out.println(defaultCountry);

      System.out.println(targetCountry);

      输出结果如下:

      German (Germany)

      Deutsch (Deutschland)

      总结

      locale是一门语言,一个可选国家(或一个地区)或是个可选方言代号的标识符.locale对象提供了几个方法来获取关于locale状态的信息.尽管locale本身不包含许多功能,不过区域敏感型对象依赖于locale来指示行为.区域敏感型对象用locale来制定他们的行为以此满足用户所想要的.

      JAVA平台上,每个区域敏感型对象负责他自身区域相关的行为.设计上,区域敏感型对象之间互不相干.这就是说,在一个类里被支持的locale并不一定要跟另一个类里被支持的lcoale相同.

      在传统的操作系统上和区域模型里,在同一时间里仅有一个locale的设置起作用.这些系统上,在你通过编程来设置locale后,所有的区域敏感型的功能都会使用指定的locale,这个locale犹如一个全局locale相同贯穿于应用程式.当以setLocale方法或类似的调用使另一个全局locale起作用后才发生改动.JAVA平台上,由于处理locale时有些不同,所以一个JAVA应用程式里在同一时间可有多个locale起作用.配合格式对象使用多种loalce让研发者有机会为多语言和多文化环境的应用程式创建复杂的必要的组合.

  • 以上内容由 华夏名网 搜集整理,如转载请注明原文出处http://www.sudu.cn/info/html/edu/java/20070930/75506.html,并保留这一部分内容。

      “华夏名网” http://www.sudu.cn 和 http://www.bigwww.com 是成都飞数科技有限公司的网络服务品牌,专业经营虚拟主机,域名注册,VPS,服务器租用业务。公司创建于2002年,经过6年的高速发展,“华夏名网”已经成为我国一家知名的互联网服务提供商,被国外权威机构webhosting.info评价为25大IDC服务商之一。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值