1. ホーム
  2. jsp

[解決済み] JSP/ServletのWebアプリケーションを国際化/ローカライズするには?

2023-06-21 22:32:40

質問

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

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

私の目的

私の主な目的は、翻訳のためのWebアプリケーションを開発することです(英語からアラビア語&逆も同様)。私は、国際化に従いたいと思います。私はすべての3つのブラウザ、すなわちFF、Chrome、IEで翻訳のための私のWebアプリケーションを実行したい。 どのように私はこれを達成するのでしょうか?

どのように解決するのですか?

基本的なJSP/ServletのWebアプリケーションの場合、基本的な方法としては JSTL fmt タグリブ と組み合わせて リソースバンドル . リソースバンドルはキーと値のペアを含み、キーは全言語で同じ定数、値は言語ごとに異なります。リソースバンドルは通常 プロパティファイル で読み込まれます。 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 = パスワード
     login.button.submit = ログアウト
     
    

    text_es.properties (スペイン語( es ) キー・バリュー・ペア)

     login.label.username = ユーザ名
     login.label.password=ユーザー名
     login.button.submit = 登録する
     
    

    リソースバンドルのファイル名は、次のパターンに従います。 name_ll_CC.properties . この場合 _ll の部分は小文字の ISO 693-1 言語コードです。これはオプションであり _CC 部分が存在する場合にのみ必要です。また _CC の部分は、大文字の ISO 3166-1 アルファ2 の国別コードです。これはオプションで、多くの場合、次のような国特有の言語方言を区別するためにのみ使用されます。 アメリカ英語 ( _en_US ) と イギリス英語 ( _en_GB ).


  2. まだの場合は、この回答の指示に従って、JSTLをインストールしてください。 JSTLをインストールする方法を教えてください。絶対URI: http://java.sun.com/jstl/core が解決できません。 .


  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に有利です)。

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


しかし、プロパティ ファイルはデフォルトで ISO-8859-1 文字エンコードを使用して読み込まれることに留意する必要があります。ユニコード エスケープを使用してそれらをエスケープする必要があります。これは、JDK が提供する native2ascii.exe ツールを使って行うことができます。また この記事部分 をご覧ください。

理論的な代替案としては、バンドルにカスタムの Control でこれらのファイルを UTF-8 として読み込むことができますが、残念ながら、これは基本的な JSTL の fmt タグライブラリではサポートされていません。の助けを借りて、自分ですべてを管理する必要があります。 Filter . JSFのように、より透明性の高い方法でこれを処理できる(MVC)フレームワークがあります。 この記事 .