本篇阐述的是Java中的国际化,国际化在开发框架和页面中有着更为便捷的使用方式,如Spring mvc,struts,jsp;
程序多语言原理:在不同地区根据主机不同的设定去匹配与之对应的语言环境。一个程序可以同时适应多种语言。
国际化(Internationalization),简称i18n。i,n为单词首尾字母,18为中间字符数。
i18n支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等;
除了i18n还有其他多语言,分别是:
1、L10n(localization),支持2种语言,英文和另外一种语言(例如中文);
2、g11n(globalization),简单的理解可以认为g11n = i18n + L10n。
3、m17n(multilingualization)可以在同一时间支持多种语言,例如你可以在一个页面里看到中文、英文、德文和韩文。
1.Java.util.Locale:用于表示一个国家语言类
2.Java.util.ResourceBundle:用于访问资源文件
3.Java.text.MessageFormat:格式化资源文件的占位字符串
Java.util.Locale是表示语言和国家/地区信息的本地化类,它是创建国际化应用的基础。可以通过Locale类创建一个本地语言环境对象,常用的3种方法:
第一个是通过构造函数指定语言和地区指定;
public Locale(String language, String country)
第二个是通过语言代码构造语言环境
Locale.语言常量;
第三个是获取此JAVA虚拟机实例的当前默认语言环境
Locale.getDefault();
这个类是专门完成属性文件读取操作的,读取的时候直接指定文件名即可(此文件名称一般不需要指定后缀名,统一为*.properties),可以更具Locale所指定的区域码来自动选择所需要的资源文件。
获取ResourceBundle对象常用方法:
//指定操作的资源文件,并传入Locale对象
Public staticfinal ResourceBundle getBundle(String baseName,Local locale)
JDK的java.util包中提供了几个支持本地化的格式化操作工具类:NumberFormat、DateFormat、MessageFormat。
MessageFormat在NumberFormat和DateFormat的基础上提供了强大的占位符(”{0-n}:第一个参数-第n-1个参数”)字符串的格式化功能,它支持时间、货币、数字以及对象属性的格式化操作。
常用方法:
//patttern指的是含有占位符的原字符串,arguments指的是每个占位符的值。方法返回格式化后的字符串。
public static String format(String pattern, Object ... arguments)
国际化资源文件的命名规范规定资源名称采用以下的方式进行命名:
<资源名><语言代码><国家/地区代码>.properties
如:info_en_US.properties
标准的语言代码请参考:http://www.loc.gov/standards/iso639-2/php/English_list.php
标准的ISO国家/地区代码请参考:http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
文件代码示例:
#info_en_US.properties内容
username=username
passwd=passwd
input=input
info.success=welcome,{0}
info.error=error
#info_zh_CN.properties内容
#对应中文转换为Unicode编码
username=\u7528\u6237\u540d
passwd=\u5BC6\u7801
input=\u8BF7\u8F93\u5165
info.success=\u6B22\u8FCE\uff0c{0}
info.error=\u767B\u5f55
代码示例:
Locale locale = new Locale("zh", "CN");
Locale locale1 = Locale.US;
Locale locale2 = Locale.getDefault();
注意:绑定的资源文件名是包名.文件基本名,不包括语言,国家地区和文件后缀名,然后指定当前的语言环境
代码示例:
ResourceBundle res = ResourceBundle.getBundle("info", Locale.getDefault());
资源文件,通过key=value的方式保存值,使用ResourceBundle对象直接通过key获取value;
ResourceBundle常用方法:
public final Object getObject(String key)
public final String getString(String key)
public Locale getLocale();
代码示例:
String input = res.getString("input");
String username = res.getString("username");
String passwd = res.getString("passwd");
String infoSuccess = res.getString("info.success");
String infoError = res.getString("info.error");
使用MessgeFormat中的静态方法format处理动态文本(包含占位符)。
format方法:
//第一个参数就是要进行动态处理的包含占位符的字符串,后续的参数个数可变,分别对应前面字符串中的通配符
public static String format(String pattern, Object ... arguments)
代码示例:
String pattern="你好,{0}";
String name="先生";
String success = MessageFormat.format(pattern, name);
//结果:success="你好,先生";
代码:
import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Scanner;
public class LocalDemo {
public static void main(String[] args) {
//创建一个本地语言环境对象(中文,英文,本地默认)
Locale locale = new Locale("zh", "CN");
Locale locale1 = Locale.US;
Locale locale2 = Locale.getDefault();
//通过ResourceBundle工具类绑定资源文件(包名.文件名(基本名称不包括语言部分和后缀部分))
ResourceBundle res = ResourceBundle.getBundle("info", locale);
//从属性文件中根据key获取value值
String input = res.getString("input");
String username = res.getString("username");
String passwd = res.getString("passwd");
String infoSuccess = res.getString("info.success");
String infoError = res.getString("info.error");
//模拟用户登陆
Scanner in = new Scanner(System.in);
System.out.println(input +""+ username);
String userName = in.next();
System.out.println(input +""+ passwd);
String password = in.next();
if ("admin".equals(userName) && "123".equals(password)) {
//处理动态文本(模式, 要替换的值……)
String success = MessageFormat.format(infoSuccess, userName);
System.out.println(success);
} else {
System.out.println(infoError);
}
}
}