1. 相关知识 1.1 Java编程语言是从一开始就支持软件本地化的第一个编程语言。 所有的字符串都使用Unicode
1.2 要本地化的内容: 数字 123,456.78 英国 ; 123.456,78 德国 货币 日期 3/22/61 美国 ; 22.03.1961 德国 March 22,1961 ; 英文 22. Marz 1961 德语 ; 1961年3月22日 中文 时间 文本 -> 图形用户界面(集中以上情况)
1.3 Locale类 locale, 简单来说是指语言和区域进行特殊组合的一个标志 语言、国家和变体(language_country_variant) 预定义Locale对象 getDefault, getAvailableLoacles 1.4 信息格式化 java.text.MessageFormat 2. 资源包 2.1 资源包的载入 ResourceBundle currentResources = ResourceBundle.getBundle("ProgramResources", currentLocal); getBundle 将设法加载下面这些类之一,直到加载成功为止: ProgramResources_language_country_variant ProgramResources_language_country ProgramResources_language ProgramResources 不成功,将用default loacal 来代替 currentLocal 进行重新加载 如果还不成功,将抛出 MissingResourceException 异常 getBundle 找到一个类,将继续寻找下一个类,建立起资源层次结构。 资源层次结构中的每个层次不一定都要存在 2.2 资源的检索 String buttonLabel = currentResources.getString("addButton"); 某个资源在子类中没有检索到,将从建立起的资源层次结构中的父类中进行检索
2.3 资源的分类 可以根据资源检索时候的参数来分类,也可以将不同的资源放到不同的资源包中 同时,资源对象可以存放任何类型的对象,不仅是字符串 Color backColor = (Color)currentResources.getObject("backColor"); 对此的处理参考2.4.2
2.4 资源包的建立 2.4.1 建立自己的资源包类 必须继承于 ResourceBundle , 并要实现下面2个方法: Enumeration getKeys(); Object handleGetObject(Stirng key); 示例: public class ProgramResources extends ResourceBundle // place getKeys method in common superclass { public Enumeration getKeys() { return Collections.enumeration(Arrays.asList(keys)); } private String[] keys = { "button", "backColor", "defaultSie" }; } public class ProgramResources_de extends ProgramResources { public Object handleGetObject(Stirng key) { if (key.equals("button")) return "Rechnen"; else if (key.equals("backColor")) return Color.black; else if (key.equals("defaultSie")) return new double[] {210, 297}; } } public class ProgramResources_en_US extends ProgramResources { public Object handleGetObject(Stirng key) { if (key.equals("button")) return "Compute"; else if (key.equals("backColor")) return Color.blue; else if (key.equals("defaultSie")) return new double[] {216, 279}; } } 为每个资源包编写这种代码是相当烦琐的。可以采取以下方法。 2.4.2 JDK提供的类 ListResourceBundle和PropertityResourceBundle 使用ListResourceBundle类,你可以将自己的所有资源放入一个对象数组中,然后它能够为你进行资源的查找: public class ProgramResources_de extends ListResourceBundle { public Object [][] getContents() {return contents; } private static final Object[][] contents { {"button", "Rechnen"}, {"backColor", Color.black}, {"defaultSie", double[] {210, 297}} } } public class ProgramResources_en_US extends ListResourceBundle { public Object [][] getContents() {return contents; } private static final Object[][] contents { {"button", "Compute"}, {"backColor", Color.blue}, {"defaultSie", double[] {216, 279}} } } 如果你的全部设置都是字符串型,那么你就可以使用更发布的PropertityResourceBundle机制: 将全部字符串放入一个属性文件,每行都是一对关键字/值对 button=Rechnen backColor=black defaultSie=210X297 button=Compute backColor=blue defaultSie=216X279 并按以下格式命名属性文件 ProgramStrings.properties ProgramStrings_de.properties ProgramStrings_en_US.properties 像下面这样装载资源 ResourceBundle bundle = ResourceBundle.getBundle("ProgramStrings", local); getBundle找出相似的属性文件,并将它转换成PropertityResourceBundle。不用直接使用PropertityResourceBundle 不足之处: 需要在程序中对各个字符串进行分析 最好的解决办法: 将字符串资源放入到属性文件,并且将ListResourceBundle用于那些不是字符串的资源对象。 注意事项: 转换: 用于存储属性的文件通常是7位的ASCII文件,需要用native2ascii根据来转换位Unicode字符 default: ProgramStrings.properties中放置美式英语字符串和信息 以便在装载本地资源文件失败后装载入default资源都能看得懂
3. 图形用户界面的本地化需要注意的事情 不要对标签Label进行判断 对资源包中不同语言的字符串的长度要考虑
4. 我们的封装 基本类:XStringManager 字符串管理器类,从资源文件中获取字符串 扩展:其他用到字符串的地方 XResourceManager:用以获取指定资源,包括:URL和对象等 XComponentBuilder:统一创建可视组件对象 XErrorManager:根据错误代码获取错误信息 
|