文档章节

二十,国际化程序实现

ARESXIONG
 ARESXIONG
发布于 2015/04/29 01:38
字数 1437
阅读 8
收藏 0

1. 国际化简介

一个程序可以同时适应多个不同国家人的语言要求,那么这样的程序称为国际化程序.Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用,为了解决这个问题Java给我们提供了一个工具类ResourceBundle,帮助我们实现Java的国际化,核心的思想就是,对不同的语言提供一个不同的资源文件.

如果想要实现国际化程序,需要依靠Locale,ResourceBoundle,MessageFormat三个类完成,并接合属性文件(*.properties). 即需要的资源文件.资源文件的内容由key-value对组成.

  • java.util.ResourceBundle:用于加载一个资源包.

  • java.util.Locale:对应一个特定的国家/区域、语言环境.

  • java.text.MessageFormat:用于将消息格式化.

定义资源文件的规范 :
如果我们将缺省的资源文件的文件名取名为message.properties,那么相应的其他语言的资源文件名就是message_语言代码_国家代码.properties.例如:我们的语言汉语的语言代码是zh,国家代码是CN,所以简体中文的资源文件名就是:message_zh_CN.properties,英语的语言代码是en,美国的国家代码是US,所以美国英语的资源文件就是: message_en_US.properties.

资源文件的命名可以有3种格式:
message_language_country.properties
message_language.properties
message_properties

2. Locale类

Locale表示的就是一个地区,在国际化程序中通过Locale制定当前所在的地区,比如中国zh_CN,美国en_US.

创建Locale对象有两种方式:

  • public static Locale getDefault()

  • public Locale(String language,String country)

要实现国际化操作,只有Locale类是不够的,还需要配合属性文件存在,一个地区的Locale对象都应该存在一个不同的属性文件.找到属性文件后,需要将内容读取出来,这就需要依靠ResourceBoundle类读取.

3. ResourceBoundle

ResourceBoundle类的示例获取类似的也有两种方法.可根据指定参数获取相应的资源,常用方法如下:

  • ResourceBundle.getBundlemessage//获取当前系统所使用的区域环境获得指定资源文件

  • ResourceBundle.getBundlemessage,locale//根据指定的区域获取对应的资源文件

需要注意的是属性文件中是不能有中文的,所以需要进行转码操作,转换成UNICODE.JDK 中提供了一个转码工具bin\native2ascii.exe.

示例:

package com.ares.localedemo;
import java.util.Locale;
import java.util.ResourceBundle;
public class LocaleDemo02 {
	public static void main(String[] args) {
		Locale chLoc = new Locale("zh", "CN"); // 指定中文环境
		Locale enLoc = new Locale("en", "US"); // 指定英文环境
		// 要找到Message的属性文件,此时操作时省略了后缀,并指定了操作的区域
                        //属性文件为同目录下的 Message_zh_CN.properties, Message_en_US.properties
                        //如果没有对应的国家属性文件则默认匹配 Message.properties文件.
		ResourceBundle chRb = ResourceBundle.getBundle("Message", chLoc);
		ResourceBundle enRb = ResourceBundle.getBundle("Message", enLoc);
		String zhValue = chRb.getString("info"); // 根据key找到内容
		String enValue = enRb.getString("info"); // 根据key找到内容
		System.out.println("中文内容为:" + zhValue);
		System.out.println("英文内容为:" + enValue);
	}

}



4. 动态文本

属性文件中有的字符显示是动态加载的,所以可以通过占位符的方式实现.若要输出的消息中必须包含动态的内容,这些内容必须是从程序中获取的,可利用带占位符的国际化资源文件来实现.
处理:  MessageFormat.format
()
格式:  {编号}

示例1:

package org.lxh.localedemo;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class LocaleDemo03 {
	public static void main(String[] args) {
		Locale chLoc = new Locale("zh", "CN"); // 指定中文环境
		Locale enLoc = new Locale("en", "US"); // 指定英文环境
		// 要找到Message的属性文件,此时操作时省略了后缀,并指定了操作的区域
		ResourceBundle chRb = ResourceBundle.getBundle("Message", chLoc);
		ResourceBundle enRb = ResourceBundle.getBundle("Message", enLoc);
		String zhValue = chRb.getString("info"); // 根据key找到内容
		String enValue = enRb.getString("info"); // 根据key找到内容
		System.out.println("中文内容为:" + MessageFormat.format(zhValue, "李兴华", 10));
		System.out.println("英文内容为:" + MessageFormat.format(enValue, "lxh", 20));
	}

    //properties中为:  info= xxxx {0} {1}
}
示例2 :
import java.text.MessageFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * 演示Java的国际化
 * 
 * @author Abu
 * 
 */
