(1)概述
1.为什么要国际化
如果要让软件可以被全世界访问,并且不同语言地区的人看到他们语言的界面,就必须实现国际化
2.国际化软件特点
1)对于程序中固定使用的内容,比如菜单栏、导航栏中的内容,提示的错误信息等,需要根据访问者的地区和国家,选择不同语言给他显示。
2)对于程序中的一些动态数据,比如日期、货币等,需要根据访问者所在国家的习惯进行显示注:为何国际化称为i18n?
因为国际化即internationalization,因为从开头的i到结尾的n之间有18个字母,所以叫做i18n
(2)资源文件
1.实质
因为实际上就是根据资源文件来进行映射,所以必须针对每种语言都设置一个资源文件
2.默认资源文件因为有时候可能会出现找不到国际化资源映射文件的情况,所以需要使用一个默认的资源文件,当找不到时就使用这个默认的
3.其他资源文件
存储了指定语言的映射,必须以默认资源文件的名称为前缀+地区名称
可以看出所有的资源文件都是使用i18n开头的(当然可以自己随便定义)
4.编写资源文件
因为存储的是映射关系,那么就直接存储键值对即可,所以使用的是properties文件
其中的key是主语言,value是映射的值
比如程序主语言是英语,中国地区的人访问,那么中文的资源文件为:
username = \u7528\u6237\u540d
password = \u5bc6\u7801
因为properties文件中不能存储中文,所以存储的是编码后的结果
而英文的资源文件就为:
username = username
password = password
(3)java程序实例
import java.util.Locale;
import java.util.ResourceBundle;
public class I18nTest {
public static void main(String[] args) {
String baseName = "i18n"; //包名+默认资源文件名称(不带后缀.properties)
String username = "username";
String password = "password";
ResourceBundle cnBundle = ResourceBundle.getBundle(baseName, Locale.CHINA);
ResourceBundle enBundle = ResourceBundle.getBundle(baseName, Locale.ENGLISH);
System.out.println(cnBundle.getString(username));
System.out.println(enBundle.getString(username));
System.out.println(cnBundle.getString(password));
System.out.println(enBundle.getString(password));
}
}<span style="font-size: 13.3333px;"><strong>
</strong></span>
结果为:
用户名
username
密码
password
注意:其中getBundle必须要指定完整的包名+默认资源文件的名称,且不带properties后缀。
此处因为我们的资源文件放在classpath下,所以不用指定包名了,直接使用默认资源名即可
(4)java web程序实例
上面实例中,我们的地区是自己设定的。
而在web应用中,可以通过http请求头的local信息来分析访问者所在地区,而local信息存储在Accept-Language中
在web应用中,可以使用getLocal来获取访问者地址
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>国际化(i18n)测试</title>
</head>
<%
//加载i18n资源文件,request.getLocale()获取访问用户所在的国家地区
ResourceBundle myResourcesBundle = ResourceBundle.getBundle("i18n",request.getLocale());
%>
<body>
<form action="" method="post">
<%=myResourcesBundle.getString("username")%>:<input type="text" name="username"/><br/>
<%=myResourcesBundle.getString("password")%>:<input type="password" name="password"/><br/>
<input type="submit" value="<%=myResourcesBundle.getString("submit")%>">
</form>
</body>
</html>
这样的话,中文环境访问的结果就为:
英语环境访问结果就是:
(5)数据的国际化
我们一般使用DateFormat、NumberFormat等这类工具,通过传入Local对数据进行格式化