Java Web 从入门到退坑 —— 第十六章 i18n 国际化
By: -gregPerlinLi-
1. 什么是 i18n 国际化
- 国际化(Internationalization)指的是同一个网站可以支持多种不同的语言,以方便不同国家,不同语种的用户访问。
- 关于国际化我们最简单的方案就是为不同的国家创建不同的网站,比如 Apple 公司,他的英文官网是:
https://www.apple.com
,而中文官网是:https://www.apple.com.cn
。 - Apple 公司的这种方案并不适合全部公司,而我们希望相同的一个网站,而不同人访问的时候可以根据用户所在的区域显示不同的语言文字,而网站的布局样式等不发生改变。
- 于是就有了我们所说的国际化,国际化总的来说就是同一个网站不同国家的人来访问可以显示出不同的语言。但实际上这种需求并不强烈,一般真的有国际化需求的公司,主流采用的依然是 Apple 公司的那种方案,为不同国家创建不同的页面,所以国际化的内容我们了解一下即可。
- 国际化英文
internationalization
,但是由于拼写过长,老外想了一个简单的写法叫做i18n
,代表的是internationalization
这个单词,以I
开头,以N
结尾,而中间是18
个字母,所以才叫i18n
。以后我们说i18n
和国际化是一个意思。
2. 国际化相关要素介绍
3. 国际化资源 properties 测试
示例代码:
i18n_zh_CN.properties
username=用户名
password=密码
gender=性别
age=年龄
i18n_en_US.properties
username=Username
password=Password
gender=Gender
age=Age
I18nTest.java
package com.gregperlinli.i18n;
import org.junit.Test;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* @author gregperlinli
*/
public class I18nTest {
@Test
public void testI18n() {
// Get the local object you need
Locale locale = Locale.US;
// Read the corresponding configuration file through the specified Basename and Locale objects
ResourceBundle bundle = ResourceBundle.getBundle("i18n", locale);
System.out.println("en_US:");
System.out.println("username: " + bundle.getString("username"));
System.out.println("password: " + bundle.getString("password"));
System.out.println("sex: " + bundle.getString("gender"));
System.out.println("age: " + bundle.getString("age"));
locale = Locale.CHINA;
bundle = ResourceBundle.getBundle("i18n", locale);
System.out.println("zh_CN:");
System.out.println("username: " + bundle.getString("username"));
System.out.println("password: " + bundle.getString("password"));
System.out.println("sex: " + bundle.getString("gender"));
System.out.println("age: " + bundle.getString("age"));
}
}
4. 通过请求头国际化页面
示例代码:
i18n_zh_CN.properties
username=用户名
password=密码
gender=性别
age=年龄
regist=注册
male=男
female=女
email=邮箱
reset=重置
submit=提交
i18n_en_US.properties
username=Username
password=Password
gender=Gender
age=Age
regist=Regist
male=male
female=female
email=E-mail
reset=Reset
submit=Submit
i18n.jsp
<%@ page import="java.util.Locale" %>
<%@ page import="java.util.ResourceBundle" %><%--
Created by IntelliJ IDEA.
User: gregperlinli
Date: 2021/7/12
Time: 4:13 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="UTF-8">
<title>I18n</title>
<style type="text/css">
body {
font-family: Futura, "PingFang SC", Helvetica, Arial, sans-serif;
font-size: 20px;
}
</style>
</head>
<body>
<%
// Get locale information from request header (language)
Locale locale = null;
String country = request.getParameter("country");
if ( "cn".equals(country)) {
locale = Locale.CHINA;
} else if ( "usa".equals(country) ) {
locale = Locale.US;
} else {
locale = request.getLocale();
}
System.out.println(locale);
// Reads the language information according to the specified BaseName and Locale
ResourceBundle i18n = ResourceBundle.getBundle("i18n", locale);
%>
<a href="i18n.jsp?country=cn">中文</a>|
<a href="i18n.jsp?country=usa">English</a>
<center>
<h1><%=i18n.getString("regist")%></h1>
<table>
<form><label>
<tr>
<td><%=i18n.getString("username")%></td>
<td><input name="username" type="text" /></td>
</tr>
<tr>
<td><%=i18n.getString("password")%></td>
<td><input name="password" type="password" /></td>
</tr>
<tr>
<td><%=i18n.getString("gender")%></td>
<td>
<input name="gender" type="radio"><%=i18n.getString("male")%>
<input name="gender" type="radio"><%=i18n.getString("female")%>
</td>
</tr>
<tr>
<td><%=i18n.getString("email")%></td>
<td><input name="email" type="email" /></td>
</tr>
<tr>
<td></td>
<td>
<input name="reset" type="button" value="<%=i18n.getString("reset")%>"/>
<input name="submit" type="submit" value="<%=i18n.getString("submit")%>" />
</td>
</tr>
</label></form>
</table>
</center>
</body>
</html>
5. JSTL 标签库实现国际化
示例代码:
i18n_zh_CN.properties
username=用户名
password=密码
gender=性别
age=年龄
regist=注册
male=男
female=女
email=邮箱
reset=重置
submit=提交
i18n_en_US.properties
username=Username
password=Password
gender=Gender
age=Age
regist=Regist
male=male
female=female
email=E-mail
reset=Reset
submit=Submit
i18n_fmt.jsp
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--
Created by IntelliJ IDEA.
User: gregperlinli
Date: 2021/7/12
Time: 4:13 下午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>I18n_fmt</title>
<style type="text/css">
body {
font-family: Futura, "PingFang SC", Helvetica, Arial, sans-serif;
font-size: 20px;
}
</style>
</head>
<body>
<%-- 1. Using tags to set Locale information --%>
<fmt:setLocale value="${param.locale}"/>
<%-- 2. Using tags to set BaseName --%>
<fmt:setBundle basename="i18n"/>
<a href="i18n.jsp?locale=zh_CN">中文</a>|
<a href="i18n.jsp?locale=en_US">English</a>
<center>
<h1><fmt:message key="regist"/></h1>
<table>
<form><label>
<tr>
<td><fmt:message key="username"/></td>
<td><input name="username" type="text" /></td>
</tr>
<tr>
<td><fmt:message key="password"/></td>
<td><input name="password" type="password" /></td>
</tr>
<tr>
<td><fmt:message key="gender"/></td>
<td>
<input name="gender" type="radio"><fmt:message key="male"/>
<input name="gender" type="radio"><fmt:message key="female"/>
</td>
</tr>
<tr>
<td><fmt:message key="email"/></td>
<td><input name="email" type="email" /></td>
</tr>
<tr>
<td></td>
<td>
<input name="reset" type="button" value="<fmt:message key="reset"/>"/>
<input name="submit" type="submit" value="<fmt:message key="submit"/>" />
</td>
</tr>
</label></form>
</table>
</center>
</body>
</html>