【0】README

1) 本文部分文字描述转自 core java volume 2 , 旨在理解 java国际化——资源包 的基础知识 ;
2) 本文源代码idea 转自: (利用properties 文件进行国际化)https://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html 和 (利用.class 文件进行国际化)https://docs.oracle.com/javase/tutorial/i18n/resbundle/list.html


【1】java国际化——资源包相关

1)problem+solution

  • 1.1)problem: 当本地化一个应用时, 可能会有大量的消息字符串, 按钮标签和其它的东西需要被翻译;
  • 1.2)solution: 你会希望在外部定义消息字符串, 通常称之为资源。 在java中, 需要使用属性文件来设定字符串资源,并为其它类型的资源实现相应的类; (干货——java 资源的定义)

【2】定位资源包

1)当本地化一个应用时,会制造出很多资源包。每个包都是一个属性文件或者是一个描述了与 locale 相关的项的类。对于每一个包, 都要为所有你想要支持的 locale 提供相应的版本;
2)想要对这些包使用一种统一的命名规则: (干货——资源包统一命名规则)

2.1)包名语言国家;
2.2)包名_语言;
来命名所有和语言相关的资源。

  • 2.3)最后,作为后备, 可以把默认资源放到一个没有后缀的文件中;

    • 2.3.1)可以用下面的命令加载一个包:

      ResourceBundle resource = ResourceBundle.getBundle(bundleName, currentLocale);

    • 2.3.2) getBundle 方法试图加载匹配当前 locale 定义的语言和国家的包。如果失败, 通过依次放弃国家和语言来继续进行查找, 然后同样的查找被应用于默认的 locale;

    • 2.3.3)最后, 如果还不行的话就去查看默认的包文件, 如果这也失败了, 就抛出一个异常 MissingResourceException;

3)也就是说, getBundle 方法试图加载以下的包: (干货—— getBundle 方法试图加载包名的顺序)

(1)包名当前locale的语言当前Locale的国家_当前Locale的变量;
(2)包名当前locale的语言当前Locale的国家;
(3)包名_当前locale的语言;
(4)包名默认locale的语言默认Locale的国家_默认Locale的变量;
(5)包名默认locale的语言默认Locale的国家;
(6)包名_默认locale的语言;
(7)包名;

4)总之, java 的资源包机制会自动定位与给定的locale 匹配得最好的项。

  • 4.1)可以很容易地吧越来越多的本地化信息加到已有的程序中: 你需要做的只是增加额外的资源包;

【2】利用属性文件进行国际化

1)对字符串进行国际化是很直接的, 你可以吧字符串放到一个属性文件中, 典型的 属性文件内容如下: (干货——属性文件引入原因——为了对字符串进行国际化,需要定义属性文件)

computeButton=Rechnen
colorName=black
defaultPaperSize=210X297

  • 1.1)然后利用以上提到的规则去命名你的属性文件;

    MyprocStrings.properties
    MyprocStrings_en.properties
    MyprocStrings_de_DE.properties

  • 1.2)你可以直接加载包:如

    ResourceBundle bundle = ResourceBundle.getBundle(“MyProcStrings”, locale);

  • 1.3)要查找一个具体的字符串,可以调用:
    string str = bundle.getString(“colorName”);

  • Warning)

    • W1)存储属性的文件都是ASCII文件, 如果你需要将 Unicode 字符放到属性文件中, 那么请用\uxxxx 编码方式对它们进行编码。
    • W2)你可以使用 native2ascii 工具来产生这些文件;

2)看个利用.properties文件进行国际化的荔枝:

  • 2.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter5/ResourceBundle_Properties
  • 2.2)key source code at a glance:
