java国际化——资源包

【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:

这里写图片描述

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

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

相关文章

ui自动化测试测试报告_您需要了解的有关UI测试的所有信息

ui自动化测试测试报告让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么&#xff1f; 接口&#xff0c;当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败&#xff0c;这就是为什么越来越多的人选择对其Web应用程序…

Tomcat解决HTTP GET中文乱码

一、中文乱码原因 Tomcat默认是按ISO-8859-1进行URL解码&#xff0c;ISO-8859-1并未包括中文字符&#xff0c;中文字符不能被正确解析了。 二、配置编码 在tomcat的conf/server.xml下的connetor属性中增加URIEncoding或者useBodyEncodingForURI属性 &#xff08;1&#xff0…

NanoHTTPD web server的一个简单荔枝

【0】README 0.1&#xff09;本文旨在演示一个简单荔枝&#xff0c;以说明如何使用 NanoHTTPD web server 和 浏览器访问 该server的效果 -------------------------------------------------------------- App.java public class App extends NanoHTTPD {public App() thr…

throwable_您想了解的所有Throwable

throwable本文是有关异常的教程。 但不是通常的一种。 其中有许多内容可以告诉您异常的含义&#xff0c;如何抛出异常&#xff0c;捕获异常&#xff0c;已检查异常和运行时异常之间的区别&#xff0c;等等。 没有必要了。 这对您来说也很无聊。 如果没有&#xff0c;那么请阅读…

Linux Tomcat安装

一、linux 安装软件的步骤 &#xff08;1&#xff09;下载软件的压缩包 &#xff08;2&#xff09;解压到指定的目录 &#xff08;3&#xff09;配置环境变量 &#xff0c;配置PATH&#xff08;在任意目录启动&#xff0c;这PATH可以省略&#xff0c;若不配置只有安装目录才…

java分布式对象(RMI+部署使用RMI的程序)

【0】README 1&#xff09;本文文字转自 core java volume 2&#xff0c; 旨在学习 java 分布式对象的相关知识&#xff1b; 2&#xff09; RMI 的实例程序为原创&#xff1b; 3&#xff09; RMI部署步骤的测试用例&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/arti…

java 创建uri_使用UriBuilder快速创建URI

java 创建uri如果您有权访问JAX-RS API和项目中的实现&#xff08;很多&#xff09;&#xff0c;则可以使用JAX-RS的UriBuilder通过使用可解析占位符的构建器模式方便地创建URI。 看下面的例子&#xff1a; String host System.getProperty( "host" , "localh…

Tomcat 服务自动启动

一、配置/etc/rc.local rc.local是linux启动init之后执行的脚本。 sudo vi /etc/rc.local 添加如下一行 /home/myuser/software/apache-tomcat-7.0.29/bin/startup.sh&#xff08;脚本绝对路径&#xff09; 二、sysv-rc-conf 工具配置 1、安装 sysv-rc-conf sudo apt-get …

java分布式对象RMI应用测试用例

【0】README 0.1&#xff09;本文旨在对http://blog.csdn.net/PacosonSWJTU/article/details/50705192 中的代码进行实践&#xff08;如何部署一个使用RMI框架的程序以进行远程调用&#xff09;&#xff1b; 0.2&#xff09; for complete source code, please visit https…

neo4j 迁移_在Kubernetes中迁移Neo4j图模式

neo4j 迁移在零停机时间下运行企业应用程序时&#xff0c;我们需要能够执行数据库架构迁移而又不中断活动用户。 这不仅对于关系数据库很重要&#xff0c;而且对于诸如Neo4J之类的图数据库也很重要&#xff0c;后者不会在write上强制执行架构。 但是&#xff0c;重构图形并使图…

Windows访问Linux的Tomcat,显示无法连接

一、端口占用 先查看tomcat下的logs日志文件&#xff0c;如果现实地址已被占用&#xff0c;则需重新修改端口。 tomcat默认启动的是8080&#xff0c;如果你想修改为80&#xff0c;则需要修改server.xml文件:vim $CATALINA_HOME/conf/server.xml #如果没有配置$CATALINA_HOME&am…

java分布式对象——远程方法中的参数和返回值+远程对象激活

【0】README 1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java分布式对象——远程方法中的参数和返回值远程对象激活 的相关知识&#xff1b; 【1】远程方法中的参数和返回值 1&#xff09; 在开始进行远程方法调用时&#xff0c;调用参数需要从…

wcf:rest_REST:管理多对多关系

wcf:rest介绍 管理多个资源之间的关系可能是RESTful API的重要组成部分。 在这篇文章中&#xff0c;我们将看到使用REST API可以管理多对多关系。 我们以一个简单的用户 / 组关系为例。 假设用户和组是两个单独的资源&#xff08;例如/ users和/ groups &#xff09;&#xff…

java安全——类加载器+字节码校验+安全管理器与访问权限

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全 的相关知识&#xff1b; 【1】类加载器 1&#xff09;java 技术提供了以下3种确保安全的机制&#xff08;mechanism&#xff09;&#xff1a; m1&#xff09;语言设计特性&am…

Tomcat的web项目部署方式

一、host配置Context 在tomcat中的conf目录中&#xff0c;在server.xml中的&#xff0c;<host/>节点中添加&#xff1a; <Context path"/app" docBase"D:/myeclipse/firstapp/WebRoot" debug"0" privileged"true" reloadab…

java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法

1&#xff09;problem 出现 java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException 异常的原因是&#xff0c;在命令行执行 rmiregistry&#xff0c;并没有指定好 绑定时查找的类文件的路径。 …

javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!

javafx 图标动机 自2013年以来&#xff0c;我一直在编写JavaFX应用程序和库的代码&#xff0c;它们的共同点是&#xff0c;我需要找到可以用于它们的良好图标/图形。 作为前Swing开发人员&#xff0c;我首先使用图像文件&#xff0c;GIF或PNG。 通常&#xff0c;我会从IconExpe…

java安全 ——JAAS(Java 认证和授权服务)开发指南

以下内容转自&#xff1a; http://lyb520320.iteye.com/blog/720478【0】README1&#xff09;本文翻译自&#xff1a;http://java.sun.com/developer/technicalArticles/Security/jaasv2/2&#xff09;传统的JAVA安全机制没有提供必要的架构支持传统的认证和授权&#xff1b;在…

aws dynamodb_AWS Lambda将数据保存在DynamoDB中

aws dynamodb在本教程中&#xff0c;我们将看到如何使用AWS Lambda将数据保存在Dynamo DB中。 这是必需的步骤&#xff1a; – 在Dynamo数据库中创建一个名为Employee的表 –创建一个AWS Lambda函数&#xff0c;该函数可以使用Dynamo DB中的Employee POJO保存员工的名字和姓…

Tomcat处理一个HTTP请求的过程

一、Tomcat的组成 &#xff08;1&#xff09;Server服务器元素代表整个catalina servlet容器。是单例模式。 &#xff08;2&#xff09;ServiceService是这样一个集合&#xff1a;它由一个或者多个Connector组成&#xff0c;以及一个Engine&#xff0c;负责处理所有Connector所…