locale

AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具.

通常,AWT对等体组件在操作系统的支持下可进行书写样式的展示.如果系统是阿拉伯的环境,那么AWT的文本组件会显示阿拉伯文字.在一个阿拉伯环境的系统上,也能在文本框或者文本域里输入阿拉伯文.然而别指望不在同一语言环境时这些AWT组件可显示同样的文本.比如在一个英语环境的系统不大可能在文本框里显示阿拉伯文字.
  Java Foundation Classes/Swing (JFC/Swing)组件通常能支持多语言,是因为不依赖主机系统以及使用UNICODE作为多语言字符集的编码.因此SWING组件通常可显示多语言字符而AWT的对等体组件就不能

尽管不常见,Locale对象却是在JAVA类库中普遍用到.即使不明确地要求用locale,JAVA运行环境也会提供缺省的设置来实现消息和行为的本地化.当明确地使用locale,可为应用程序的每个部分使用不同的locale.
  譬如,可用es_MX,西班牙语(墨西哥)的locale来显示本地化的消息;用en_US,(美式英语)的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. **
  
  做个实验.运行在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,否则它一直保持原先的效果.JAVA应用程序环境很独特,在应用程序里,可依照想要的任何方式来使用不同的locale.
  跨国公司在世界上有许多客户.这就意味着这些公司的客户和员工也许使用着不同的语言并且希望公司和公司的软件能适合他们.此外,很可能也很常见的事是:公司里有个法国雇员为一位意大利客户处理销售记录.在这种情形下,必须要控制好业务以及用户界面中的对象所使用的locale以便处理和展现数据.应用程序可能在打印销售收据时候使用意大利格式的日期和货币格式,然而又要为习惯英语的雇员列客户清单.还有很多类似这么复杂的情况没有列在此处.但是JAVA技术提供了灵活的方式来处理如此复杂的情况.
  为了最大限度的灵活性,必须为区域敏感型的类指定明确的locale.这就意味着必须为程序的各个方面考虑locale的表现样式或者为不同的用户和客户指定locale.
  如果已经为用户方的locale作了考虑,那么在构造器参数列表里明确指定一个locale或者在一些特定方法里指定以此来创建区域敏感型的类的实例.设想有个用来作展现的对象里存储了为客户选用的locale:
  Locale userLocale = preferences.getLocale();
  NumberFormat nf = NumberFormat.getInstance(userLocale);
  由于locale对象不包含很多信息,但是提供了一些有趣的方法.,这些信息跟语言,国家和方言是有密切联系的.其中一些是依赖locale的,另一些则不依赖locale.这些情况说明了locale对象为它的方法提供了两种不同形式.locale里的一些信息并非是面向客户或者本地化的,另一些则是本地化的并且适合用来为用户展现的.
  getLanguage() 方法返回ISO 639 标准中为语言定义的两字母缩写.比如,创建了ja_JP的locale,那么方法返回的是 ja . 这个方法的完整理式是:
  public String getLanguage()
  ISO 639标准的一个扩展是用三个字母缩写的代号来定义语言的.尽管在J2SE 5.0里不使用这些代号,但是却是有用的.用如下的方法来获得三字母缩写的语言代号:
  public String getISO3Language()
  
  getCountry()方法返回 ISO 3169标准中两字母缩写定义的国家或者区域代号.方法的完整理式: public String getCountry()
  也有个ISO扩展标准里用三字母缩写来定义国家代号:public String getISO3Country()
  
  如果locale对象里设置有方言的字段的话, getVariant()方法返回一个字符串来表示.如果locale对象里没设置方言的字段的话,此方法返回空串.此方法的形式如下:public String getVariant()
  locale类中的如下几个方法可获取所有可用的语言代号和国家代号:
  public static String[] getISOCountries()
  public static String[] getISOLanguages()
  相对于客户来说,开发者更愿意使用getLanguage()方法返回的代号.而客户可能想要如下文中描述的那些不同之处.
  方法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让开发者有机会为多语言和多文化环境的应用程序创建复杂的必要的组合.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值