Documentation

以前のバージョンでのモジュール言語キーのオーバーライドをする

重要

Liferay DXP/Portal 7.4以降を使用している場合は、Overriding Global Language Keysの手順に従ってください。

以前のバージョンでLiferayアプリケーション固有の言語キーをオーバーライドすることは、以前のバージョンでのグローバル言語キーのオーバーライドと似ていますが、追加の手順があります。

モジュール言語キーを調べる

モジュールの言語キーを上書きするには、最初にGogoシェルでモジュールに関する情報を収集する必要があります。 たとえば、ブログモジュールの言語キーをオーバーライドする場合は、grepでキーワード「blogs」を検索します。 Gogoコマンドと出力は次のようになります。

g! lb | grep Blogs
Output
418|Active     |   10|Liferay Collaboration - Liferay Blogs - API (1.0.0)|1.0.0
419|Active     |   10|Liferay Blogs API (6.4.5)|6.4.5
420|Active     |   10|Liferay Blogs Item Selector API (4.0.5)|4.0.5
421|Active     |   10|Liferay Blogs Recent Bloggers API (4.0.5)|4.0.5
570|Active     |   10|Liferay Adaptive Media Blogs Editor Configuration (4.0.5)|4.0.5
571|Active     |   10|Liferay Adaptive Media Blogs Item Selector Web (4.0.5)|4.0.5
572|Active     |   10|Liferay Adaptive Media Blogs Web (4.0.9)|4.0.9
573|Resolved   |   10|Liferay Adaptive Media Blogs Web Fragment (4.0.6)|4.0.6
671|Active     |   15|Liferay Sharing Blogs (2.0.6)|2.0.6
1126|Active     |   10|Liferay Collaboration - Liferay Blogs - Impl (1.0.0)|1.0.0
1127|Active     |   10|Liferay Blogs Editor Configuration (4.0.8)|4.0.8
1128|Active     |   15|Liferay Blogs Item Selector Web (5.0.9)|5.0.9
1129|Active     |   10|Liferay Blogs Layout Prototype (5.0.8)|5.0.8
1130|Active     |   10|Liferay Blogs Reading Time (3.0.11)|3.0.11
1131|Active     |   15|Liferay Blogs Recent Bloggers Web (5.0.11)|5.0.11
1132|Active     |   10|Liferay Blogs Service (4.0.24)|4.0.24
1133|Active     |   10|Liferay Blogs UAD (5.0.6)|5.0.6
1134|Active     |   15|Liferay Blogs Web (5.0.36)|5.0.36
true

モジュールのID番号をメモします。 バンドルのヘッダーのリストを取得するには、headersコマンドを使用します。 この場合は、Liferay Blogs Webモジュールの1134です。

g! headers 1134
Output
Bundle headers:
Bnd-LastModified = 1601503219290
Bundle-ManifestVersion = 2
Bundle-Name = Liferay Blogs Web
Bundle-SymbolicName = com.liferay.blogs.web
Bundle-Vendor = Liferay, Inc.
Bundle-Version = 5.0.36
...
Web-ContextPath = /blogs-web

Bundle-SymbolicNameBundle-Version、およびWeb-ContextPathに注目してください。 /に続くWeb-ContextPath値は、モジュールのコンテキスト名です。

バンドルのシンボリック名またはコンテキスト名を使用して、モジュールに固有の言語キーを検索します。 モジュールのJARファイルを見つけて、その言語キーを調べます。 Liferayは、このモジュールのJARファイルの命名規則に従います。

[bundle symbolic name]-[version].jar

たとえば、Blogs Webバージョン5.0.36モジュールはcom.liferay.blogs.web-5.0.36.jarにあります。

モジュールの場所は次のとおりです。

言語プロパティファイルは、モジュールのsrc/main/resources/contentフォルダにあります Language[xx_XX].propertiesファイルでオーバーライドする言語キーを特定します。

さまざまな言語とロケールの言語キーは、ファイル名の末尾で識別できます。 たとえば、Language_ja.propertiesは日本語用です。

この例では、デフォルトのAdd Blog Entry言語キーをカスタムキーに変更します。 今度はそれをデプロイします。

新しいLiferayインスタンスを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22

http://localhost:8080でLiferayにサインインします。メールアドレスtest@liferay.comとパスワードtestを使用してください。プロンプトが表示されたら、パスワードをlearnに変更します。

次に、以下の手順を実行します。

  1. liferay-e6u7.zipをダウンロードして解凍します。

    curl https://learn.liferay.com/dxp/latest/ja/liferay-internals/extending-liferay/liferay-e6u7.zip -O
    
    unzip liferay-e6u7.zip
    
  2. モジュールのルートから、ビルドおよびデプロイします。

    cd liferay-e6u7
    
    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    注釈

    このコマンドは、デプロイされたjarをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。

  3. Liferay Dockerコンテナコンソールでデプロイを確認します。

    STARTED com.acme.e6u7.impl_1.0.0 [1650]
    
  4. Content & Data] → [Blogs] に移動します。 カーソルを追加アイコン(Add)に合わせます。 メッセージにカスタム言語キーが表示されます。

    カスタム言語キーが使用されるようになりました。

  5. チュートリアルコードには、他のロケールの例も含まれています。 たとえば、言語セレクターを使用してブラジルポルトガル語または日本語を選択すると、カスタム言語キーが表示されます。 モジュールは、モジュールに含める各ロケールの言語キーをオーバーライドします。

    カスタム言語キーは、ポルトガル語と日本語にも使用されます。