public class ParamFormat {

    /**
     * @param args
     */
    public static void main(String[] args) {

        // 测试美国英语的资源文件
        testDefault();
        // 测试缺省的资源文件
        testCustom();
    }

    public static void testDefault() {
        // 获得缺省的系统区域
        Locale locale = Locale.getDefault();
        // 获得资源文件
        ResourceBundle rb = ResourceBundle.getBundle("message",locale);

        // 获得相应的key值
        String greeting = rb.getString("greeting");
        String userInfo = rb.getString("userinfo");

        String name = "liky";
        int age = 18;
        Date birth = new Date();

        // 格式化参数,注意是一个Object的数组,这意味着可以将任何类型的对象来格式化模板.
        Object[] params = { name,age,birth };

        // 格式化参数,返回格式后的字符串
        String result = MessageFormat.format(userInfo,params);

        System.err.println(greeting + result);
    }

    public static void testCustom() {
        // 设置定制的语言国家代码
        Locale locale = new Locale("en_US");
        // 获得资源文件
        ResourceBundle rb = ResourceBundle.getBundle("message",locale);
        // 获得相应的key值

        String greeting = rb.getString("greeting");
        String userInfo = rb.getString("userinfo");

        String name = "liky";
        int age = 18;
        Date birth = new Date();

        // 格式化参数,注意是一个Object的数组,这意味着可以将任何类型的对象来格式化模板.
        Object[] params = { name,age,birth };

        // 格式化参数,返回格式后的字符串
        String result = MessageFormat.format(userInfo,params);

        System.err.println(greeting + result);
    }
}
src 目录下创建两个文件:

message.properties
greeting=\u4f60\u597d\uff0c
userinfo=\u540d\u5b57\uff1a{0}\uff0c\u5e74\u9f84\uff1a{1}\uff0c\u751f\u65e5\uff1a{2}\u3002

message_en_US.properties
greeting=Hello,
userinfo=name: {0},age: {1},birthday: {2}.

打印结果:

你好,名字:liky,年龄:18,生日:13-2-23 下午4:26.
Hello,name: liky,age: 18,birthday: 13-2-23
下午4:26.

总结:

JAVA国际化流程 : ResourceBundle根据Locale加载资源文件 -> 返回一个ResourceBundle实例 -> ResourceBundle调用 getString()返回指定key对应的字符串.



参考:
http://www.cnblogs.com/xuekyo/archive/2013/02/23/2923543.html


20150429


JAVA学习笔记系列

--------------------------------------------

                    联系方式

--------------------------------------------

        Weibo: ARESXIONG

        E-Mail: aresxdy@gmail.com

------------------------------------------------

© 著作权归作者所有

下一篇: 十九,System类
ARESXIONG
粉丝 8
博文 104
码字总数 225460
作品 0
西城
私信 提问
品高云在西北区域打响头炮!西安欧亚学院数据中心云中标

继品高云在广州大学、中山大学、海南大学等二十余所高校落地教育云后,品高云在西北地区落地一朵教育云,中标了西安欧亚学院数据中心云,打响了品高云在西北地区教育行业落地项目头炮。 西安...

玄学酱
2018/05/22
0
0
【已开源】Adhesive框架系列文章索引

(一)总体介绍 (二)公共模块实现 (三)配置服务模块简介 (四)配置服务模块使用 (五)应用程序信息中心模块使用 (六)应用程序信息中心模块实现 (七)Mongodb数据服务模块使用(上)...

随缘主人
2011/10/09
0
0
一个男人关心的东西 决定了他的层次

一、拥有自信和风度 男人到了二十几岁后,就要开始学着用心去经营自己了,它体现在自己的思想与涵养上。自信是一个男人最重要的品质,自信的男人就你像一只在暴风雨中战斗的海鸥。海鸥所要说...

coolpale
2018/07/02
0
0
(JavaEE-13)国际化开发.md

JavaWeb-国际化 国际化开发概述 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据 国际化又...

_-Leon-_
2014/07/18
132
0
Flash红白机模拟器--AminNes

AminNes是精准Nes模拟器,以CPU时钟频率为驱动的精确模拟。 在开发初期参考了近二十份nes游戏机的资料,目前已经实现绝大部分硬件模拟。此次开源的版本为最新版本,支持的ROM数量约为总量的5...

匿名
2009/10/09
2.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
24分钟前
4
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板 2、为该模板创建监控项 3、创建触发器 4、在zabbix-agent端操作 在/etc/zabbix/zabbix_agentd.d新建customize.confw文件 内容如下 UserParameter=mysql.replicat...

abowu
25分钟前
3
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
31分钟前
5
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
32分钟前
3
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部