public class PropertiesDemo
{// 显示与给定Locale相关的.properties文件中的key对应的valuestatic void displayValue(Locale locale, String key){ResourceBundle labels = ResourceBundle.getBundle("LabelBundle", locale);String value = labels.getString(key);System.out.println("locale = " + locale.getDisplayName() + ", key = " + key + ", value = " + value);}// 迭代与给定Locale相关的.properties文件中的keysstatic void iterateKeys(Locale locale){ResourceBundle labels = ResourceBundle.getBundle("LabelBundle", locale);Enumeration<String> keys = labels.getKeys();while(keys.hasMoreElements()){String key = keys.nextElement();String value = labels.getString(key);System.out.println("locale = " + locale.getDisplayName() + ", key = " + key + ", value = " + value);}}public static void main(String[] args){Locale.setDefault(Locale.ENGLISH);Locale[] supportedLocales = {Locale.CHINA,Locale.GERMAN,Locale.ENGLISH};System.out.println("=== the output of method displayValue is as follows: ===\n");for (int i = 0; i < supportedLocales.length; i++){displayValue(supportedLocales[i], "s2");}System.out.println();System.out.println("=== the output of method iterateKeys is as follows: ===\n");iterateKeys(supportedLocales[0]);}
}
  • 2.3)relative printing results as follows:


【3】利用包类进行国际化

1) 为了提供字符串外的资源,需要定义类, 它必须扩展于 ResourceBundle 类, 应该使用标准的命名规则来命名你的类, 如:(干货——资源绑定类引入原因——为了对字符串外的资源进行国际化,需要定义资源绑定类)(干货——包类的命名规则)

MyprogResources.java
MyprogResources_en.java
MyprogResources_de_DE.java

2)你可以使用 与 加载属性文件相同的getBundle 方法来加载这个类: (干货——加载资源绑定类与资源包的方法相同,即getBuddle)

ResourceBundle bundle = ResourceBundle .getBundle(“MyprogResources”, locale);

Warning) 当搜索包时, 如果在类中的包和在属性文件中的包中都存在匹配, 优先选择类中的包;
3)每一个资源绑定类都实现了一个查询表。

  • 3.1)你需要为每一个你想定位的设置都提供一个关键字字符串, 使用这个字符串来提取相应的设置, 如;

    Color background = (Color) bundle.getObject(“background”);
    double[] papersize = (double[]) bundle.getObject(“defaultSize”);

  • 3.2)使用资源绑定类的最简单方法就是 继承 ListReourceBundle类; (干货——使用资源绑定类的最简单方法就是 继承 ListReourceBundle类)

  • 3.3)ListReourceBundle: 让你把所有资源都放到一个对象数组并提供查找功能, 请遵循以下框架代码:

    public class bundleName_language_country extends ListResourceBundle
    {
    private static final Object[][] contents =
    {
    {key1, value1];
    {key1, value1];

    }
    public Object[][] getContents() { return contents ; }
    }

4)看个荔枝:

public class ProgramResource_de extends ListResourceBundle
{private static final Object[][] contents = {{"background",Color.black];{"defaultPaperSize", new double[]{210, 297}}...}     public Object[][] getContents() { return contents ; }
}

**5)**或者, 你的资源绑定类可以扩展 ResourceBundle 类。 然后需要实现两个方法, 一个是枚举所有键,二是用给定的键查找相应的值:

Enumeration<String> getKeys();
Object handleGetObject(String key);
ResourceBundle 类的 getObject 方法会调用你提供的 handleGetBundle 方法;

6)看个利用.class文件进行国际化的荔枝:

  • 6.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/tree/master/coreJavaAdvanced/chapter5/ResourceBundle_Class
  • 6.2)key source code at a glance:
public class ListResourceBundleDemo
{// 显示与给定Locale相关的.properties文件中的key对应的valuestatic void displayValue(Locale locale){ResourceBundle stats = ResourceBundle.getBundle("com.corejava.chapter573.StatsBundle", locale);Integer gdp = (Integer) stats.getObject("GDP");Integer population = (Integer) stats.getObject("Population");Double literacy = (Double)stats.getObject("Literacy");System.out.println("locale = " + locale.getDisplayName() + ", gdp = " + gdp + ", population = " + population + ", literacy = " + literacy);}public static void main(String[] args){Locale.setDefault(Locale.US);Locale[] locales = {new Locale("en", "CA"),new Locale("de", "DE"),new Locale("zh", "CN") };for (int i = 0; i < locales.length; i++){displayValue(locales[i]);}}
}
  • 6.3)relative printing results as follows:

