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

[java] view plaincopy

  1. info=HELLO

[java] view plaincopy

  1. package com.itmyhome;
  2. import java.util.ResourceBundle;
  3. public class T {
  4. public static void main(String[] args) throws Exception{
  5. ResourceBundle rb = ResourceBundle.getBundle("message");
  6. System.out.println(rb.getString("info"));
  7. }
  8. }

PS:message.properties默认查找路径为classpath下,如果不在此路径下并且为指定完整包路径名的话将报如下异常

[java] view plaincopy

  1. 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

[java] view plaincopy

  1. info=\u4f60\u597d

Message_en_US.properties

[java] view plaincopy

  1. info=Hello

Message_fr_FR.properties

[java] view plaincopy

  1. info=Bonjour

[java] view plaincopy

  1. package com.itmyhome;
  2. import java.util.Locale;
  3. import java.util.ResourceBundle;
  4. public class T {
  5. public static void main(String[] args) throws Exception{
  6. Locale zhLocale = new Locale("zh","CN");   //表示中国地区
  7. Locale enLocale = new Locale("en","US");   //表示美国地区
  8. Locale frLocale = new Locale("fr","FR");   //表示法国地区
  9. ResourceBundle zhRb = ResourceBundle.getBundle("Message",zhLocale);
  10. ResourceBundle enRb = ResourceBundle.getBundle("Message",enLocale);
  11. ResourceBundle frRb = ResourceBundle.getBundle("Message",frLocale);
  12. System.out.println(zhRb.getString("info"));
  13. System.out.println(enRb.getString("info"));
  14. System.out.println(frRb.getString("info"));
  15. }
  16. }

PS:以上中文属性如果是中文的话应该将其进行Unicode编码,这样可以避免一些系统所带来的乱码问题

处理动态文本

之前的资源文件中的所有内容实际上都是固定的,而如果现在有些内容,你好,XXX。那
么此时就必须在资源文件中进行一些动态文本的配置,设置占位符,这些符号中的内容暂时不固定,而是在程序执行的时候由程序进行设置的,而要想实现这样的功
能,则必须使用MessageFormat类。此类在java.text包中定义的。

占位符使用(数字)的形式表示,如果现在表示第一个内容“{0}”、第二个内容“{1}”依次类推。

在MessageFormat类中主要使用format()方法,此方法定义如下:

public  static  String  format(String  pattern,Object...arguments)

[java] view plaincopy

  1. info=\u4f60\u597d{0}
  2. info=Hello,{0}
  3. info=Bonjour,{0}

[java] view plaincopy

  1. package com.itmyhome;
  2. import java.text.MessageFormat;
  3. import java.util.Locale;
  4. import java.util.ResourceBundle;
  5. public class T {
  6. public static void main(String[] args) throws Exception{
  7. Locale zhLocale = new Locale("zh","CN");   //表示中国地区
  8. Locale enLocale = new Locale("en","US");   //表示美国地区
  9. Locale frLocale = new Locale("fr","FR");   //表示法国地区
  10. ResourceBundle zhRb = ResourceBundle.getBundle("Message",zhLocale);
  11. ResourceBundle enRb = ResourceBundle.getBundle("Message",enLocale);
  12. ResourceBundle frRb = ResourceBundle.getBundle("Message",frLocale);
  13. System.out.println(MessageFormat.format(zhRb.getString("info"), "itmyhome"));
  14. System.out.println(MessageFormat.format(enRb.getString("info"), "itmyhome"));
  15. System.out.println(MessageFormat.format(frRb.getString("info"), "itmyhome"));
  16. }
  17. }

java新特性,可变参数

在JDK1.5之后java增加了新特性的操作,可以向方法中传递可变的参数,以前的定义的方法,实际上里面的参数都是固定个数的

