我从谷歌那里了解到,国际化是我创造国际化的过程 Web应用程序使用所有语言。我想了解Unicode的国际化进程,所以我从here和there了解了Unicode。
我能够理解Unicode如何将字符集设置为字节并再次将字节解码为字符集。但我不知道如何进一步前进。我想学习如何比较字符串,我需要知道如何在我的Web应用程序中实现国际化。有什么建议吗?请指导我。
我的目标:
我的主要目标是开发一个用于翻译的Web应用程序(英语到阿拉伯语,反之亦然)。我想遵循国际化。我希望在所有三种浏览器中运行我的Web应用程序进行翻译,即FF,Chrome,IE。我如何实现这一目标?
答案 0 :(得分:218)
对于基本的JSP / Servlet Web应用程序,基本方法是将JSTL fmt
taglib与resource bundles结合使用。资源包包含键值对,其中键是常量,对于所有语言都是相同的,并且每种语言的值不同。资源包通常是properties files,由ResourceBundle
API加载。但是,可以对其进行自定义,以便您可以从例如数据库加载键值对。
以下是如何使用基于属性文件的资源包来实现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
。 _ll
部分应为小写ISO 693-1语言代码。它是可选的,仅在_CC
部分存在时才需要。 _CC
部分应为大写ISO 3166-1 Alpha-2国家/地区代码。它是可选的,通常仅用于区分特定国家/地区的语言,例如American English(_en_US
)和British English(_en_GB
)。
如果尚未完成,请安装JSTL。如果您正在运行Servlet 2.5容器或更新版本(Tomcat 6.0等)并且您的web.xml
被声明符合Servlet 2.5规范,那么只需将jstl-1.2.jar放入webapp的/WEB-INF/lib
文件夹中
创建以下示例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>
<c:set var="language">
管理当前语言。如果语言是作为请求参数提供的(通过语言下拉列表),那么它将被设置。否则如果语言先前已在会话中设置,则坚持使用它。否则,请在请求标头中使用用户提供的区域设置。
<fmt:setLocale>
设置资源包的区域设置。重要的是此行之前 <fmt:setBundle>
。
<fmt:setBundle>
按基本名称初始化资源包(即完整限定的包名称,直到没有_ll_CC
说明符的唯一名称)。
<fmt:message>
按指定的捆绑密钥检索消息值。
<html lang="${language}">
通知搜索机构页面所使用的语言,以便它不会被标记为重复内容(因此,对SEO有利)。
当选择其他语言并使用新选择的语言刷新页面时,语言下拉列表将立即通过JavaScript提交。
但是,您需要记住,默认情况下,使用ISO-8859-1字符编码读取属性文件。你需要通过unicode转义逃脱它们。这可以使用JDK提供的native2ascii.exe
工具完成。有关更多详细信息,另请参阅this article section。
理论上的替代方案是提供一个带有自定义Control
的bundle来将这些文件加载为UTF-8,但遗憾的是,基本的JSTL fmt
taglib不支持。您需要在Filter
的帮助下自行管理它。有一些(MVC)框架可以以更透明的方式处理这个问题,比如JSF,另见this article。
答案 1 :(得分:26)
除了BalusC所说的,你必须要注意方向性(因为英语是从左到右书写的,而阿拉伯语是相反的)。最简单的方法是将dir
属性添加到JSP网页的html
元素并将其外部化,因此值来自属性文件(就像其他元素或属性一样):
<html dir="${direction}">
...
</html>
此外,设置这样的应用程序几乎没有问题 - 你应该说至少避免绝对定位。如果由于某种原因无法避免这种情况,您可以使用不同的样式表(每种?)语言或执行 verboten 的操作,即使用表格来管理布局。如果你想使用div元素,我建议使用具有“对称”左右风格属性的相对定位(两者都具有相同的值),因为这是使切换方向性起作用的原因。
您可以找到有关双向网站的更多信息here。
答案 2 :(得分:2)
基于this tutorial,我在GAE上使用以下内容 - Google的App Engine:
jsp文件如下:
<%@ page import="java.io.* %>
<%
String lang = "fr"; //Assign the correct language either by page or user-selected or browser language etc.
ResourceBundle RB = ResourceBundle.getBundle("app", new Locale(lang));
%>
<!DOCTYPE html>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<head>
</head>
<body>
<p>
<%= RB.getString("greeting") %>
</p>
</body>
添加名为app.properties
(默认)和app_fr.properties
的文件(对于每种语言都是如此)。这些文件中的每一个都应包含您需要的字符串,如下所示:key:value_in_language,例如: app_fr.properties
包含:
greeting=Bonjour!
app.properties
包含:
greeting=Hello!
全部