在全球化的今天,开发支持多语言的应用变得越来越重要,也变得较为常见。
1.概念
国际化是一种使应用程序能够适应不同语言的技术
国际化就是指一个程序可以同时去适应各个国家的语言。例如,如果使用程序的是中国人,那么就会显示中文。如果使用程序的是英国人,那么就显示英语。
2.原理
例如:
现在需要一个程序,去同时适应中文和英文的显示
这个时候我们就需要一个国际化支持了,那该如何去实现呢?
其实挺简单的,我们事先准备一组资源文件,然后里面都是通过 key-value 的形式保存信息,再根据 key
从 一组资源文件
中寻找对应的资源文件中的 value
然后返回
在 Java 中,如果要实现这个国际化需求,那么就离不开下面的 3 个主要类:
1)Locale
用于表示一个国家语言类, java.util.Locale
类表示一个特定的区域,用于确定程序应该使用哪种语言规则。可以通过 Locale
类来创建一个特定的区域设置。
2)ResourceBundle
用于访问资源文件 , java.util.ResourceBundle
类用于加载特定于语言环境的资源文件。资源文件通常是 key-value 的集合,其中 key 是字符串,value 可以是字符串、数字等。
3)MessageFormat
用于格式化资源文件的占位符, java.text.MessageFormat
类用于格式化消息,支持将占位符替换为特定的值,这在处理动态文本时非常有用。
3.例子
上面说了下国际化的概念及原理,接下来就让我们来试一试吧
1)准备资源文件
首先,我们为每种语言创建一个资源文件,其中包含了程序中显示的所有文本消息。资源文件通常以 .properties
后缀结尾
-
message_zh_CN.properties
msg = 你好世界 dynamic_msg = {0} 说:你好世界
-
message_en_US.properties
msg = Hello world dynamic_msg = {0} say:Hello world
2)加载资源文件
使用 ResourceBundle
来加载特定于语言环境的资源文件
示例代码:
public class Demo {
public static void main(String[] args) {
// 设置区域
Locale cn = new Locale("zh", "CN");
// 获取资源
ResourceBundle cnBundle = ResourceBundle.getBundle("message", cn);
// 获取消息
System.out.println(cnBundle.getString("msg"));
// 设置区域
Locale en = new Locale("en", "US");
// 获取资源
ResourceBundle enBundle = ResourceBundle.getBundle("message", en);
// 获取消息
System.out.println(enBundle.getString("msg"));
}
}
输出结果:
你好世界
Hello world
在不同的语言和地区切换时,只需更改 Locale
对象即可。
3)格式化消息(非必须)
如果需要在消息中插入动态值,可以使用 MessageFormat
,若没有占位符的话,就不用使用这个
示例代码:
public class Demo {
public static void main(String[] args) {
Locale cn = new Locale("zh", "CN");
ResourceBundle cnBundle = ResourceBundle.getBundle("message", cn);
String cnMsg = cnBundle.getString("dynamic_msg");
System.out.println(MessageFormat.format(cnMsg, "程序员"));
Locale en = new Locale("en", "US");
ResourceBundle enBundle = ResourceBundle.getBundle("message", en);
String enMsg = enBundle.getString("dynamic_msg");
System.out.println(MessageFormat.format(enMsg, "Cheney"));
}
}
输出结果:
程序员 说:你好世界
Cheney say:Hello world
这个可以应用于 非固定的消息上,可以更灵活的处理动态消息
总结
国际化为开发者提供了一种强大的工具,使他们能够轻松地创建多语言的应用程序。通过合理使用 Locale
、ResourceBundle
和 MessageFormat
便可以实现灵活、可维护的国际化应用。