[java] view plaincopy

  1. package com.itmyhome;
  2. public class T {
  3. public static void main(String[] args) throws Exception{
  4. fun("java","c++",".net");
  5. fun("itmyhome");
  6. }
  7. public static void fun(Object...args){
  8. for (int i = 0; i < args.length; i++) {
  9. System.err.println(args[i]+"、");
  10. }
  11. }
  12. }

使用一个类代替资源文件

也可以直接使用一个类来存放所有的资源文件内容,但是,此类在操作的时候就必须有一个明显的注意点,必须继承ListResourceBundle

Message_zh_CN

[java] view plaincopy

  1. package com.itmyhome;
  2. import java.util.ListResourceBundle;
  3. public class Message_zh_CN extends ListResourceBundle {
  4. private final Object date[][] = {
  5. {"info","你好"}
  6. };
  7. @Override
  8. protected Object[][] getContents() {
  9. // TODO Auto-generated method stub
  10. return date;
  11. }
  12. }

读取资源类

[java] view plaincopy

  1. package com.itmyhome;
  2. import java.util.Locale;
  3. import java.util.ResourceBundle;
  4. public class T {
  5. public static void main(String[] args) throws Exception{
  6. Locale zhLocale = new Locale("zh","CN");   //表示中国地区
  7. ResourceBundle zhRb = ResourceBundle.getBundle("com.itmyhome.Message",zhLocale); //写入完整的路径名
  8. System.out.println(zhRb.getString("info"));
  9. }
  10. }

不管是资源类还是资源文件,找的时候都是Message,那么如果现在多种资源文件一起出来,那么最终找的是哪一个呢?

实际上此时就需要区分优先级:

Message_zh_CN.class

Message_zh_CN.properties

Message.properties

总结:国际化程序实现的思路:程序与显示相分离,根据不同的Locale指定的区域找到不同的资源文件并根据其key取得对应的value

时间: 2024-11-19 01:52:18

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("getXmlAction.action",{name:$('#name').val()},function(ret,status){ if("success" == status) var id = $(ret).find("id").text(); var age = $

我的java学习笔记(12)关于反射(part 1)

1.能够分析类能力的程序称为反射. 2.在程序运行期间,java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.虚拟机利用运行时类型信息选择相应的方法执行. 3.这些保存信息的类被称为Class. 4.Object类中的getClass()方法将会返回一个Class类型的实例. String s = "hello"; Class c1 = s.getClass(); 5.如果类在一个包里,包的名字也作为类名的一部分. 6.获得类名的三种方法 a

Java学习笔记12

Object类是所有类.数组.枚举类的父类,是类层次结构的根类.每个类都使用Object作为超类.所有对象(包括 数组)都实现这个类的方法. Object类实现了以下方法: 我们来看看源码中getClass()方法: public final native Class<?> getClass(); 以上的Class<?> getClass()方法的作用是返回该对象的运行时类. 具体使用参看以下程序: class Work{ } public class Main { public

Java学习笔记-12.传递和返回对象

1.Clone()方法产生一个object,使用方法后必须产生的object赋值. Vector v2 = (Vector)v.clone(); 2.Clone()方法在object中是保护类型方法,如果自己创建的类需要使用Clone()方法的话需要自己重新写一个,并且继承Cloneable接口. package tweleve; import java.util.*; class MyObject implements Cloneable { int i; MyObject(int ii) {

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

JAVA学习笔记一(JAVA输出环境变量)

package mytest; import java.util.*;; public class mymain { public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(new Date()); Properties p=System.getProperties(); p.list(System.out); Runtime rt=Runtime.getRuntim

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在

JAVA学习笔记 -- JDBC及其应用

一.准备工作 1.开启SQL Server服务和启用TCP/IP  并且确认TCP端口 2.Eclipse下给项目导入sqljdbc4.jar包 将下载好的 sqljdbc_4.0.2206.100_chs.exe运行解压.然后在 .\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\chs\auth 路径下选择合适版本的sqljdbc_auth.dll, 将其放在 C:\Windows\System32下. 给项目导入包:右键你的项目选择