0%

【JavaWeb】i18n国际化

i18n国际化


1 i18n入门

  • i8n:internationalization,国际化,由于名字过长,以i开头,以n结尾,中间18个字母,简称为i18n
  • Locale
  • 记录时区语言,例如zh_CN - 中文_中国,en_US - 英文_美国
  • i18n配置文件
  • 命名规则:xxxx_语言_地区.properties
1
2
3
// i18n_en_US.properties
username=username
password=password
1
2
3
// i18n_zh_CN.properties
username=用户名
password=密码
  • ResourceBundle
  • 根据不同的locale来加载不同的i18n配置文件
1
2
3
4
5
6
7
 Locale locale = Locale.US;
// locale = Locale.CHINA;
// 'i18n'是文件的前缀xxxx,根据自己的配置文件进行修改
ResourceBundle bundle = ResourceBundle.getBundle("i18n", locale);
// utf-8文件中文乱码,需要格式化
System.out.println(new String(bundle.getString("username").getBytes("ISO-8859-1"), "UTF-8"));
System.out.println(new String(bundle.getString("password").getBytes("ISO-8859-1"), "UTF-8"));

2 JSP整合i18n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<body>
<%
Locale locale;
// 先根据参数获取语言信息,若参数不存在,默认获取浏览器请求的语言参数
String language = request.getParameter("language");
if ("en".equals(language)) {
locale = Locale.US;
} else if ("zh".equals(language)) {
locale = Locale.CHINA;
} else {
locale = request.getLocale();
}
ResourceBundle i18n = ResourceBundle.getBundle("i18n", locale);
%>
// 语言切换修改param参数
<a href="index.jsp?language=en">English</a> | <a href="index.jsp?language=zh">中文</a>
<br/>
// 可以写一个工具类来解决utf-8格式化
<span><%=new String(i18n.getString("username").getBytes("ISO-8859-1"), "UTF-8")%></span>
<span><%=new String(i18n.getString("password").getBytes("ISO-8859-1"), "UTF-8")%></span>
</body>

3 JSTL标签整合i18n

1
2
3
4
5
6
7
8
<body>
<fmt:setLocale value="${param.locale}"/>
<fmt:bundle basename="i18n"/>
<a href="jstlI18n.jsp?locale=en_US">English</a> | <a href="jstlI18n.jsp?locale=zh_CN">中文</a>
<br/>
<span><fmt:message key="username"/></span>
<span><fmt:message key="password"/></span>
</body>