自定义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"
.....
});
}
}