国际化程序实现
所谓的国际化的程序指的是一套代码,可以自动的根据当前操作系统的语言环境不同,显示不同的语言。假如现在某个系统可能在全世界所有国家都有可能使用到,那么在假设系统操作业务流程不变的情况,那么要想让不同国家使用这个系统,最大的障碍就在于显示语言了。
1.1 确定城市及语言
在java.util包中提供有一个Local的类,这个类的主要功能是用于定位当前的城市及语言环境。如果要想去确定语言环境必须知道城市编码及语言编码,zh_CN:中文的城市编码,英文:en_US
在Local类中提供有一个城市及语言编码,可以进行Local的定义。
范例:观察Local类的使用
package day2;
import java.util.Locale;
public class TestDemo {
public static void main(String[] args) throws Exception {
Locale loc = new Locale("zh","CN");
System.out.println(loc);
}
}
zh_CN
但是在很多时候应该根据当前的操作系统语言环境选择才对,在Local类中提供取得当前环境的方法。
取得当前环境:public static Locale getDefault()
范例:观察Local类的使用
package day2;
import java.util.Locale;
public class TestDemo {
public static void main(String[] args) throws Exception {
Locale loc = Locale.getDefault();
System.out.println(loc);
}
}
zh_CN
但是使用Local会牵扯到系统的变更问题。我不想去及编码,又不想使用系统默认,那么可以使用Local类定义的一堆常量。
范例:观察Local类的使用
package day2;
import java.util.Locale;
public class TestDemo {
public static void main(String[] args) throws Exception {
System.out.println(Locale.CHINA);
System.out.println(Locale.US);
System.out.println(Locale.JAPAN);
}
}
zh_CN
en_US
ja_JP
即:Local就是定位语言环境的。
1.2 读取资源文件
在java中使用*.properties定义的文件都是资源文件(后缀是固定的,不允许修改),而且资源文件的名称应该跟类名称保持一样的命名风格,例如:Message.properties,而在资源文件中保存的都是字符串信息,这些信息必须按照“key=value”发形式保存。随后这个资源文件必须放在CLASSPATH下才可以被访问到,如果有包,应该加上包名称后在访问。
如果想要取得这个资源文件则可以依靠java.util.ResourceBundle类完成。这个类是一个抽象类,会提供一个static方法取得本类对象:public static final ResourceBundle getBundle(String baseName),这个方法上需要一个资源文件的基本名字(baseName),Message。而后根据可以取得value信息:public final String getString(String key)
范例:取得资源文件
Message.properties
welcome=\u6b22\u8fce\u5149\u4e34
package day2;
import java.util.Locale;
import java.util.ResourceBundle;
public class TestDemo {
public static void main(String[] args) throws Exception {
ResourceBundle rb = ResourceBundle.getBundle("Message");
System.out.println(rb.getString("welcome"));
}
}
1.3 实现国际化程序
国际化程序关键就在于资源文件,在定义资源文件的时候需要针对于不同国家的城市与语言编码定义的文件,例如:中文资源:Message_zh_CN.properties,英文资源:Message_en_US.properties
要实现资源的定位需要依靠Local类完成,而同时还需要与ResourceBundle类集合,使用入戏方法取得ResourceBundle类的实例化对象:
public static final ResourceBundle getBundle(String baseName, Locale locale)。
范例:取得资源文件,实现国际化
Message_en_US.properties
welcome=Hello,Welcome
Message_zh_CN.properties
welcome=\u60a8\u597d\uff0c\u6b22\u8fce\u5149\u4e34
package day2;
import java.util.Locale;
import java.util.ResourceBundle;
public class TestDemo {
public static void main(String[] args) throws Exception {
Locale loc = new Locale("en","US");
ResourceBundle rb = ResourceBundle.getBundle("Message",loc);
System.out.println(rb.getString("welcome"));
}
}
Hello,Welcome
但是有一个问题,加入在中文环境下说您好,得有一个名:可以使用占位符,但是这个时候必须针对于读取出的数据进行一些转换,依靠java.text.MessageFormat类完成。格式化文本的方法:public static String format(String pattern, Object … arguments)
范例:格式化文本的方法
Message_en_US.properties
welcome={0},Hello,Welcome
Message_zh_CN.properties
welcome={0},\u60a8\u597d\uff0c\u6b22\u8fce\u5149\u4e34
package day2;
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
public class TestDemo {
public static void main(String[] args) throws Exception {
Locale loc = new Locale("zh","CN");
ResourceBundle rb = ResourceBundle.getBundle("Message",loc);
String str = rb.getString("welcome");
System.out.println(MessageFormat.format(str,"张晓明"));
}
}
张晓明,您好,欢迎光临
在许多的项目开发过程中,这样的格式化文本操作时很常见的。
总结:国际化操作虽然给看我们可以进行多语言显示的能力,但是大部分情况下,使用国际化的操作都是为了方便进行资源信息的读取操作。