web-dev-qa-db-ja.com

Java Webアプリケーションを国際化する方法は?

国際化は、すべての言語を使用するWebアプリケーションを作成できるプロセスであることをGoogleから学びました。国際化のプロセスについてUnicodeを理解したいので、 here および there からUnicodeについて学びました。

文字セットがどのようにエンコードされてバイトに設定され、再びバイトが文字セットにデコードされるかについて、ユニコードについて理解できます。しかし、私はさらに前進する方法がわかりません。文字列を比較する方法を学びたいのですが、Webアプリケーションに国際化を実装する方法を知る必要があります。提案はありますか?案内してください。

私の目的:

私の主な目的は、翻訳用のWebアプリケーション(英語からアラビア語、およびその逆)を開発することです。国際化をフォローしたい。 3つのブラウザ、つまりFF、Chrome、IEのすべてで翻訳用のWebアプリケーションを実行したいと思います。どうすればこれを達成できますか?

80
IamIronMAN

基本的なJSP /サーブレットWebアプリケーションの場合、基本的なアプローチは [〜#〜] jstl [〜#〜]fmt taglib を組み合わせて使用​​することです。 リソースバンドル で。リソースバンドルにはキーと値のペアが含まれ、キーはすべての言語で同じ定数であり、値は言語ごとに異なります。通常、リソースバンドルは プロパティファイル で、これは ResourceBundle APIによってロードされます。ただし、これは、たとえばデータベースからキーと値のペアをロードできるようにカスタマイズできます。

以下は、プロパティファイルベースのリソースバンドルを使用して、Webアプリケーションのログインフォームを国際化する方法の例です。


  1. 以下のファイルを作成し、それらを何らかのパッケージに入れます。 com.example.i18n(Mavenの場合は、src/main/resources内のパッケージ構造に入れてください)。

    text.properties(通常は英語のデフォルト言語のキーと値のペアが含まれます)

     login.label.username =ユーザー名
     login.label.password =パスワード
     login.button.submit =サインイン
    

    text_nl.properties(オランダ語(nl)キーと値のペアを含む)

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

    text_es.properties(スペイン語(es)キーと値のペアを含む)

     login.label.username = Noubre 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>
    

    <c:set var="language">は現在の言語を管理します。言語が(言語ドロップダウンによって)要求パラメーターとして提供された場合は、設定されます。それ以外の場合、言語がセッションで既に設定されている場合は、代わりにその言語に固執します。それ以外の場合は、リクエストヘッダーでユーザーが指定したロケールを使用します。

    <fmt:setLocale>は、リソースバンドルのロケールを設定します。この行がbefore the <fmt:setBundle>であることが重要です。

    <fmt:setBundle>は、ベース名(つまり、_ll_CC指定子のない唯一の名前を持つまでの完全修飾パッケージ名)によってリソースバンドルを初期化します。

    <fmt:message>は、指定されたバンドルキーによってメッセージ値を取得します。

    <html lang="${language}">は、ページがどの言語にあるかを検索ボットに通知し、重複コンテンツとしてマークされないようにします(したがって、SEOに適しています)。

    言語ドロップダウンは、別の言語が選択されるとすぐにJavaScriptによって送信され、新しく選択された言語でページが更新されます。


ただし、プロパティファイルはデフォルトでISO-8859-1文字エンコーディングを使用して読み取られることに注意してください。 Unicodeエスケープでエスケープする必要があります。これは、JDKが提供するnative2ascii.exeツールを使用して実行できます。詳しくは この記事のセクション もご覧ください。

理論的な代替案は、カスタムの Control をバンドルに提供してそれらのファイルをUTF-8としてロードすることですが、残念ながら基本的なJSTL fmt taglibではサポートされていません。 Filterを使用して、すべて自分で管理する必要があります。 JSFのように、これをより透過的な方法で処理できる(MVC)フレームワークがあります。 この記事 も参照してください。

218
BalusC

BalusCが言ったことに加えて、方向性にも注意する必要があります(英語は左から右に、アラビア語は逆に書かれているため)。最も簡単な方法は、JSP Webページのdir要素にhtml属性を追加して外部化することです。そのため、値はプロパティファイルから取得されます(他の要素または属性と同様)。

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

また、そのようなアプリケーションのスタイリングにはほとんど問題がありません-絶対に配置しないでください。何らかの理由でそれを避けることができない場合は、(各?)言語ごとに異なるスタイルシートを使用するか、verbotenであるテーブルを使用する何かを行うことができますレイアウトを管理します。 div要素を使用する場合は、「対称」の左右のスタイル属性(両方とも同じ値)を使用した相対配置を使用することをお勧めします。これにより、方向性の切り替えが機能するからです。

双方向ウェブサイトの詳細については、こちらをご覧ください こちら

26
Paweł Dyda

このチュートリアル に基づいて、GAEで次を使用しています-Googleの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.properties(デフォルト)およびapp_fr.properties(すべての言語で同様)。これらの各ファイルには、次のように必要な文字列を含める必要があります:key:value_in_language、e.g。 app_fr.propertiesに含まれるもの:

greeting=Bonjour!

app.propertiesに含まれるもの:

greeting=Hello!

それで全部です

2