国际化是开发中比较常见的一种要求
1.国际化实现思路
比如,一个程序要求可以同时实现英语,法语,汉语的显示
思路:
可以根据不同的语言配置不同的资源文件(资源文件有时也称属性文件,其后缀名.properties),所以资源文件是以key--value(键值对)的形式出现,只要找到了key,就找到了value。
想要实现Java程序的国际化,必须通过以下三个类实现
.java.util.Locale;用于表示一个国家的语言类
.java.util.ResourceBundle;用于访问资源文件
.java.txt.MessageFormat;格式化资源文件的占位字位符
具体流程如下:
Locale来指定区域码---->ResourceBundle根据Locale提供的区域码找到相应的资源文件--->如果资源文件中存在动态文本,则用MessageFormat来格式化
2.Locale类
locale的构造方法:
public Locale(String language)//根据语言代码来构造一个语言环境
public Locale(String language,)//根据语言和国家来构造一个语言环境
3.ResourceBundle类
代码:
在写代码之前首先写一个资源文件
Message.properties
public
class
InterDemo {
public
static
void
main(String[] args) {
ResourceBundle rb=ResourceBundle.getBundle(
"Message"
);
//找到资源
System.
out
.println(
"资源"
+rb.getString(
"info"
));
}
}
结果:
资源Hello
4.java国际化程序的实现
第一步:配好属性文件
中文:Message_zh_CN
内容:
info=
\u4f60\u597d 这里的文字需要转码:你可以用native2ascii.exe来进行转码
英文:Message_en_US
内容:info=Hello
法文:Message_fr_FR
内容: info=
Bonjour
public
class
InterDemo2 {
public
static
void
main(String[] args) {
Locale zhLoc=
new
Locale(
"zh"
,
"CN"
);
//表示中国地区
Locale enLoc=
new
Locale(
"en"
,
"US"
);
//表示美国地区
Locale frLoc=
new
Locale(
"fr"
,
"FR"
);
//表示法国地区
//找到中文的属性文件
ResourceBundle zhrb=ResourceBundle.getBundle(
"Message"
,zhLoc);
//找到英文的属性文件
ResourceBundle enrb=ResourceBundle.getBundle(
"Message"
,enLoc);
//找到法文的属性文件
ResourceBundle frrb=ResourceBundle.getBundle(
"Message"
,frLoc);
System.
out
.println(
"中文:"
+zhrb.getString(
"info"
));
System.
out
.println(
"英文:"
+enrb.getString(
"info"
));
System.
out
.println(
"法文:"
+frrb.getString(
"info"
));
}
}
结果:
中文:你好
英文:Hello
法文:Bonjour
5.处理动态文本
上面的代码都是写死了,如果想要动态的输入一些内容,就要用占位符来表示出动态文本的内容
步骤:
需要改动的地方:
中文:Message_zh_CN
内容:
info=
\u4f60\u597d{0} 这里的文字需要转码:你可以用native2ascii.exe来进行转码
英文:Message_en_US
内容:info=Hello{0}
法文:Message_fr_FR
内容: info=
Bonjour{0}
代码:
public
class
InterDemo2 {
public
static
void
main(String[] args) {
Locale zhLoc=
new
Locale(
"zh"
,
"CN"
);
//表示中国地区
Locale enLoc=
new
Locale(
"en"
,
"US"
);
//表示美国地区
Locale frLoc=
new
Locale(
"fr"
,
"FR"
);
//表示法国地区
//找到中文的属性文件
ResourceBundle zhrb=ResourceBundle.getBundle(
"Message"
,zhLoc);
//找到英文的属性文件
ResourceBundle enrb=ResourceBundle.getBundle(
"Message"
,enLoc);
//找到法文的属性文件
ResourceBundle frrb=ResourceBundle.getBundle(
"Message"
,frLoc);
System.
out
.println(
"中文:"
+zhrb.getString(
"info"
));
System.
out
.println(
"英文:"
+enrb.getString(
"info"
));
System.
out
.println(
"法文:"
+frrb.getString(
"info"
));
String str1=zhrb.getString(
"info"
);
String str2=enrb.getString(
"info"
);
String str3=frrb.getString(
"info"
);
System.
out
.println(
"中文-->"
+MessageFormat.format (str1,
"中国"
));
System.
out
.println(
"英文-->"
+MessageFormat.format (str2,
"China"
));
System.
out
.println(
"法语-->"
+MessageFormat.format (str3,
"China"
));
}
}
结果:
中文:你好{0}
英文:Hello{0}
法文:Bonjour{0}
中文-->你好中国
英文-->HelloChina
法语-->BonjourChina
如果需要跟多的占位符,则是{1},{2}......