2010-11-25 55 views
72

我从Google了解到国际化是我可以让我的 网络应用程序使用所有语言的过程。我想了解国际化过程中的Unicode,所以我从herethere了解了Unicode。如何国际化Java Web应用程序?

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

我的目的:

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

回答

205

在基本的JSP/Servlet网络应用程序的情况下,基本方法将使用JSTLfmt taglib结合resource bundles。资源束包含键值对,其中键是常量,对于所有语言都是相同的,并且每个语言的值不同。资源包通常是由ResourceBundle API加载的properties files。这可以自定义,以便可以从数据库中加载键值对。

下面是一个示例,介绍如何使用基于属性文件的资源包将您的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(含西班牙文())键值对)

     
    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}">通知searchbots该网页的语言,以便它不会被标记为重复的内容(因此,对SEO很好)。

    当选择另一种语言时,语言下拉菜单将立即通过JavaScript提交,并且页面将使用新选择的语言进行刷新。


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

理论上的替代方案是提供一个包含自定义Control的包以将这些文件加载​​为UTF-8,但不幸的是,基本的JSTL fmt taglib不支持这种文件。您需要在Filter的帮助下自行管理。有(MVC)框架可以以更透明的方式处理这个问题,如JSF,另请参阅this article

+40

哇,尊重。看起来更像是教程而不仅仅是一个简单的答案:) – 2010-11-25 16:24:43

+0

非常感谢。我正在努力按照你所告诉的那样承诺。作为一名新人,我正在花时间。我会毫不动摇地工作,并带出我的怀疑。 – 2010-11-25 19:28:45

+0

感谢它的工作,正如我所做的一样,您所说的登录页面。现在我将在我的应用程序中遵循同样的内容。 – 2010-11-29 04:33:03

24

除了BalusC所说的,你必须注意方向性(因为英语是从左到右写的,而阿拉伯语是相反的)。最简单的方法是添加dir属性html元素你的JSP网页和外化,所以该值来自属性文件(也跟其他元素或属性):

<html dir="${direction}"> 
... 
</html> 

此外,也有少数与这样的应用程序样式相关的问题 - 你应该说至少避免绝对定位。如果由于某种原因你无法避免这种情况,你可以使用不同的样式表(每个?)语言或做一些事情,即verboten,即使用表格来管理布局。如果你想使用div元素,我建议使用“对称”左右风格属性(两者具有相同的值)的相对定位,因为这是使得切换方向性起作用的原因。

你可以找到更多关于双向网站here

1

基于this tutorial,我现在用的是上GAE以下 - 谷歌的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_fr.propertiesapp.properties(默认)和(每种语言都是如此)。这些文件中的每一个都应包含您需要的字符串,如下所示:key:value_in_language,例如app_fr.properties包含:

greeting=Bonjour! 

app.properties包含:

greeting=Hello! 

这是所有