java bundle_java.util.ResourceBundle国际化用法详解

初识国际化和ResourceBundle

这个类主要用来解决国际化和本地化问题。国际化和本地化可不是两个概念,两者都是一起出现的。可以说,国际化的目的就是为了实现本地化,详细的介绍可以看本文的最后。比如对于“取消”,中文中我们使用“取消”来表示,而英文中我们使用“cancel”。若我们的程序是面向国际的(这也是软件发展的一个趋势),那么使用的人群必然是多语言环境的,实现国际化就非常有必要。而ResourceBundle可以帮助我们轻松完成这个任务:当程序需要一个特定于语言环境的资源时(如 String),程序可以从适合当前用户语言环境的资源包(大多数情况下也就是.properties文件)中加载它。这样可以编写很大程度上独立于用户语言环境的程序代码,它将资源包中大部分(即便不是全部)特定于语言环境的信息隔离开来。

这使编写的程序可以:

轻松地本地化或翻译成不同的语言

一次处理多个语言环境

以后可以轻松进行修改,以便支持更多的语言环境

测试及验证

下面我们来模拟一个多语言的环境

定义四个资源文件:res_en_US.properties、res_zh_CN.properties、res_zh.properties、res.properties

res_en_US.properties:cancelKey=cancel

res_zh_CN.properties:cancelKey=\u53D6\u6D88(取消)

res_zh.properties:cancelKey=\u53D6\u6D88zh(取消zh)

res.properties:cancelKey=\u53D6\u6D88default(取消default)

命名规则按照:资源名+_语言_国别.properties,每个资源文件中定义了本地化的信息,那么系统如何取到对应的资源文件呢?

ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));

其中new Locale("zh", "CN");这个对象就告诉了程序你的本地化信息,就拿这个来说吧:程序首先会去classpath下寻找res_zh_CN.properties

若不存在,那么会去找res_zh.properties,若还是不存在,则会去寻找res.properties,要还是找不到的话,那么就该抛异常了:MissingResourceException

我们可以来写个测试程序验证一下:

package bundle.test;

import java.util.Locale;

import java.util.ResourceBundle;

public class BundleTest {

public static void main(String args[]) {

ResourceBundle bundle = ResourceBundle.getBundle("res", new Locale("zh", "CN"));

String cancel = bundle.getString("cancelKey");

System.out.println(cancel);

bundle = ResourceBundle.getBundle("res", Locale.US);

cancel = bundle.getString("cancelKey");

System.out.println(cancel);

bundle = ResourceBundle.getBundle("res", Locale.getDefault());

cancel = bundle.getString("cancelKey");

System.out.println(cancel);

bundle = ResourceBundle.getBundle("res", Locale.GERMAN);

cancel = bundle.getString("cancelKey");

System.out.println(cancel);

}

}

输出:

取消

cancel

取消

取消

这里前三个都在我们的预期范围之内,但是最后一个GERMAN,应该会去使用res.properties这个资源包吧?怎么使用了res_zh_CH.properties?

原来ResourceBundle为我们提供了一个fallback(也就是一个备用方案),这个备用方案就是根据当前系统的语言环境来得到的本地化信息。

所以若是找不到GERMAN的,之后就会去找CHINA了,所以找到了res_zh_CH.properties这个资源包

这点我也是看了源代码才明白的,下面就贴上一些关键的源代码:

ResourceBundle baseBundle = null;

for (Locale targetLocale = locale;

targetLocale != null;

targetLocale = control.getFallbackLocale(baseName, targetLocale)) {// 这里就是去拿备用方案的

// do something 我们暂时不关心

}

跟踪control.getFallbackLocale(baseName, targetLocale)看看备用方案到底是什么?

public Locale getFallbackLocale(String baseName, Locale locale) {

if (baseName == null) {

throw new NullPointerException();

}

Locale defaultLocale = Locale.getDefault();

return locale.equals(defaultLocale) ? null : defaultLocale;

}

当显式定义的本地化信息并不是当前系统的本地化信息时,若未能通过显式定义的找到资源包,那么就去转而通过当前系统的本地化信息去找了~

最后放一点小知识吧~

国际化和本地化

