我从谷歌了解到,国际化是我可以使自己的
Web 应用程序使用所有语言。我想了解Unicode国际化的过程,所以我从here and there.
我能够理解 Unicode,即字符集如何编码为字节,然后又如何将字节解码为字符集。但我不知道如何继续前进。我想学习如何比较字符串,并且需要知道如何在我的 Web 应用程序中实现国际化。有什么建议吗?请指导我。
我的目标:
我的主要目标是开发一个用于翻译的网络应用程序(英语到阿拉伯语,反之亦然)。我想遵循国际化。我希望在所有三种浏览器(FF、Chrome、IE)中运行我的网络应用程序进行翻译。我该如何实现这一目标?
对于基本的 JSP/Servlet Web 应用程序,基本方法是使用JSTL fmt taglib结合资源包。资源包包含键值对,其中键是一个常量,对于所有语言都相同,而值因语言而异。资源包通常是属性文件哪些是由加载的ResourceBundleAPI。但是,这可以自定义,以便您可以从数据库等加载键值对。
以下是如何使用基于属性文件的资源包国际化 Web 应用程序的登录表单的示例。
-
创建以下文件并将它们放入某个包中,例如com.example.i18n
(如果是Maven,请将它们放在包结构中src/main/resources
).
text.properties
(包含默认语言的键值对,通常是英语)
login.label.username = Username
login.label.password = Password
login.button.submit = Sign in
text_nl.properties
(包含荷兰语(nl
) 键值对)
login.label.username = Gebruikersnaam
login.label.password = Wachtwoord
login.button.submit = Inloggen
text_es.properties
(包含西班牙语(es
) 键值对)
login.label.username = Nombre de usuario
login.label.password = Contraseña
login.button.submit = Acceder
资源包文件名应遵循以下模式name_ll_CC.properties
. The _ll
部分应该是小写ISO 693-1语言代码。它是可选的,并且仅在以下情况下才需要_CC
部分存在。这_CC
部分应该是大写ISO 3166-1 Alpha-2国家代码。它是可选的,通常仅用于区分特定国家/地区的语言方言,例如美式英语 (_en_US
) and 英式英语 (_en_GB
).
-
如果尚未完成,请按照此答案中的说明安装 JSTL:如何安装JSTL?绝对uri:http://java.sun.com/jstl/core无法解析.
-
创建以下示例 JSP 文件并将其放入 Web 内容文件夹中。
login.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.example.i18n.text" />
<!DOCTYPE html>
<html lang="${language}">
<head>
<title>JSP/JSTL i18n demo</title>
</head>
<body>
<form>
<select id="language" name="language" onchange="submit()">
<option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
<option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
<option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
</select>
</form>
<form method="post">
<label for="username"><fmt:message key="login.label.username" />:</label>
<input type="text" id="username" name="username">
<br>
<label for="password"><fmt:message key="login.label.password" />:</label>
<input type="password" id="password" name="password">
<br>
<fmt:message key="login.button.submit" var="buttonValue" />
<input type="submit" name="submit" value="${buttonValue}">
</form>
</body>
</html>
The <c:set var="language">
管理当前语言。如果语言作为请求参数提供(通过语言下拉列表),那么它将被设置。否则,如果先前已在会话中设置语言,则坚持使用它。否则,请在请求标头中使用用户提供的区域设置。
The <fmt:setLocale>
设置资源包的区域设置。重要的是这条线是before the <fmt:setBundle>
.
The <fmt:setBundle>
通过资源包的基本名称(即完全限定的包名称)初始化资源包,直到使用不带唯一名称的名称_ll_CC
说明符)。
The <fmt:message>
通过指定的捆绑密钥检索消息值。
The <html lang="${language}">
通知搜索机器人页面使用的语言,这样就不会被标记为重复内容(因此,有利于 SEO)。
当选择另一种语言时,语言下拉列表将立即由 JavaScript 提交,并且页面将使用新选择的语言刷新。
但是,您需要记住,默认情况下,属性文件是使用 ISO-8859-1 字符编码读取的。您需要通过 unicode 转义来转义它们。这可以使用 JDK 提供的native2ascii.exe
工具。也可以看看本文部分了解更多详情。
理论上的替代方案是提供一个带有自定义的捆绑包Control将这些文件加载为 UTF-8,但不幸的是基本 JSTL 不支持fmt
标签库。您需要在某人的帮助下自行管理这一切Filter
。有(MVC)框架可以以更透明的方式处理这个问题,例如 JSF,另请参阅本文.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)