次に、コードがどのように機能するかを確認します。

言語プロパティファイルを作成する

まず、オーバーライドするキーを選択します。 たとえば、このチュートリアルコードは、Add Blog Entry言語キーをオーバーライドします。

オーバーライドするキーを決定したら、モジュールのsrc/main/resources/contentフォルダに言語プロパティファイルを作成します。 ファイルでキーを定義します。 ファイル名がオーバーライドするロケールと一致していることを確認してください。 たとえば、日本語の場合は、Language_ja.propertiesを使用します。

言語リソースバンドルを作成する

モジュールで、オーバーライドするロケールのjava.util.ResourceBundleを拡張するクラスを作成します。 en_USロケールのリソースバンドルクラスの例を次に示します。

クラスの_resourceBundleフィールドにはResourceBundleが割り当てられます。 ResourceBundle.getBundleの呼び出しには、2つのパラメーターが必要です。 content.Language_en_USパラメーターは、モジュールのsrc/main/resources/contentフォルダに対する言語ファイルの修飾名です。 2番目のパラメーターは、リソースバンドルの言語構文を設定するcontrolです。 Liferayの構文と同じ言語構文を使用するには、Liferayのcom.liferay.portal.kernel.language.UTF8Controlクラスをインポートし、2番目のパラメーターをUTF8Control.INSTANCEに設定します。

クラスの@Componentアノテーションは、それをOSGi ResourceBundle サービスコンポーネントとして宣言します。 そのlanguage.idプロパティは、en_USロケール用にそれを指定します。

クラスは次のメソッドをオーバーライドします。

handleGetObject モジュールのリソースバンドル(モジュールの言語プロパティファイルに基づく)でキーを検索し、キーの値をObjectとして返します。

getKeys リソースバンドルのキーのEnumerationを返します。

リソースバンドルサービスコンポーネントは、デフォルトの言語キーをモジュールの言語キーオーバーライドにリダイレクトします。

注: 複数のロケールのモジュール言語キーをオーバーライドするには、ロケールごとに個別のリソースバンドルクラスが必要です。 たとえば、このチュートリアルコードには、英語、日本語、ポルトガル語用のクラスがあります。 各リソースバンドルは、language.idコンポーネントのプロパティ定義と言語ファイルの修飾名パラメーターでロケールを指定する必要があります。 たとえば、日本語ロケールでは次のようになります。

コンポーネント定義:

リソースバンドルの割り当て:

モジュールのリソースバンドルに優先順位を付ける

ターゲットモジュールがカスタム言語キーを使用するには、OSGIマニフェストヘッダーでリソースバンドルを指定する必要があります。 目的のモジュールを最初に一覧表示することで、ターゲットモジュールのリソースバンドルよりもそのリソースバンドルを優先させます。 これにより、2つのリソースが集約されます。 チュートリアルモジュールcom.acme.e6u7.implの例を次に示します。この例では、ターゲットモジュールcom.liferay.blogs.webのリソースバンドルよりもリソースバンドルを優先しています。

サンプルのProvide-Capabilityヘッダーには、次の2つの部分があります。

  1. liferay.resource.bundle;resource.bundle.base.name="content.Language"は、モジュールがベース名content.Languageのリソースバンドルを提供することを宣言します。

  2. liferay.resource.bundle;resource.bundle.aggregate:String=...ディレクティブは、集約するリソースバンドルを含むバンドルのリスト、ターゲットバンドル、ターゲットバンドルのリソースバンドル名、およびこのサービスのランキングを指定します。

    • "(bundle.symbolic.name=com.acme.e6u7.impl)、(bundle.symbolic.name=com.liferay.blogs.web)":このサービスは、バンドルcom.acme.e6u7.implおよびcom.liferay.blogs.webからリソースバンドルを集約します。 必要な数のバンドルを集約します。 リストされたバンドルは降順で優先されます。

    • bundle.symbolic.name=com.liferay.blogs.web;resource.bundle.base.name="content.Language"content.Languageという名前のcom.liferay.blogs.webバンドルのリソースバンドルをオーバーライドします。

    • service.ranking:Long="2":リソースバンドルのサービスランキングは2です。 OSGiフレームワークは、このサービスがcom.liferay.blogs.webcontent.Languageリソースバンドルを対象とする他のすべてのリソースバンドルサービスを上回る場合、このサービスを適用します。

    • servlet.context.name=blogs-web:ターゲットリソースバンドルはサーブレットコンテキストblogs-webにあります。

注釈

オーバーライドが表示されない場合は、Gogoシェルを使用して、競合するリソースバンドルサービスを確認してください。 別のサービスのランクのほうが高い可能性があります。 たとえば、com.liferay.blogs.webのリソースバンドルが集約されている競合するリソースバンドルサービスを確認するには、以下のGogoシェルコマンドを実行します。

services "(bundle.symbolic.name=com.liferay.blogs.web)"

注釈

言語キー名が同じ場合は、DXP7.4以降で言語キーオーバーライドを引き続き使用できます--- /modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language [_xx_XX].properties ファイルを確認してください。 オプションとして、ResourceBundleクラスを削除し、bnd.bndファイルのProvide-Capabilityヘッダーを Overriding Global Language Keys で示されているヘッダーに置き換えることで、モジュールを簡素化することができます。

結果を検索して、ランキングが高いリソースバンドル集約サービスを探します。

関連情報

  • グローバル言語キーのオーバーライド