国际化(Internationalization)是设计一个适用于多种语言和地区的应用程序的过程。适用于多种语言和地区的含义是当使用不同语言及处于不同的地区的用户在使用这个应用程序时,应用程序必须使用他们能看懂的语言和符合他们文化习惯来显示信息。国际化有时候被简称为i18n,因为有18个字母在国际化的英文单词的字母i和n之间。

一个国际化的程序通常具有以下特征:

有一个附加的本地化数据(localized  data)及拥有在全世界各个地区执行的能力。

文本的元素,比如状态信息或GUI截面的lables,不是直接写(hardcoded)在程序中,而是被存储在本地化的数据中,并且能被程序正确的动态的使用。

支持新的语言时,不需要修改程序,不需要重新编译。

文化差异的数据,比如日期和货币,必须根据拥护的语言和习惯显示不同的格式。

可以被迅速的本地化。

本地化(Localization)是指通过增加本地描述的构件(locale-specific components )和文字翻译工作来使应用程序适应于不同的语言和地区的过程。本地化有时候被简称为l10n,应为有10个字母在本地化的英文单词的字母l和n之间。通常本地化最耗时的工作应该是文字翻译。本地化工作者们要根据地区的具体需求来为日期、数字和通货等数据建立新的格式。其他类型的数据,象声音,图象等,也需要根据具体需要来决定是否本地化。

来自:http://blog.csdn.net/u012345283/article/details/42082253

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写基于事件的CQRS读取模型

关于事件源和CQRS的讨论似乎通常集中在CQRS上下文中的整体系统架构或领域驱动设计的各种形式。 但是,尽管也有一些有趣的考虑,但读取模型经常被忽略。 在本文中,我们将展示一个通过使用事件流填充视图模型的示例实现。 总览 读取模型的想法…

JSP数据交互

JSP数据交互 一、jsp中java小脚本 1.<% java代码段%> 2.<% java表达式%>不能有分号 3.<%!成员变量和函数声明%>二、注释 1.<!--html注释-->客户端可以看到 2.<%--jsp注释--%>客户端不能看到三、jsp页面的的执行过程 1.客户端请求&#xff08;输入…

java else if和switch_如何优雅地优化代码中的的if else和switch

引言一般来说&#xff0c;随着我们项目的迭代以及业务的越来越复杂&#xff0c;项目中的分支判断会原来越多。当项目中涉及到复杂的业务判断或者分支逻辑时&#xff0c;我们就需要考虑是否需要对项目进行重构了&#xff0c;或者if else和switch case是否能够满足当前项目的复杂…

jQuery data

一个简单的Cache (function(){var __cache {},Cache {get: function(__name){return __cache[__name] || undefined;}, set: function(__name, __value){return (__cache[__name] __value)}};this.Cache Cache; })();alert(Cache.get("name")); //undefine…

flink 复杂事件_复杂的(事件)世界

flink 复杂事件这篇博客文章试图总结CEP领域中的技术&#xff0c;并介绍它们的主要功能和不足。 有时似乎过度使用了CEP一词&#xff08;就像ESB一样&#xff09;&#xff0c;下面的内容反映了我们对它的理解和理解。 ESPER&#xff08; http://esper.codehaus.org/ &#xff0…

设计模式(中介者模式-对象去耦)

声明&#xff1a;本系列文章内容摘自《iOS设计模式》 中介者模式 用一个对象来封装一系列对象的交互方式。中介者使个对象不需要显式地相互调用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 何时使用中介者模式 1.对象间的交互虽定义明确然而非…

java flash截图_求大神们帮助, 如何在java中实现文字数据转换成图片或flash显示

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{response.setContentType("image/jpeg");createImage(response.getOutputStream());} private …

Spring Cloud Sidecar –节点初始化

在上一篇博客文章中&#xff0c;我描述了Sidecar应用程序如何用于在Eureka中注册Cassandra节点&#xff0c;并且更普遍地可以用于在Eureka中注册任何非JVM应用程序。 在本文中&#xff0c;我将介绍应用程序如何查询Sidecar注册节点。 发现注册的节点–初始化后 如果在Bean初始…

windows服务器的DDOS防御,

