java.util.ResourceBundle用法详解 你的名字 2022-08-06 04:30 86阅读 0赞 ## 初识国际化和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之间。通常本地化最耗时的工作应该是文字翻译。本地化工作者们要根据地区的具体需求来为日期、数字和通货等数据建立新的格式。其他类型的数据,象声音,图象等,也需要根据具体需要来决定是否本地化。
相关 JNDI用法详解 > JNDI全称(Java Naming and Directory Interface),是java命名和目录接口。它是一个应用程序设计的API,为开发人员提供了查找和访问各 谁践踏了优雅/ 2022年12月23日 12:26/ 0 赞/ 238 阅读
相关 const用法详解 一、定义常量 使用\define的不安全性 include <iostream> using namespqce std; int main( 怼烎@/ 2022年12月19日 11:43/ 0 赞/ 165 阅读
相关 defaultdict用法详解 defaultdict用法详解 defaultdict与dict区别 defaultdict使用方法 defaultdict与dict区别 ゞ 浴缸里的玫瑰/ 2022年10月08日 05:48/ 0 赞/ 193 阅读
相关 JavaScript用法详解 简介 JavaScript 秘密花园是一个不断更新,主要关心 JavaScript 一些古怪用法的文档。 对于如何避免常见的错误,难以发现的问题,以及性能问题和不好的实践 待我称王封你为后i/ 2022年06月05日 10:11/ 0 赞/ 153 阅读
相关 @ModelAttribute用法详解 转载于:[https://blog.csdn.net/harry\_zh\_wang/article/details/57329613][https_blog.csdn.net 傷城~/ 2022年05月27日 00:39/ 0 赞/ 270 阅读
相关 FormData用法详解 转载自:[https://blog.csdn.net/zqian1994/article/details/79635413][https_blog.csdn.net_zqian - 日理万妓/ 2022年05月08日 08:46/ 0 赞/ 357 阅读
相关 FormData用法详解 FormData 对象: ![formdata][] 一.创建一个formData对象实例的方式 1、创建一个空对象 var formData = new 爱被打了一巴掌/ 2022年03月22日 03:15/ 0 赞/ 313 阅读
相关 ProcessBuilder 用法详解 原文:https://blog.csdn.net/zhoujing\_0424/article/details/79917368 1. 简介 ProcessBuilde 超、凢脫俗/ 2022年01月06日 14:43/ 0 赞/ 640 阅读
相关 @RequestMapping用法详解 一、@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于S 比眉伴天荒/ 2021年10月01日 00:18/ 0 赞/ 404 阅读
还没有评论,来说两句吧...