以前のバージョンでのモジュール言語ファイルのオーバーライドをする
Liferay DXP 7.4 U4 (アップデート 4)以降、またはLiferay Portal 7.4 GA8以降では、Language Override toolを使用することが推奨されます。 Liferay DXP/Portal 7.4以降を使用している場合は、標準言語ファイルの上書きの手順に従ってください。
以前のバージョンで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-SymbolicName
、Bundle-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
にあります。
モジュールの場所は次のとおりです。
- Liferayの Nexusリポジトリ
[Liferay Home]/osgi/modules
liferay- [dxp|portal]/modules/apps
にあるソースコード
言語プロパティファイルは、モジュールのsrc/main/resources/content
フォルダにあります Language[xx_XX].properties
ファイルでオーバーライドする言語ファイルを特定します。
さまざまな言語とロケールの言語ファイルは、ファイル名の末尾で識別できます。 たとえば、Language_ja.properties
は日本語用です。
この例では、デフォルトのAdd Blog Entry
言語ファイルをカスタム言語ファイルに変更します。 今度はそれをデプロイします。
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 。
http://localhost:8080でLiferayへのサインインします。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。
次に、以下の手順を実行します。
-
liferay-e6u7.zip
をダウンロードして解凍する。curl https://resources.learn.liferay.com/dxp/latest/en/liferay-internals/extending-liferay/liferay-e6u7.zip -O
unzip liferay-e6u7.zip
-
モジュールのルートから、ビルドおよびデプロイします。
cd liferay-e6u7
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.e6u7.impl_1.0.0 [1650]
-
[コンテンツ & データ] → [ブログ] に移動します。 カーソルを追加アイコン()に合わせます。 メッセージにカスタム言語ファイルが表示されます。
-
チュートリアルコードには、他のロケールの例も含まれています。 たとえば、言語セレクターを使用してブラジルのポルトガル語または日本語を選択すると、カスタム言語ファイルが表示されます。 モジュールは、モジュールに含める各ロケールの言語ファイルをオーバーライドします。
次に、コードがどのように機能するかを確認します。
言語プロパティファイルを作成する
オーバーライドする翻訳ファイルを選択します。 たとえば、このチュートリアルコードは、Add Blog Entry
言語ファイルをオーバーライドします。
オーバーライドする言語ファイルを決定したら、モジュールのsrc/main/resources/content
フォルダに言語プロパティファイルを作成します。 ファイルで言語ファイルを定義します。 ファイル名がオーバーライドするロケールと一致していることを確認してください。 たとえば、日本語の場合は、Language_ja.properties
を使用します。
add-blog-entry=E6U7 ブログの追加
言語リソースバンドルを作成する
モジュールで、オーバーライドするロケールのjava.util.ResourceBundle
を拡張するクラスを作成します。 en_US
ロケールのリソースバンドルクラスの例を次に示します。
@Component(property = "language.id=en_US", service = ResourceBundle.class)
public class E6U7EnglishResourceBundle extends ResourceBundle {
@Override
public Enumeration<String> getKeys() {
return _resourceBundle.getKeys();
}
@Override
protected Object handleGetObject(String key) {
return _resourceBundle.getObject(key);
}
private final ResourceBundle _resourceBundle = ResourceBundle.getBundle(
"content.Language_en_US", UTF8Control.INSTANCE);
}
クラスの_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
ロケール用にそれを指定します。
@Component(property = "language.id=en_US", service = ResourceBundle.class)
クラスは次のメソッドをオーバーライドします。
handleGetObject
: モジュールのリソースバンドル(モジュールの言語プロパティファイルに基づく)で言語ファイルを検索し、キーの値をObject
として返します。
getKeys
: リソースバンドルのキーのEnumeration
を返します。
リソースバンドルサービスコンポーネントは、デフォルトの言語ファイルをモジュールの言語ファイルオーバーライドにリダイレクトします。
注: 複数のロケールのモジュール言語ファイルをオーバーライドするには、ロケールごとに個別のリソースバンドルクラスが必要です。 たとえば、このチュートリアルコードには、英語、日本語、ポルトガル語用があります。 各リソースバンドルは、language.id
コンポーネントのプロパティ定義と言語ファイルの修飾名パラメーターでロケールを指定する必要があります。 たとえば、日本語ロケールでは次のようになります。
コンポーネント定義:
@Component(property = "language.id=ja", service = ResourceBundle.class)
リソースバンドルの割り当て:
private final ResourceBundle _resourceBundle = ResourceBundle.getBundle(
"content.Language_ja", UTF8Control.INSTANCE);
モジュールのリソースバンドルに優先順位を付ける
ターゲットモジュールがカスタム言語ファイルを使用するには、OSGIマニフェストヘッダーでリソースバンドルを指定する必要があります。 最初にモジュールを一覧表示することで、ターゲットモジュールのリソースバンドルよりもそのリソースバンドルを優先させます。 これにより、2つのリソースが集約されます。 チュートリアルモジュールcom.acme.e6u7.impl
の例では、ターゲットモジュールcom.liferay.blogs.web
のリソースバンドルよりもリソースバンドルを優先しています。
Provide-Capability:\
liferay.resource.bundle;\
resource.bundle.base.name="content.Language",\
liferay.resource.bundle;\
bundle.symbolic.name=com.liferay.blogs.web;\
resource.bundle.aggregate:String="(bundle.symbolic.name=com.acme.e6u7.impl),(bundle.symbolic.name=com.liferay.blogs.web)";\
resource.bundle.base.name="content.Language";\
service.ranking:Long="2";\
servlet.context.name=blogs-web
サンプルのProvide-Capability
ヘッダには、次の2つの部分があります。
-
liferay.resource.bundle;resource.bundle.base.name="content.Language"
は、モジュールがベース名content.Language
のリソースバンドルを提供することを宣言します。 -
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.web
のcontent.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
ヘッダーを 標準言語ファイルの上書き で示されているヘッダーに置き換えることで、モジュールを簡素化することができます。
結果を検索して、ランキングが高いリソースバンドル集約サービスを探します。