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


81

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

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

私の目的:

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

回答:


221

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

これは、プロパティファイルベースのリソースバンドルを使用して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 = 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アルファ-2国コード。これはオプションであり、多くの場合、アメリカ英語_en_US)やイギリス英語_en_GB)など、国固有の言語方言を区別するためにのみ使用されます。


  2. まだ完了していない場合は、JSTLをインストールします。サーブレット2.5コンテナ以降(Tomcat 6.0など)で実行していてweb.xml、サーブレット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}">インフォームページが、それは重複コンテンツ(SEOのためにこのように、良い)としてマークされないようにしているどの言語searchbots。

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


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

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


2
この優れたソリューションには1つの問題があります。リクエストから取得したロケールは、「en_US」のように言語と国である可能性があり、無効なHTMLである<html lang = "en_US">が返されます。lang属性の値として、ロケールの言語部分「en」のみを使用する必要があります。
トルステン・レーマー

1
上記で概説した国際化の方法では、表示される言語に基づいてURLが修正されることはありません。言語に応じてURLを更新する方法について何か提案はありますか。:インデックス作成のために、異なる言語が別のURLを持っていることが推奨され、ので、私は聞いてsupport.google.com/webmasters/answer/...
theyuv

1
言語リソース(test.propertiesおよびtext_en.propertiesファイル)ファイルをapplication / resourcesルートに配置すると、fmt:bundleを次のように設定できます。<fmt:setBundle basename = "text" />
Bahadir Tasdemir

1
@bahadirT:「テスト」がタイプミスであると仮定すると、それは正しいです。basenameファイル拡張子なしのベース名を表している必要があります。パッケージに構造化しないことは、悪い習慣にすぎません。
BalusC 2016

1
@theyuv:User has {0} review{0,choice,0#s|1#|1<s} docs.oracle.com/javase/8/docs/api/java/text/MessageFormat.html
BalusC 2017

26

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

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

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

Bi-DirectionalのWebサイトについて詳しくは、こちらをご覧ください


7
はい、確かに、それも考慮に入れる必要があります。
BalusC 2010年

4
<html dir="RTL">または<html dir="LTR">。デフォルトは<html dir="LTR">
Fahim Parkar 2012年

2

このチュートリアルに基づいて、私はGAEで以下を使用しています-GoogleのAppEngine:

次のような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 app_fr.properties

greeting=Bonjour!

app.properties 含まれています:

greeting=Hello!

それで全部です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.