2010-11-25 56 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! 

這是所有