天天看點

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