如何国际化/本地化JSP/Servlet Web应用程序? [英] How to internationalize/localize a JSP/Servlet web application?

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

问题描述

我从Google得知,国际化是我建立自己的过程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翻译应用程序(英语到阿拉伯语,反之亦然).我想关注国际化.我希望在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应用程序,基本方法是使用属性文件,它们由 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:

If not done yet, install JSTL as per instructions in this answer: How to install JSTL? The absolute uri: http://java.sun.com/jstl/core cannot be resolved.

创建以下示例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 =语言"> 管理当前语言.如果语言是作为请求参数提供的(通过语言下拉列表),则将对其进行设置.否则,如果会话中已预先设置了语言,则请坚持使用.否则,请在请求标头中使用用户提供的语言环境.

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}"> 通知搜索引擎网页所用的语言,以使该网页不会被标记为重复内容(因此,很好搜索引擎优化(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).

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

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.

一种理论上的选择是为捆绑包提供自定义这篇文章.

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.

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

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