如何国际化Java Web应用程序? [英] How to internationalize a Java web application?

查看:168
本文介绍了如何国际化Java Web应用程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I learnt from Google that Internationalization is the process by which I can make my web application to use all languages. I want to understand Unicode for the process of internationalization, so I learnt about Unicode from here and there.

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

I am able to understand about Unicode that how a charset set in encoded to bytes and again bytes decoded to charset. But I don't know how to move forward further. I want to learn how to compare strings and I need to know how to implement internationalization in my web application. Any Suggestions Please? Please guide me.

我的目标:

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

My main objective is to develop a Web Application for Translation (English to Arabic & vice versa). I want to follow Internationalization. I wish to run my web Application for translation in all the three browsers namely FF, Chrome, IE. How do I achieve this?

推荐答案

如果是基本的JSP / Servlet Web应用程序,基本方法是使用 JSTL fmt taglib 与< a href =http://docs.oracle.com/javase/tutorial/i18n/resbundle/index.html =noreferrer>资源包。资源包包含键值对,其中键是常量,对于所有语言都是相同的,并且每种语言的值不同。资源包通常是属性文件,由 ResourceBundle API。但是,这可以自定义,以便您可以从例如数据库加载键值对。

In case of a basic JSP/Servlet webapplication, the basic approach would be using JSTL fmt taglib in combination with resource bundles. Resource bundles contain key-value pairs where the key is a constant which is the same for all languages and the value differs per language. Resource bundles are usually properties files which are loaded by ResourceBundle API. This can however be customized so that you can load the key-value pairs from for example a database.

这是一个如何使用属性来国际化Web应用程序的登录表单的示例基于文件的资源包。

Here's an example how to internationalize the login form of your webapplication with properties file based resource bundles.


  1. 创建以下文件并将其放入某些文件中包裹,例如 com.example.i18n (如果是Maven,请将它们放在 src / main / resources 内的包结构中) 。

  1. Create the following files and put them in some package, e.g. com.example.i18n (in case of Maven, put them in the package structure inside src/main/resources).

text.properties (包含默认语言的键值对,通常为英语)

text.properties (contains key-value pairs in the default language, usually English)


login.label.username = Username
login.label.password = Password
login.button.submit = Sign in






text_nl.properties (包含荷兰语( nl )键值对)


text_nl.properties (contains Dutch (nl) key-value pairs)


login.label.username = Gebruikersnaam
login.label.password = Wachtwoord
login.button.submit = Inloggen






text_es.properties (包含西班牙语( es )键值对)


text_es.properties (contains Spanish (es) key-value pairs)


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 )。

The resource bundle filename should adhere the following pattern name_ll_CC.properties. The _ll part should be the lowercase ISO 693-1 language code. It is optional and only required whenever the _CC part is present. The _CC part should be the uppercase ISO 3166-1 Alpha-2 country code. It is optional and often only used to distinguish between country-specific language dialects, like American English (_en_US) and British English (_en_GB).

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

If not done yet, install JSTL. If you're running on a Servlet 2.5 container or newer (Tomcat 6.0 and so on) and your web.xml is declared conform the Servlet 2.5 specification, then just put jstl-1.2.jar in webapp's /WEB-INF/lib folder.

创建以下示例JSP文件并将其放在Web内容文件夹中。

Create the following example JSP file and put it in web content folder.

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> 管理当前语言。如果语言是作为请求参数提供的(通过语言下拉列表),那么它将被设置。否则如果语言先前已在会话中设置,则坚持使用它。否则,请在请求标头中使用用户提供的区域设置。

The <c:set var="language"> manages the current language. If the language was supplied as request parameter (by language dropdown), then it will be set. Else if the language was already previously set in the session, then stick to it instead. Else use the user supplied locale in the request header.

< fmt:setLocale> 设置区域设置资源包。重要的是此行之前 < fmt:setBundle>

The <fmt:setLocale> sets the locale for resource bundle. It's important that this line is before the <fmt:setBundle>.

< fmt:setBundle> 按其基本名称(即完整限定的包名称)初始化资源包,直到唯一的名称没有 _ll_CC 说明符)。

The <fmt:setBundle> initializes the resource bundle by its base name (that is, the full qualified package name until with the sole name without the _ll_CC specifier).

< fmt:message> 检索邮件值通过指定的捆绑密钥。

The <fmt:message> retrieves the message value by the specified bundle key.

< html lang =$ {language}> 通知searchbots页面所用的语言,以便它不会被标记为重复内容(因此,对SEO有利)。

The <html lang="${language}"> informs the searchbots what language the page is in so that it won't be marked as duplicate content (thus, good for SEO).

语言下拉列表将立即由JavaScript提交选择另一种语言,页面将使用新选择的语言刷新。

The language dropdown will immediately submit by JavaScript when another language is chosen and the page will be refreshed with the newly chosen language.






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


You however need to keep in mind that properties files are by default read using ISO-8859-1 character encoding. You would need to escape them by unicode escapes. This can be done using the JDK-supplied native2ascii.exe tool. See also this article section for more detail.

理论上的替代方案是提供一个带有自定义的包 控制 将这些文件加载​​为UTF-8,但遗憾的是,不支持基本JSTL fmt taglib。你需要在过滤器的帮助下自己管理它。有一些(MVC)框架可以以更透明的方式处理这个问题,比如JSF,另见这篇文章

A theoretical alternative would be to supply a bundle with a custom Control to load those files as UTF-8, but that's unfortunately not supported by the basic JSTL fmt taglib. You would need to manage it all yourself with help of a Filter. There are (MVC) frameworks which can handle this in a more transparent manner, like JSF, see also this article.

这篇关于如何国际化Java Web应用程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