Java软件开发学习笔记(二)

类别:Java 点击:0 评论:0 推荐:

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:根据错误代码获取错误信息   

本文地址:http://com.8s8s.com/it/it11815.htm