文章目录
- 1. 背景
- 2. 思路
- 3. 所需类支持
- 3.1 获取java 支持的国家和语言
- 4. 使用
- 5. 使用 MessageFormat 处理包含占位符的字符串
- 5.1 使用类文件代替属性文件
1. 背景
国际化是指应用程序运行时,可根据客户端请求来自的国家语言的不同而现实不同的界面。
国际化的英文单词是:internationalization,所以简称 I18N,18表示中间省略了18个字母。
2. 思路
将程序中的标签、提示等信息放在资源文件中,程序需要支持哪些国家、语言环境,就提供对一个的资源文件。资源文件就是 key-value 对,每个资源文件中的 key 是不变的,但是value 随着不同的国家语言而改变。
如下图所示:提供了中文、英语、法语三种语言
business.ok=成功
business.fail=系统错误,请稍后重试
business.ok=ok
business.fail=Error, please try again later
business.ok=ok
business.fail=Erreur, veuillez réessayer plus tard
资源文件的命名可以有如下三种形式:
- baseName_language_country.properties
- baseName_language.properties
- baseName.properties
其中baseName是资源文件的基本名,用户可随意指定;而language和county 都不可随意变化,必须是java 所支持的语言和国家。
3. 所需类支持
- 用于加载国家、语言资源包
java.util.ResourceBundle
- 用于封装特定的国家语言环境
java.util.Locale
- 用于格式化带占位符的字符串
java.text.MessageFormat
3.1 获取java 支持的国家和语言
public class Test {
public static void main(String[] args) {
Locale aDefault = Locale.getDefault();
System.out.println("系统默认语言:" + aDefault);
Locale[] list = Locale.getAvailableLocales();
for (Locale locale : list
) {
System.out.print(locale.getCountry() + " ");
System.out.print(locale.getDisplayCountry()+ " ");
System.out.print(locale.getLanguage() + " ");
System.out.print(locale.getDisplayLanguage() + " ");
System.out.println();
}
}
}
4. 使用
hello=你好呀!
hello=hello world!
public class Test {
public static void main(String[] args) {
// 取得系统默认的国家语言
Locale locale = Locale.getDefault(Locale.Category.FORMAT);
ResourceBundle message = ResourceBundle.getBundle("message", locale);
System.out.println(message.getString("hello"));
}
}
5. 使用 MessageFormat 处理包含占位符的字符串
有些输出内容我们希望是根据实际情况而改变的,这个时候就可以使用占位符
hello=你好,{0},{1}
hello=hello {0},{1}!
public class Test {
public static void main(String[] args) {
// 取得系统默认的国家语言
Locale locale = Locale.getDefault(Locale.Category.FORMAT);
ResourceBundle message = ResourceBundle.getBundle("message", locale);
String msg = message.getString("hello");
String result = MessageFormat.format(msg, "中国", "我爱你");
System.out.println(result);
}
}
5.1 使用类文件代替属性文件
条件:
- 类名必须是 baseName_language_country
- 必须继承 ListResourceBundle
public class message_zh_CN extends ListResourceBundle {
private final Object[][] myDate = {
{"msg", "你好呀,{0},{1}"},
{"msg1", "想起远方的山川"}
};
@Override
protected Object[][] getContents() {
return myDate;
}
}
public class Test {
public static void main(String[] args) {
// 取得系统默认的国家语言
Locale locale = Locale.getDefault(Locale.Category.FORMAT);
ResourceBundle message = ResourceBundle.getBundle("message", locale);
String msg = message.getString("msg1");
String result = MessageFormat.format(msg, "中国", "我爱你");
System.out.println(result);
}
}