如何国际化Java Web应用程序?

时间:2010-11-25 10:33:49

标签: java jsp unicode internationalization

我从谷歌那里了解到,国际化是我创造国际化的过程 Web应用程序使用所有语言。我想了解Unicode的国际化进程,所以我从herethere了解了Unicode。

我能够理解Unicode如何将字符集设置为字节并再次将字节解码为字符集。但我不知道如何进一步前进。我想学习如何比较字符串,我需要知道如何在我的Web应用程序中实现国际化。有什么建议吗?请指导我。

我的目标:

我的主要目标是开发一个用于翻译的Web应用程序(英语到阿拉伯语,反之亦然)。我想遵循国际化。我希望在所有三种浏览器中运行我的Web应用程序进行翻译,即FF,Chrome,IE。我如何实现这一目标?

3 个答案:

答案 0 :(得分:218)

对于基本的JSP / Servlet Web应用程序,基本方法是将JSTL fmt taglibresource bundles结合使用。资源包包含键值对,其中键是常量,对于所有语言都是相同的,并且每种语言的值不同。资源包通常是properties files,由ResourceBundle API加载。但是,可以对其进行自定义,以便您可以从例如数据库加载键值对。

以下是如何使用基于属性文件的资源包来实现Web应用程序登录表单的国际化。


  1. 创建以下文件并将其放入某个包中,例如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)。


  2. 如果尚未完成,请安装JSTL。如果您正在运行Servlet 2.5容器或更新版本(Tomcat 6.0等)并且您的web.xml被声明符合Servlet 2.5规范,那么只需将jstl-1.2.jar放入webapp的/WEB-INF/lib文件夹中


  3. 创建以下示例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提交。


  4. 但是,您需要记住,默认情况下,使用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!

全部