论坛首页 Java企业应用论坛

JDK 6 探秘之二: 自定义国际化(I18N)服务

浏览 4861 次
该帖已经被评为良好帖
作者 正文
   发表时间:2006-12-17  

 

在JDK 6 中, 利用其提供的service provider interfaces (SPI) 可以做到很好的国际化处理, 以前你只能使用标准的时区和各种符号, 如果你所在的地区不幸不再这些标志时区中, 或者货币符号也不在其中, 那么你就无能为力了, 现在有了JDK 6 ,我们可以自定义这些服务的提供者了.

为了实现该功能, 在JDK 6中的java.util.spi 包中有个LocaleServiceProvider 类( http://java.sun.com/javase/6/docs/api/java/util/spi/LocaleServiceProvider.html ), 该类是提供该服务的基类.  在JDK 6中有几个具体的服务实现 ,分布在java.text.spi, 和java.util.spi包中, 分布规则为, 如果类XXX在java.text包中, 则相应的XXXProvider类就在java.text.spi'包中. 对于java.util也一样.,

在java.text.spi 中有如下几个类:
BreakIteratorProvider  CollatorProvider  DateFormatProvider
DateFormatSymbolsProvider
DecimalFormatSymbolsProvider
NumberFormatProvider

在java.util.spi中有如下几个类;

CurrencyNameProvider LocaleNameProvider TimeZoneNameProvider

下面来看一个自定义服务的例子:

那自定义时区名来举例, 实现类如下:

package cn.hexiao.revealed;

import java.util.*;
import java.util.spi.*;

public class MyTimeZoneNameProvider extends TimeZoneNameProvider {
  public String getDisplayName(String ID, boolean daylight,int style, Locale locale) {
    System.out.println("ID: " + ID);
    return ID;
  }
  public Locale[] getAvailableLocales() {
    return new Locale[] {Locale.US};
  }
}

 

只是在返回ID前,打印该ID. 继承TimeZoneNameProvider 类, 你必须要实现 public Locale[] getAvailableLocales()  方法, 来指定可用的Locale.

getDisplayName函数取决于你提供的服务.

只是提供这么一个类,还不可以, 你还要把它打包为jar文件, 在该包的根目录下面还要有一个META-INF目录, 该目录下面还要有个services目录, 在services目录下面有一个以java.util.spi.TimeZoneNameProvider 命名(所提供服务的全限定类名)的文件,该文件的内容为 cn.hexiao.revealed.MyTimeZoneNameProvider(服务提供者的全限定类名). 然后使用

jar cvf Zones.jar META-INF/* cn/* 命令打包,

把打包后的文件放到jre的 lib/ext 目录下. (如果你使用JDK的jar允许程序,就要放到JDK目录下的jre目录中的lib/ext目录下).

下面来完成一个测试程序, 看看效果:

import java.util.*;
public class Zones {
  public static void main(String args[]) {
    TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
    System.out.println(tz.getDisplayName(Locale.US));
    System.out.println(tz.getDisplayName(Locale.UK));
  }
}

允许该程序, 可以看到如下结果,

G:\JDK6>java Zones
ID: America/Los_Angeles
ID: America/Los_Angeles
ID: America/Los_Angeles
ID: America/Los_Angeles
America/Los_Angeles
Pacific Standard Time

JSF中文论坛: http://www.hexiao.cn/jsf/index.php 

我们提供的自定义服务生效了, ^_^, Enjoy It ! 

   发表时间:2006-12-20  
基本上用处不大哦
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics