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

深入ResourceBundle

阅读更多

ResourceBundle是java开发中非常实用的一个类,主要用来处理应用程序多语言这样的国际化问题。

 

如果你的应用程序如果有国际化的需求,可以考虑使用ResourceBundle, 你要做的就是给出满足特定格式的Properties 文件,例如

 

resource.propreties

 

resource_zh_CN.properties

 

resource_ja_JP.properties.

 

然后应用程序使用ResourceBundle.getBundle(“resource”, locale) 就可以自动的搜索的相应Locale的Properties 文件。

 

虽然看起来很方便,但使用起来需要注意两个问题: 1 Properties 文件的搜索次序, 2.  决定是否能找到Properties 文件的ClassLoader , 这也是很多初学者遇到的问题

 

1.  搜索次序。

 

先来看个例子,假设你的系统只有两个Properties

 

(1) resource.zh_CN.properties : 中文的Properties

 

(2) resource.properties  : 英文的Properties

 

假设你Java 的default locale是zh_CN,  如果你调用 ResourceBundle.getBundle(“resource”, Locale.US) , 你觉得系统会使用哪一个文件中的内容?

 

很多人会觉得会使用resource.properties 中的内容, 但实际上不是这样的,当你传入一个Locale.US 给ResourceBundle的时候 ,  ResourceBundle的搜索次序是这样:
(1) resource_en_US.properties     --- 没找到
(2) resource_en.properties           --- 还是没找到
(3) resource_zh_CN.properties  ---- default locale, 找到了
(4) resource_zh_properties      
(5) resource.properties              

 

注意,ResourceBundle会自动的加上一个default locale 即 zh_CN 来搜索

 

系统没有找到xxxx__en_US.properties,  也没有找到xxx_en.properties, 而是找到了xxx_zh_CN.properties, 就会使用其中的内容, 所以你看的的是中文的结果。

 

实际上ResourceBundle 搜索结束以后,会建立一个ResourceBundle 对象的Chain, 对于上面的例子会是这样:

 

ResourceBundle_2  [locale=zh_CN , parent = ResourceBundle_1]

 

ResourceBundle_1 [locale = empty parent = null]

 

你可能要问,这个链表中问什么没有en_US,en 和zh相关的信息?   这是因为他们相关的Properties 不存在, 没有必要加入这个链表中。

 

如果你的应用程序访问resource文件的一个值得时候, 系统会先在ResourceBundle_2[Locale=zh_CN] 这个对象中找, 如果找到,直接返回相应的值

 

如果没有找到,顺着parent 即ResourceBundle_1继续寻找, 如果还没有找到,只好返回null 了, 因为没有parent 了

 

2. ClassLoader

 

这个也是经常出问题的地方, 很多时候当你准备好各种Locale 的Properties 文件, 调用ResourceBundle.getBundle(“resource”, Locale.US) 时,系统总是告诉你, 找不到resource_en_US的文件, 很是令人抓狂。

主要的原因就是ClassLoader 不对 ,有空接着写 :-)

分享到:
评论

相关推荐

    Xml ResourceBundle简单实现

    本文将深入探讨Xml ResourceBundle的实现原理、优势以及如何在实际项目中使用。 首先,我们来理解什么是ResourceBundle。在Java中,ResourceBundle是一个接口,用于管理应用程序中的可配置资源,如字符串、图像或...

    信息绑定ResourceBundle

    本文将深入探讨“信息绑定ResourceBundle”这一主题,并结合提供的`conndb.properties`文件,介绍如何使用ResourceBundle进行资源配置。 首先,让我们了解什么是ResourceBundle。ResourceBundle是Java API中用于...

    ResourceBundle:资源包,包括图片源代码-源码包

    在Java编程语言中,`ResourceBundle` 是一个关键的类,用于管理应用程序的...通过深入研究这个源码包,开发者可以更好地理解 `ResourceBundle` 的工作原理,提升自己在构建多语言、多文化支持的应用程序方面的技能。

    ResourceBundleEditor_v0.7.5 eclipes国际化插件

    首先,让我们深入了解`ResourceBundle`的概念。在Java中,`ResourceBundle`是处理国际化资源的标准方式,它存储了一组特定语言环境下的字符串和其他数据。通过使用`ResourceBundle`,开发者可以在不修改代码的情况下...

    深入学习JFC Swing(教材)

    Swing支持多语言应用开发,通过ResourceBundle和Locale对象,开发者可以轻松实现应用的国际化和本地化,满足全球用户的需求。 总结,《深入学习JFC Swing》教材涵盖了Swing的各个方面,从基本组件的使用到高级特性...

    Swing深入.rar

    10. **国际化(i18n)支持**:Swing内置了对多语言的支持,可以通过ResourceBundle加载不同语言的资源文件,使应用程序能够适应不同的地区和文化。 总的来说,“Swing深入”这份资料会带你全面了解Swing的各种特性...

    Java语言对properties资源文件的处理

    在深入探讨Java语言如何处理properties资源文件之前,我们先来明确一下properties文件的基本概念和用途。Properties文件是一种常用的配置文件格式,在Java开发中被广泛应用于存储应用的各种配置信息,如数据库连接...

    深入浅出Java Swing程序设计

    Swing支持多语言环境,通过ResourceBundle和Locale对象,开发者可以轻松实现应用程序的国际化和本地化,使其适应全球用户的需求。 八、Swing小工具(Utils) Swing还提供了一些实用工具类,如SwingUtilities、...

    深入浅出freemaker

    5. **国际化(i18n)**:FreeMarker支持多语言,你可以使用`<#t>`标签配合资源包(ResourceBundle)来实现国际化功能。 6. **安全编程**:FreeMarker允许输出用户提供的数据,因此需要关注XSS攻击。使用`?html`等...

    xspanner汉化

    《XSpanner汉化详解——深入理解源码与工具应用》 XSpanner,作为一个开源项目,其汉化过程涉及到软件本地化的重要概念和技术。在本文中,我们将深入探讨XSpanner的汉化过程,以及如何利用源码和工具进行有效的本地...

    深入学习:JFC Swing

    Swing支持多语言环境,提供了Locale对象和ResourceBundle类来实现应用程序的国际化。 9. **Swing小组件(Swing Utilities)**: Swing提供了一些实用工具类,如SwingUtilities,它们包含了诸如异步执行、线程同步...

    struts2国际化demo

    解压并研究这些文件将有助于深入理解Struts2国际化的具体实现方式。 总结来说,"Struts2国际化demo"是一个教育性的实例,旨在教授开发者如何利用Struts2框架提供多语言支持。通过创建和配置资源文件,结合拦截器和...

    Java国际化编程及其实现.rar

    通过分析和学习这些实例,开发者能更深入地理解Java国际化的工作原理,并能在自己的项目中有效地应用。 总的来说,Java的国际化特性使得开发者能够创建全球化的产品,满足不同地区用户的需求。熟练掌握这一技术对于...

    flex_locale.zip

    通过查看这个文件,你可以更深入地理解如何在实践中运用Flex的国际化功能。 总的来说,了解和掌握Flex的国际化特性对于开发多语言应用至关重要。"flex_locale.zip"中的示例教程将帮助你理解和实践这一过程,提高你...

    Flex实现国际化样例

    Flex是Adobe公司开发的一种用于构建富互联网应用程序(RIA)...在阅读提供的博客链接(https://orientalpigeon.iteye.com/blog/910425)后,你将获得更深入的实践指导和示例代码,有助于你更好地掌握Flex的国际化实现。

    JAVA_国际化程序实现

    下面我们将深入探讨Java中实现国际化程序的步骤和关键概念。 首先,我们需要理解`ResourceBundle`类,它是Java i18n的核心。`ResourceBundle`用于存储特定语言或区域的字符串和其他可本地化资源。这些资源通常保存...

    java国际化实现框架底层源码

    下面我们将深入探讨Java国际化实现的原理,并结合`SearchZhUtil.java`源码进行分析。 1. **java.util.Locale** Locale对象代表了一个特定的语言环境,包括语言、国家和变体。例如,"zh_CN"表示简体中文,"en_US...

    异常信息国际化

    下面我们将深入探讨这个主题。 首先,`I18N.java` 文件可能是一个Java类,用于实现国际化的功能。在Java中,我们可以使用`java.util.ResourceBundle` 类来管理不同语言的资源文件。这些资源文件通常以`.properties`...

    加载properties配置文件的几种方法

    本文将深入探讨在SSM框架下加载properties配置文件的几种常见方法。 1. **使用Spring的PropertyPlaceholderConfigurer** Spring提供了`PropertyPlaceholderConfigurer`类,可以方便地从.properties文件中读取属性...

    struts国际化示例代码

    通过分析和运行这些示例,你可以更深入地理解Struts框架中的国际化实现。 总的来说,Struts的国际化功能使开发者能够轻松地为全球用户提供定制的用户体验,只需维护一套包含各种语言版本的资源文件即可。这个过程...

Global site tag (gtag.js) - Google Analytics