java国际化——资源包相关推荐

  1. Java国际化资源绑定-----示例

    mess.properties文件: hello=Hello World! msg=Hello,{0}!Today is {1}. mess_en_US.properties hello=Hello ...

  2. Java 对国际化 (i18n) 的支持资源包的调用

    Java 国际化 i18n 国际化信息也成为本地化信息,一般需要2个条件才能确定一个特定的国际化信息,分别是:"语言类型" 和 "国家/地区信息",Java 为 ...

  3. Spire.Doc for Java的jar包、maven库-全套free资源

    Spire.Doc for Java的jar包.maven依赖-全套free资源 官方代码学习文档 官方免费jar包和maven依赖 Maven依赖:(3.88以下,不支持两个文章对照) e-iceb ...

  4. java导出jar包后,程序运行时读取图片、音乐资源文件

    java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar

  5. java获取jar包中的文件资源

    java获取jar包中的文件资源 一.问题示例 1.1 项目开发时 1.2 打包成jar后 二.解决方案 2.1 解决方法 2.2 实现 问题描述:   我们常常在代码中读取一些资源文件(比如图片,音 ...

  6. java国际化程序创建属性文件,Java程序国际化学习代码一

    Java程序国际化初识 1.基本思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每 ...

  7. Struts2的国际化(一)-国际化资源文件的配置及国际化信息的访问

    一.概述: 1)国际化是一种技术:在程序设计领域,把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化. 2)本地化是一个动作:与国际化对应的是本地化,指让一个具备国际 ...

  8. java 国际化 properties_java Properties 读取文件,国际化

    Properties类可以看成一个持久化的Properties文件 Properties文件可以被保存到一个流中或者从流载入 每一个键及其对应值在Properties中都必须是String类型. 注意 ...

  9. idea资源包下创建资源包_资源包技巧和最佳实践

    idea资源包下创建资源包 今天是资源捆绑日. 通常,这是Java中最著名的国际化机制(i18n). 使用它应该很容易. 但是,弄污双手时会出现许多小问题. 如果您有相同的想法,则此文章适合您. 基本 ...

最新文章

  1. Spring MVC 全局异常处理(1) --SimpleMappingExceptionResolver
  2. IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数
  3. 华为诺亚方舟实验室主任李航:神经符号处理开启自然语言处理新篇章
  4. 【Linux】一步一步学Linux——groupadd命令(87)
  5. C++ STL的妙用
  6. VS2013配置编译Caffe-Win10_X64
  7. 求斐波那契数列第n位的几种实现方式及性能对比
  8. python编程运算符号-Python中的逻辑运算符
  9. 使用vi打开文件如何跳到某一行,第一行或者最后一行呢
  10. 声纹识别中的召回和精度概念
  11. 微软ASP.NET AJAX框架剖析
  12. 【SCOI2005】【BZOJ1083】繁忙的都市(MST模板)
  13. linux大一实验报告,linux实验报告
  14. python的ols_Python Statsmodels 统计包之 OLS 回归
  15. Java的企业级开发项目--OA办公系统
  16. 通信行业名词解释ID、MD、HW、SW
  17. PySpark RDD 之collect、 take、top、first取值操作
  18. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告
  19. 用Python打造属于自己的“今日头条” | 一个非常适合练手的全栈项目
  20. 扫描格式的pdf文件怎样进行识别

热门文章

  1. HDU - 6071 Lazy Running 同余最短路 + 分层
  2. 【每日一题】7月17日题目精讲—BOWL 碗的叠放
  3. 【学习笔记】同余最短路
  4. CF1016F:Road Projects(树形dp)
  5. YbtOJ#883-最大的割【带修线性基】
  6. 欢乐纪中某A组赛【2019.7.11】
  7. 欢乐纪中某B组赛【2019.1.30】The penultimate day
  8. 2021牛客暑期多校训练营2 B-Cannon(组合+推式子)
  9. Codeforces Round #654 (Div. 2)
  10. SpringCloud Greenwich(一)注册中心之nacos、Zuul和 gateway网关配置