抵御 SYN 攻击 SYN 攻击利用了 TCP/IP 连接建立机制中的安全漏洞。要实施 SYN 洪水攻击&#xff0c;攻击者会使用程序发送大量 TCP SYN 请求来填满服务器上的挂起连接队列。这会禁止其他用户建立网络连接。 要保护网络抵御 SYN 攻击&#xff0c;请按照下面这些通用步骤操作&…

java传.net datetime_.net调java写的webService传过去的datetime,int等非string类型为null的问题...

使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题 收藏用C#.NET调用Java开发的WebService时&#xff0c;先在客户端封装的带有int属性的对象&#xff0c;当将该对象传到服务器端时&#xff0c;服务器端可以得到string类型的属性值&#xff0c;却不能…

arcengine,深入理解游标Cursors,实现数据的快速查找,插入,删除,更新

风过无痕 原文 arcengine,深入理解游标Cursors&#xff0c;实现数据的快速查找&#xff0c;插入&#xff0c;删除&#xff0c;更新 深入理解游标Cursors&#xff0c;实现数据的快速查找&#xff0c;插入&#xff0c;删除&#xff0c;更新 1、查找数据Search Cursors //by yl …

guice 框架_玩! 框架+ Google Guice

guice 框架在我目前正在工作的项目中&#xff0c;我们开始使用Google Guice。 对于那些不知道的人&#xff0c; Google Guice是一个依赖项注入框架。 依赖项注入的基本思想是提供一个其依赖的类&#xff0c;而不是使依赖类负责实例化它所依赖的对象。 Play具有用于整合Guice的模…

js中,实现对键盘按键的监听:

<script>function keyUp(e) { var currKey0,ee||event; currKeye.keyCode||e.which||e.charCode; var keyName String.fromCharCode(currKey); alert("按键码: " currKey " 字符: " keyName); } document.onkeyup keyUp;</scrip…

java程序运行结果题_2016年关于Java编程与程序运行结果笔试题

2016年关于Java编程与程序运行结果笔试题1.Java编程,打印昨天的当前时刻public class YesterdayCurrent{public void main(String[] args){Calendar cal Calendar.getInstance();cal.add(Calendar.DATE, -1);System.out.println(cal.getTime());}}2.文件读写,实现一个计数器pu…

Hystrix简介– Hello World

在先前的博客文章中&#xff0c;我谈到了需要像Netflix Hystrix这样的库的动机。 在这里&#xff0c;我将跳入一些非常基本的方法来开始使用Hystrix&#xff0c;并在更复杂的用例中进行后续介绍。 你好&#xff0c;世界 以下是“ Hystrix命令”的一个简单的Hello World示例&am…

Unity 继承MonoBehaviour下方法通过鼠标触控与物体交互

要通过鼠标的进入、离开、悬停、拖拽等动作实现与物体的交互时&#xff0c;我们可以使用继承MonoBehaviour的脚本下的与鼠标相关的方法。具体有以下方法&#xff1a; //当鼠标按下时被调用private void OnMouseDown(){Debug.Log("鼠标按下了");}//当鼠标按下并拖动时…

Collection中list集合的应用常见的方法

集合 &#xff1a; 用存放对象的容器(集合) Collection &#xff1a; 跟接口 &#xff1a; 单列集合 ---> List :有序的 &#xff0c;元素是可以重复的。 ---> Set : 无序的 &#xff0c;元素是不可以重复的。 Collectionz红常用的方…

js base64编码 java 解码_JavaScript字符串的Base64编码与解码

有时文本里包含一些不可打印的符号&#xff0c;而你需要把它们传输到服务器&#xff0c;这时我们会需要用到Base64编码。或者你需要把一个图片内容以文本格式嵌入到网页中&#xff0c;这时你也会用到 Base64 编码。所谓 Base64 是一种基于64个可打印字符来表示二进制数据的方法…

linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本

1、下载mysql5.5.12和cmakewgethttp://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.12-linux2.6-i686.tar.gzwget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz2、安装cmakemkdir /usr/local/cmake切换到存放cmake-2.8.4.tar.gz到目录tar zxvfcmake-2.8.4.tar.gzcd cm…

iOS中如何监测来电

http://blog.csdn.net/liujinlongxa/article/details/44207587转载于:https://www.cnblogs.com/it-k-50/p/6122844.html