java学习笔记12--国际化
国际化的操作就是指一个程序可以同时适应多门语言,即:如果现在程序者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过国际化操作,让一个程序适应各个国家的语言要求。
程序根据不同的语言环境找到不同的资源文件,之后从资源文件中取出内容,资源文件中的内容都是以key->value的形式保存的,所以在读取的时候通过其key找到对应的value
国际化实现的支持类
如果要想实现java程序的国际化操作必须通过以下的三个类完成:
java.util.Locale :用于表示一个国家语言类。
java.util.ResourceBundle:用于访问资源文件.
java.text.MessageFormat:格式化资源文件的占位字符串。
Local类
Local表示的是本地,实际上使用的是一个ISO编码的封装类。对于各个国家来说都存在一个唯一的编码,那么这种编码就称为ISO编码,使用Local可以指定好一个具体的国家编码。
例如: 中国的编码:zh_CH
英语-美国的编码:en-US
法语的编码:fr-FR
ResourceBundle
此类是专门完成属性文件读取操作的,读取的时候直接指定文件名即可(此文件名称一般不需要指定后缀,后缀同意为*.properties),可以根据Locale所指定的区域码来自动选择所需要的资源文件。
public static final ResourceBundle getBundle(String baseName) ,此方法就是指定要操作的资源文件,此方法找到的是默认的操作系统的语言Locale对象
public static final ResourceBundle getBundle(String baseName,Locale locale),此方法也是指定操作的资源文件,并传入Locale对象。
public final String getString(String key)根据key取得对应的value
下面通过一道程序来观察资源文件的使用,以及如何使用ResourceBundle读取资源文件。
message.properties
- info=HELLO
- package com.itmyhome;
- import java.util.ResourceBundle;
- public class T {
- public static void main(String[] args) throws Exception{
- ResourceBundle rb = ResourceBundle.getBundle("message");
- System.out.println(rb.getString("info"));
- }
- }
PS:message.properties默认查找路径为classpath下,如果不在此路径下并且为指定完整包路径名的话将报如下异常
- Can't find bundle for base name message, locale zh_CH
java国际化程序实现
可以根据不同的国家输出不同国家的你好:
中文:你好!
英文:Hello
法语:Bonjour!
分别定义不同的资源文件,此时需要定义出三个资源文件,同时在定义资源文件的时候需要指定好此资源文件对应的语言编码:
中文:Message_zh_CH.properties
英文:Message_en_US.properties
法文:Message_fr_FR.properties
Message_zh_CN.properties
- info=\u4f60\u597d
Message_en_US.properties
- info=Hello
Message_fr_FR.properties
- info=Bonjour
- package com.itmyhome;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class T {
- public static void main(String[] args) throws Exception{
- Locale zhLocale = new Locale("zh","CN"); //表示中国地区
- Locale enLocale = new Locale("en","US"); //表示美国地区
- Locale frLocale = new Locale("fr","FR"); //表示法国地区
- ResourceBundle zhRb = ResourceBundle.getBundle("Message",zhLocale);
- ResourceBundle enRb = ResourceBundle.getBundle("Message",enLocale);
- ResourceBundle frRb = ResourceBundle.getBundle("Message",frLocale);
- System.out.println(zhRb.getString("info"));
- System.out.println(enRb.getString("info"));
- System.out.println(frRb.getString("info"));
- }
- }
PS:以上中文属性如果是中文的话应该将其进行Unicode编码,这样可以避免一些系统所带来的乱码问题
处理动态文本
之前的资源文件中的所有内容实际上都是固定的,而如果现在有些内容,你好,XXX。那
么此时就必须在资源文件中进行一些动态文本的配置,设置占位符,这些符号中的内容暂时不固定,而是在程序执行的时候由程序进行设置的,而要想实现这样的功
能,则必须使用MessageFormat类。此类在java.text包中定义的。
占位符使用(数字)的形式表示,如果现在表示第一个内容“{0}”、第二个内容“{1}”依次类推。
在MessageFormat类中主要使用format()方法,此方法定义如下:
public static String format(String pattern,Object...arguments)
- info=\u4f60\u597d{0}
- info=Hello,{0}
- info=Bonjour,{0}
- package com.itmyhome;
- import java.text.MessageFormat;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class T {
- public static void main(String[] args) throws Exception{
- Locale zhLocale = new Locale("zh","CN"); //表示中国地区
- Locale enLocale = new Locale("en","US"); //表示美国地区
- Locale frLocale = new Locale("fr","FR"); //表示法国地区
- ResourceBundle zhRb = ResourceBundle.getBundle("Message",zhLocale);
- ResourceBundle enRb = ResourceBundle.getBundle("Message",enLocale);
- ResourceBundle frRb = ResourceBundle.getBundle("Message",frLocale);
- System.out.println(MessageFormat.format(zhRb.getString("info"), "itmyhome"));
- System.out.println(MessageFormat.format(enRb.getString("info"), "itmyhome"));
- System.out.println(MessageFormat.format(frRb.getString("info"), "itmyhome"));
- }
- }
java新特性,可变参数
在JDK1.5之后java增加了新特性的操作,可以向方法中传递可变的参数,以前的定义的方法,实际上里面的参数都是固定个数的
- package com.itmyhome;
- public class T {
- public static void main(String[] args) throws Exception{
- fun("java","c++",".net");
- fun("itmyhome");
- }
- public static void fun(Object...args){
- for (int i = 0; i < args.length; i++) {
- System.err.println(args[i]+"、");
- }
- }
- }
使用一个类代替资源文件
也可以直接使用一个类来存放所有的资源文件内容,但是,此类在操作的时候就必须有一个明显的注意点,必须继承ListResourceBundle
Message_zh_CN
- package com.itmyhome;
- import java.util.ListResourceBundle;
- public class Message_zh_CN extends ListResourceBundle {
- private final Object date[][] = {
- {"info","你好"}
- };
- @Override
- protected Object[][] getContents() {
- // TODO Auto-generated method stub
- return date;
- }
- }
读取资源类
- package com.itmyhome;
- import java.util.Locale;
- import java.util.ResourceBundle;
- public class T {
- public static void main(String[] args) throws Exception{
- Locale zhLocale = new Locale("zh","CN"); //表示中国地区
- ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //写入完整的路径名
- System.out.println(zhRb.getString("info"));
- }
- }
不管是资源类还是资源文件,找的时候都是Message,那么如果现在多种资源文件一起出来,那么最终找的是哪一个呢?
实际上此时就需要区分优先级:
Message_zh_CN.class
Message_zh_CN.properties
Message.properties
总结:国际化程序实现的思路:程序与显示相分离,根据不同的Locale指定的区域找到不同的资源文件并根据其key取得对应的value
java学习笔记12--国际化的更多相关文章
- java学习笔记(12) —— Struts2 通过 xml /json 实现简单的业务处理
XML 1.引入dom4j-2.0.0.jar 2.引入jquery-1.8.2.js 3.新建common.js getInfo = function(){ $.post("getXmlA ...
- Java学习笔记12
循环 打印一个字符串(例如: "Welcome to Java!") 100次,就需要吧下面的输出语句重复写100遍,这是相当繁琐的: System.out.println(&qu ...
- Java学习笔记-12.传递和返回对象
1.Clone()方法产生一个object,使用方法后必须产生的object赋值. Vector v2 = (Vector)v.clone(); 2.Clone()方法在object中是保护类型方法, ...
- Java学习笔记12(面向对象五:构造方法、this再探)
在开发中,经常需要在创建对象的同时明确对象对的属性值, 比如一个Person对象创建时候就应该有age和name等属性 那么如何做到在创建对象的同时给对象的属性初始化值呢? 这里介绍构造方法: 1.构 ...
- java学习笔记12(final ,static修饰符)
final: 意思是最终的,是一个修饰符,有时候一个功能类被开发好了,不想被子类重写就用final定义, 用final修饰的最终数据成员:如果一个类的数据成员用final修饰符修饰,则这个数据成员就被 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第八周《Java学习笔记》
20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- Java学习笔记之---API的应用
Java学习笔记之---API的应用 (一)Object类 java.lang.Object 类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
随机推荐
- ZJOI2013 防守战线
题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...
- 【剑指Offer学习】【面试题17 ::合并两个排序的链表】
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的 链表结点定义例如以下: public static class ListNode { int value; List ...
- Swift学习之UI开发初探
Swift是供iOS和OS X应用编程的新编程语言.相信很多开发者都在学习这门新语言.废话不多说,下面我就来学习使用Swift创建一个简单的UI应用程序. AD: 概述 Apple近日发布了Swift ...
- paip.按键替换映射总结
paip.按键替换映射总结 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax 因为 ...
- Perl 5 教程
Perl 5 教程 http://www.cbi.pku.edu.cn/chinese/documents/perl/index.htm
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理
原文:WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理 在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境 ...
- 基于visual Studio2013解决面试题之1102合并字符串
题目
- Why Python?
Python is object-oriented Structure supports such concepts as polymorphism , operation overloading , ...
- Java Swing界面编程(22)---事件处理:动作事件及监听处理
要想让一个button变得有意义,就必须使用事件处理.在swing的事件处理中.能够使用ActionListener接口处理button的动作事件. package com.beyole.util; ...
- 窗口绘制有关的消息整理 WM_PAINT, WM_NCPAINT, WM_ERASEBKGND
WM_PAINTWM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. WM_NCPAINT当窗口客户区以外的部分(如窗口标题栏.菜单栏等)需要需要重 ...