天天看点

自定义locale

  自定义 locale   前段时间 在做美国的一个政府项目, 其中有一块是政府给 老百姓发信件,信件有英文与西班牙语的两个版本。 信件中有一些 内容需要填充 日期, 对于 不同语言版本需要显示不同类型 的 日期。 数据为 03/30/2008, 对于英文版需要显示March 30, 2008, 相对应 对于西班牙版本需要显示Marzo 30,2008. 可以用 DateFormat, 然后设置一个locale 来格式化。 但是jdk里locale 的西班牙 日期表示 都是 全小写的,比如三月, marzo 。 找了很久发现 关于西班牙文的loacle全是小写的 月份。 可是BA一定要 大写字母打头,真是让人吐血, 因为JDK里面默认是全是小写的。 没有其它招数 只能从 locale 着手解决,于是 从JDK入手,反编译了 JDK一些类, 发现在 sun.text.resources包下定义了jdk的所有locale, class 的名字 都是以LocaleElements_es 这样的名字来命名,LocaleElements + _ + locale的简称, 仔细研究了一番,虚拟机在load Locale类时会把这个包下的所有资源class装载进去。 于是我新建了一个class LocaleElements_esus, 这个类是拷贝 LocaleElements_es, 修改中间关于month name  部分,这个locale 的简称 就是 esus, 下划线后面部分, 然后这样只要 Locale locale = new Locale(“esus”); 就可以用。 不过一定要 package 到: sun.text.resources 可以根据自己的需要 修改 完善。 sun.text.resources 在 jre/lib/ext/localedata.jar 里 主要代码如下: // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.kpdus.com/jad.html // Decompiler options: packimports(3) // Source File Name:    LocaleElements_es.java   package sun.text.resources;   import java.util.ListResourceBundle;   public class LocaleElements_esus extends ListResourceBundle {       ......               }, new Object[] {                 "MonthNames", new String[] {                               "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre",                         "Noviembre", "Diciembre", ""                 }             }, new Object[] {                 "MonthAbbreviations", new String[] {                         "ENE", "FEB", "MAR", "ABR", "MAY", "JUN", "JUL", "AGO", "SEP", "OCT",                         "NOV", "DIC", ""                 }             }, new Object[] {                 "DayNames", new String[] {                     "domingo", "lunes", "martes", "mi/351rcoles", "jueves", "viernes", "s/341bado"        .....                });     } }