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

Iam*_*MAN 80 java unicode jsp internationalization

我从谷歌那里了解到,国际化是我使用我的网络应用程序来使用所有语言的过程.我想了解Unicode的国际化过程,所以我从这里那里学习了Unicode .

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

我的目标:

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

Bal*_*usC 219

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

以下是如何使用基于属性文件的资源包来使webapplication的登录表单国际化的示例.


  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(包含Dutch(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国家代码.它是可选的,通常仅用于区分国家特定的语言方言,如美式英语(_en_US)和英式英语(_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>
    
    Run Code Online (Sandbox Code Playgroud)

    <c:set var="language">管理当前语言.如果语言是作为请求参数提供的(通过语言下拉列表),那么它将被设置.否则如果语言先前已在会话中设置,则坚持使用它.否则,请在请求标头中使用用户提供的区域设置.

    <fmt:setLocale>套语言环境资源包.重要的是,这条线是之前<fmt:setBundle>.

    <fmt:setBundle>通过其基本名称初始化资源包(即,完全限定的包名称,直到与没有唯一名称_ll_CC指定符).

    所述<fmt:message>检索由指定捆密钥的消息值.

    <html lang="${language}">通知searchbots的页面是什么语言,这样就不会被重复的内容标记(因此,有利于搜索引擎优化).

    当选择其他语言时,语言下拉列表将立即通过JavaScript提交,并且页面将使用新选择的语言刷新.


但是,您需要记住,默认情况下,使用ISO-8859-1字符编码读取属性文件.你需要通过unicode转义逃脱它们.这可以使用JDK提供的native2ascii.exe工具完成.有关更多详细信息,另请参阅本文章节.

理论上的替代方案是提供一个带有自定义的bundle Control来将这些文件加载​​为UTF-8,但遗憾的是,基本的JSTL fmttaglib 不支持.你需要在a的帮助下自己管理它Filter.有一些(MVC)框架可以以更透明的方式处理这个问题,比如JSF,另见本文.

  • 这个好的解决方案有一个问题:从请求中获取的语言环境可以是语言和国家,如"en_US",这将提供<html lang ="en_US">,这是无效的HTML.必须仅使用语言环境中的语言部分"en"作为lang属性的值. (2认同)

Paw*_*yda 26

除了BalusC所说的,你必须要注意方向性(因为英语是从左到右,而阿拉伯语是相反的).最简单的方法是将dir属性添加到htmlJSP网页的元素并将其外部化,因此值来自属性文件(就像其他元素或属性一样):

<html dir="${direction}">
...
</html>
Run Code Online (Sandbox Code Playgroud)

此外,设置这样的应用程序几乎没有问题 - 你应该说至少避免绝对定位.如果你出于某种原因无法避免这种情况,你可以使用不同的样式表(每种?)语言或做一些禁止使用的表格,即使用表格来管理布局.如果你想使用div元素,我建议使用具有"对称"左右风格属性的相对定位(两者都具有相同的值),因为这是使切换方向性起作用的原因.

您可以在此处找到有关双向网站的更多信息.

  • 是的,的确,这也必须考虑在内. (7认同)
  • `<html dir ="RTL">`或`<html dir ="LTR">`.默认为`<html dir ="LTR">` (4认同)