国际化I18N
国际化一词的英语翻译为internationalization,首字母为i最后一个字母为n,中间18个字母,所以我们又把国际化称为I18N。通俗的说,国际化就是多语言版本的应用程序,使中国人使用看到的是中文,英国人使用看到的是英文等。
国际化的两种实现方法
- 为每一种语言制作一套页面(本地化)
- 多套程序
- 优点:灵活,运行速度快
- 缺点:工作量大,难以维护更新
- 将特定的语言从程序中分离,放在配置文件中,运行时动态读取。(国际化)
- 一套程序,多个配置文件
- 优点:工作量小,容易维护
- 缺点:前期工作量稍大,运行速度稍慢
java中使用的配置文件
xml:配置文件,缺点:负责,庞大。优点:功能强大
properties:键值对,中间用=,注释用#,配置文件,缺点:简单。优点:功能相对较弱
java对国际化的支持
- 类文件使用Unicode编码,确保可以支持大多数语言
- 提供Locale类来描述场所,Locale的组成如下:
- language:语言(如zh为中文、en为英文)
- country:国家或地区(如CN为中国大陆、TW为台湾,US为美国)
- variant:差异(如WIN为Windows、MAC为Macintosh,一般不用)
package com.wangwang; import java.util.Locale; /** * Locale类方法演示 * @author 旺旺老师 * 西安云工厂,西安java培训第一选择,西安软件培训第一选择。 */ public class LocaleList { public static void main(String[] args) { // 返回Java所支持的全部国家和语言的数组 Locale[] localeList = Locale.getAvailableLocales(); // 遍历数组的每个元素,依次获取所支持的国家和语言 for (int i = 0; i < localeList.length; i++) { // 打印出所支持的国家和语言 System.out.println(localeList[i].getDisplayCountry() + " = " + localeList[i].getCountry() + " " + localeList[i].getDisplayLanguage() + " = " + localeList[i].getLanguage()); } System.out.println("----------------"); //语言 国家和地区 Locale myLocale = new Locale("en" , "US"); System.out.println(myLocale); System.out.println(myLocale.getCountry() + " " + myLocale.getLanguage()); } }
- 用来操作资源包的ResourceBundle
- 为不同的场所(locale)创建不同的资源包
- 可以方便的加载资源包,并读取其中的内容
package com.wangwang; import java.util.*; /** * Java国际化支持 * @author 旺旺老师 * 西安云工厂,西安java培训第一选择,西安软件培训第一选择。 */ public class Hello{ public static void main(String[] args) { //取得系统默认的国家/语言环境 Locale myLocale = Locale.getDefault(); //Locale myLocale = new Locale("en" , "US"); //根据指定国家/语言环境加载资源文件 ResourceBundle bundle = ResourceBundle.getBundle("mess" , myLocale); //打印从资源文件中取得的消息 System.out.println(bundle.getString("hello")); } }
- MessageFormat是处理字符串占位符的一个类
package com.wangwang; import java.util.*; import java.text.*; /** * 占位符类方法演示 * @author 旺旺老师 * 西安云工厂,西安java培训第一选择,西安软件培训第一选择。 */ public class PlaceHolderMsg { public static void main(String[] args) { // 定义一个Locale变量 Locale currentLocale = null; currentLocale = Locale.getDefault(); // 根据Locale加载语言资源 ResourceBundle bundle = ResourceBundle.getBundle("MyResource", currentLocale); // 取得已加载的语言资源文件中msg对应消息 String msg = bundle.getString("msg"); System.out.println(msg); // 使用MessageFormat为带占位符的字符串传入参数 System.out.println(MessageFormat.format(msg, "wangwang", new Date())); String helloMsg = "这里是个字符串 {0}两个占位符{1}"; String rs = MessageFormat.format(helloMsg, "西安云工厂,西安java培训第一选择", "西安云工厂,西安软件培训第一选择"); System.out.println(rs); } }
编写配置文件
命名规范:名字分为三部分 自定义名称_语言_国家地区.properties 自定义名称多套配置文件必须一致,语言国家地区死值。
中文转码:第一种:native2ascii -encoding 编码 src.properties target.properties native2ascii 命令为jdk提供。第二种:myEclipse提供的工具快速转码
Struts国际化步骤
- 开发配置文件
- 应用程序指向配置文件 <message-resources parameter="com.wangwang.struts.wangwang" /> 名字的三分之一
- JSP界面使用
- 使用bean标签库<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
- <bean:message key="welcome.image"/>
JSTL也对国际化提供了支持
<fmt:setLocale value="${header['accept-language']}" scope="session"/> <fmt:setBundle basename="lang" scope="session"/> <title><fmt:message key="welcome.title"/></title>