今天在工作中用到了ResourceBundle这个类,随手总结一下。
JDK文档中是这样说明它的:
使用这种方式,可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。
- 轻松地本地化或翻译成不同的语言
- 一次处理多个语言环境
- 以后可以轻松进行修改,以便支持更多的语言环境
我在这里只说一种用法。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 用于表示当前的语言环境。
- 构造方法:首先从配置文件、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);
- getKeys():
@Override
public Enumeration getKeys()
{
return props.keys();
}
- 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的源码,你的疑惑就会消失了。
文章中有什么不对的地方朋友们可以毫不留情的指出,希望能与大家交流。
分享到:
相关推荐
国际化插件——ResourceBundle Editor是专门用于处理Java应用程序中国际化(i18n)资源管理的工具。在软件开发过程中,为了使应用能够适应不同语言和文化环境,开发者通常会使用ResourceBundle,这是一个Java类库,...
这个"JAVA-Internationalization-tutorial.rar"压缩包包含了一个关于Java国际化的教程和源代码,是学习和理解这一主题的好资源。 在Java中,国际化涉及以下几个核心概念: 1. **资源包(Resource Bundle)**:这是...
Java国际化(Internationalization)与时间处理是开发过程中两个重要的领域,尤其对于构建全球化应用程序来说,理解和掌握这些概念至关重要。国际化允许软件适应不同地区的语言、文化习惯和格式,而时间处理则涉及...
Java作为广泛使用的编程语言之一,提供了强大的国际化支持。国际化,通常指软件能够支持多种语言和地区的不同习惯,...遵循Java国际化官方指南,开发者可以将应用程序本地化为多种语言,适应不同地区用户的使用习惯。
Java作为一种广泛使用的编程语言,提供了强大的国际化支持。本篇将深入探讨Java中实现国际化的必备工具以及相关的编码转换问题。 一、Java中的国际化 1. **资源绑定文件(Properties文件)** 在Java中,我们通常...
Java国际化实现框架底层源码分析 Java国际化(i18n,Internationalization)是为了支持不同地区的语言和文化差异,提供了一种灵活的方式来管理和显示应用程序的文本、日期、数字和其他文化敏感的信息。Java提供了...
其次,ResourceBundle是Java国际化的关键组件,用于管理应用程序中的字符串和其他资源。它允许开发者将字符串和其他资源存储在不同语言版本的properties文件中。例如,baseName_en.properties包含英文资源,baseName...
通过以上方法,开发者可以有效地解决Java国际化过程中遇到的中文乱码问题。`BundleEditor` 提供的工具集可以简化这个过程,提高开发效率,并确保应用程序在全球范围内提供一致且正确的用户体验。为了充分利用这个...
Java国际化(i18n)是Java平台为支持全球不同地区的用户和语言而设计的一种机制。i18n这个名字来源于“internationalization”这个单词,其中'i'是第9个字母,'n'是第14个字母,所以18代表了两者之间的字母数。Java的...
Java国际化组件是Java开发中一个重要的功能模块,它允许开发者为不同地区的用户创建多语言支持的应用程序。在Java中,国际化通常通过使用Resource Bundle和Java的Locale类来实现。资源库(Resource Bundle)包含了...
Java 国际化(i18n)是开发支持多语言的应用程序的关键步骤,使得软件能够适应不同国家和地区用户的需求。以下将详细讲解Java中实现国际化涉及的主要知识点: 1. **软件国际化的意义**: - 提高软件的全球适用性,...
8. **国际化(Internationalization, i18n)**:Java提供强大的国际化支持,通过ResourceBundle和Locale类,可以方便地为不同语言的用户提供界面。 9. ** Accessibility API**:Java Accessibility API使得开发者...
此外,开发工具也是实现Java国际化的重要辅助。Eclipse和IntelliJ IDEA等IDE都提供了方便的资源文件管理功能,可以轻松编辑和管理多语言的`.properties`文件。 在实际项目中,为了确保代码的可维护性和扩展性,通常...
6. 国际化与本地化:`java.text`包中的类,如`MessageFormat`和`ResourceBundle`,在处理多语言内容时,需要考虑如何存储和读取UTF-8编码的资源文件。 7. 编译器参数:Java编译器`javac`支持`-encoding`选项,可以...
Java国际化的概念主要涉及到软件在全球范围内适应不同语言和文化环境的能力。在Java中,这个过程称为i18n(国际化)和l10n(本地化)。i18n是"internationalization"的首字母缩写,而l10n是"localization"的首字母...
9. **国际化与本地化**:如果项目支持多语言,那么会涉及到ResourceBundle和Locale来实现。 10. **异常处理**:在编写GUI程序时,需要妥善处理可能出现的异常,以确保程序的健壮性。 11. **打包与部署**:了解如何...
8. **国际化与本地化**: Java 1.6提供了Locale类来支持不同地区的语言和文化习惯,ResourceBundle类用于管理应用程序的本地化资源。 9. **Swing和AWT**: Java的图形用户界面(GUI)框架包括AWT(Abstract ...
5. **国际化与本地化**: 为了适应全球用户,高级界面设计需要考虑多语言支持。Java提供了ResourceBundle和Locale类,使程序能根据用户的选择显示相应语言的界面。 6. **图形和图像处理**: Java的Graphics2D类允许...
8. **国际化与本地化**:虽然没有具体说明,但考虑到QQ是面向全球用户的,项目可能考虑到了多语言支持。Java提供ResourceBundle类来实现这一功能,允许根据用户的语言设置加载相应的字符串资源。 9. **测试与调试**...