`
coobee
  • 浏览: 2511 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JAVA国际化---ResourceBundle使用

阅读更多

 

 

今天在工作中用到了ResourceBundle这个类,随手总结一下。

    JDK文档中是这样说明它的:

    使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

  1. 轻松地本地化或翻译成不同的语言
  2. 一次处理多个语言环境
  3. 以后可以轻松进行修改,以便支持更多的语言环境

      我在这里只说一种用法。ResourceBundle提供了两个直接子类ListResourceBundle, PropertyResourceBundle,我们这里没有使用这两个直接子类,而是直接继承了ResourceBundle自己重写了一个基础类,因为ResourceBundle为抽象类所以必须实现handleGetObject 和 getKeys()这两方法。

 

ListResourceBundle

      同样也是一个抽象类,不过他已经实现了handleGetObject 和 getKeys()这两个在ResourceBundle声明的方法,ListResourceBundle的虚方法为protected abstract Object[][] getContents(),必须返回一个用于表示键值对的二维数组。个人认为比较特别,所以我们不使用这个类。顺便说一句ListResourceBundle也有一个直接子类AccessibleResourceBundle,不过在JDK1.3已经过时了。

PropertyResourceBundle

       它包括两个构造方法,PropertyResourceBundle(InputStream stream)和PropertyResourceBundle(Reader reader) ,我们可以很方便的读取来自.properties文件的资源。

 

       不过笔者不打算使用这两个直接子类做任何事情,笔者还是选择新写一个ResourceBundle的子类(程序版权属于笔者公司,只说思路不贴源码)。在这个新类中我们会定义三个成员变量,一个用于缓存读入的Properties,我们给它的声明为static private ConcurrentHashMap<String, Properties> hashMapLocaleToProps;一个用于保存当前的Properties,我们给他的声明为private Properties props;最后一个变量private final Locale locale 用于表示当前的语言环境。

  1. 构造方法:首先从配置文件、DB或者其他任何地方读到当前语言环境配置,姑且保存在局部变量language,笔者把它作为构造方法的参数传入locale = new Locale(language)。接下来我们从hashMapLocaleToProps中查找该资源文件是否已经被缓存,props=hashMapLocaleToProps.get(locale.toString()),如果已经存在则直接return等待getKeys()或者handleGetObject(String sKey)的调用(这两个必须重写的方法随后我会给出简单的源码便于读者理解);如果缓存中没有找到则直接去文件中读取,用什么方法读取都可以。笔者使用的方法为:先由locale.toString()拼成完整的资源文件目录:sFileName。
    FileInputStream is = new FileInputStream(sFileName);
    m_props.load(is);
  2. getKeys():
        @Override
        public Enumeration getKeys()
        {
                return props.keys();
        }
  3.  handleGetObject(String sKey):   
    @Override
    public Object handleGetObject(String sKey)
        {
                String sVal = props.getProperty(sKey);
                return sVal;
       }

基础类就算写好了,下面我们可以写不同语言的资源包的类了,他们将都继承这个基础类。我们把baseName命名为testResourceBundle。我们接下来写两个资源包类

public class testResourceBundle_zh_CN
    extends testResourceBundleBase
{
    public testResourceBundle_zh_CN()
    {
        super("zh_CN");
    }
}
 
public class testResourceBundle
    extends testResourceBundleBase
{
    public testResourceBundle()
    {
        super("zh");
    }
} 

 看很简单吧。

对了还需要编写以baseName命名的默认资源包类testResourceBundle

 

接下来就是使用了

ResourceBundle rb = ResourceBundle.getBundle(sBundle, locale);
String resource = rb.getString(sKey);

 到这里resource就是你要的经过本地化的资源了,现在你可以使用它了。看到这里可能有些朋友会感到迷惑了,感到迷惑的朋友可以去读读ResourceBundle.getBundle的源码,你的疑惑就会消失了。

 

文章中有什么不对的地方朋友们可以毫不留情的指出,希望能与大家交流。

    0
    0
    分享到:
    评论

    相关推荐

      JavaWeb项目网上书店.rar

      一、国际化的相关知识 1、什么是国际化。 程序只有一套,能根据来访者的阅读习惯显示相应的文本、日期时间、货币符号。 2、固定文本的国际化 一个消息资源包:基名_语言_国家.properties ResourceBundle Locale ...

      投策国际化Lawrence version.xlsx

      Java程序的国际化的思路是将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就对应提供相应的资源文件。资源文件是key-value对,每个资源文件中的key是不变的,但value则随不同国家、...

      JAVA Web實現國際化插件

      該插件可實現,java web頁面語言的國際化,可實現語言轉換的插件。文件包括:ResourceBundle插件、PPT詳解。

      74个java面试题,只有题目没有答案

      使用 ResourceBundle 等类进行国际化处理。 31. Java 线程状态 * Java 中有哪些线程状态?新建状态、就绪状态、运行状态、阻塞状态、死亡状态等。 32. Java 序列化和反序列化 * 如何在 Java 中进行序列化和反...

      java操作属性文件.pdf

      * 国际化:属性文件可以存储不同的语言翻译信息,使得程序可以在不同的语言环境中运行。 * 用户设置:属性文件可以存储用户的个性化设置,例如界面设置、语言设置等。 Java 操作属性文件是 Java 编程语言中的一种...

      ResourceBundle类在jsp中的国际化实现方法

      今天第一次听说页面国际化这个词,所以查资料,顺便做了一个小页面,做做记录。 首先是两个资源文件,分别为msg_en_US.properties和msg_zh_CN.properties   显然中文字符是需要转换过来的。 这是jsp页面的代码 &...

      javaweb 国际化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

      本文主要介绍javaWEB国际化的知识,这里整理了详细的资料及实现代码,有兴趣的小伙伴可以参考下

      usn-i18n-nobundle:Java程序员的i18n框架,编译时可验证,免ResourceBundle

      Java 程序的国际化 (i18n) 通常涉及将数据与代码分离,将消息文本移动到格式化为文件并称为特殊文本资源集合。 不同语言的消息进入不同的属性文件,无论语言如何,各个消息都由其属性键标识。 这种将消息以“几乎纯...

      Struts2 in action中文版

      第11章 理解国际化 240 11.1 Struts 2框架和Java i18n 241 11.1.1 使用ResourceBundle和Locale取得本地化文本 241 11.1.2 Struts 2如何解决本地Java对i18n支持的问题 243 11.2 Struts 2 i18n示例 244 11.2.1 Struts ...

      Spring.3.x企业应用开发实战(完整版).part2

      15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 15.5.1 本地化概述 15.5.2 使用CookieLocaleResolver 15.5.3 使用SessionLocaleResolver 15.5.4 使用...

      Spring3.x企业应用开发实战(完整版) part1

      15.4.10 使用ResourceBundle ViewResolver 15.4.11 混合使用多种视图技术 15.5 本地化解析 15.5.1 本地化概述 15.5.2 使用CookieLocaleResolver 15.5.3 使用SessionLocaleResolver 15.5.4 使用...

      DbResourceBundle-开源

      java.util.ResourceBundle及其子类是Java中字符串国际化的基石。 DbResourceBundle提供了一种在符合JDBC的数据库中存储国际化字符串的方法,并保留了类似的接口。

      I18NEdit-开源

      用于 Java 和 PHP 项目国际化的工具。 允许不同译员对项目进行独立翻译,跟踪新需要的翻译。 在 Java ResourceBundle 系统之上工作,为其提供 PHP 适配器。

      struts in Action

      1. 介绍.........................................................................................................18 1.1. 关于本书...........................................................................

      Struts in Action中文版

      1. 介绍.........................................................................................................18 1.1. 关于本书..........................................................................

    Global site tag (gtag.js) - Google Analytics