標準言語ファイルの上書き方法
Liferay DXP/Portalでは、言語ファイルを使用して、デフォルトロケールと他の多くのロケールの見出し、ラベル、およびメッセージを実装します。 モジュール内の新しい言語ファイル値を使用して、任意のロケールのこれらの翻訳をオーバーライドできます。
言語翻訳をオーバーライドするには、Language Override toolを使用することをお勧めします。 このツールは、Liferay DXP 7.4 U4 (Update 4)以上、またはLiferay Portal 7.4 GA8以上で使用できます。 以前の方法を続けて読んでください。
標準言語ファイルの検証
標準言語ファイルは、ソースコードとDXP/Portalバンドルに含まれています。
ソースの場合:
liferay-[dxp|portal]/portal-impl/src/content/Language [_xx_XX].properties
liferay-[dxp|portal]/modules/apps/portal-language/portal-language-lang/src/main/resources/content/Language [_xx_XX].properties
バンドルの場合:
portal-impl.jar#content/Language[_xx_XX].properties
Liferay Foundation - Liferay Portal Language - Impl.lpkg
→com.liferay.portal.language.lang-[version].jar#content/Language[_xx_XX].properties
さまざまな言語とロケールの言語ファイルは、ファイル名の末尾で識別できます。 たとえば、Language_ja.properties
は日本語用です。
これらの言語ファイルには、言語設定プロパティなど、オーバーライドできるプロパティが含まれています。
...
lang.user.name.field.names=prefix,first-name,middle-name,last-name,suffix
lang.user.name.prefix.values=Dr,Mr,Ms,Mrs
lang.user.name.required.field.names=last-name
lang.user.name.suffix.values=II,III,IV,Jr,Phd,Sr
...
メッセージやラベル用にオーバーライドできる単純な翻訳もたくさんあります。
category.admin=Admin
category.alfresco=Alfresco
category.christianity=Christianity
category.cms=Content Management
...
プログラムによる言語ファイルのオーバーライド
Liferay DXP/Portal 7.4+では、メタデータを使用してオーバーライドを宣言できます。 以前のバージョンでは、Javaクラスがオーバーライドを宣言します。
お使いのバージョンが7.4より前の場合は、 以前のバージョンでのオーバーライド に進んでください。 それ以外の場合は、読み進めてください。
サンプルをデプロイする(7.4以降の場合)
この例では、home
言語ファイル設定を次のように変更します。
home=I2F4 Home
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.75-ga75。
http://localhost:8080でLiferayへのサインインします。 メールアドレス[email protected]_とパスワード_test_を使用してください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順でサンプルをデプロイします。
Download and unzip the
liferay-i2f4.zip
example project.curl https://resources.learn.liferay.com/dxp/latest/ja/liferay-internals/extending-liferay/liferay-i2f4.zip -O
unzip liferay-i2f4.zip
プロジェクトモジュールをビルドしてデプロイします。
cd liferay-i2f4
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.i2f4.impl_1.0.0 [3209]
サンプルモジュールのカスタマイゼーションを確認します。 ブラウザで
https://localhost:8080
を開きます。メニューアイコン(
)をクリックします。 ホームアイコンラベルには、カスタム言語ファイル値が使用されています。
この例には、複数のロケールのカスタム言語ファイル値が含まれています。 たとえば、言語セレクターでブラジルのポルトガル語または日本語を選択すると、そのロケールでのカスタマイゼーションが表示されます。 モジュールは、これらのロケールの言語ファイルもオーバーライドします。
例を見たところで、次にこれがどのように機能するかを確認していきます。
言語プロパティファイルを作成する
オーバーライドしたい翻訳ファイルを選択します。 サンプルモジュールは、home
言語ファイルをオーバーライドします。
home=I2F4 Home
宣言する言語ファイルの値は、それらの既存の言語ファイルの値をオーバーライドします。 他のすべての既存の言語ファイル設定は保持されます。
オーバーライドする言語ファイルを決定したら、モジュールのsrc/main/resources/content
フォルダに言語プロパティファイルを作成します。 ファイル名Language.properties
を使用して、デフォルトのロケールの言語ファイルをオーバーライドします。 特定のロケールの言語ファイルをオーバーライドするには、言語プロパティのファイル命名規則を使用します。
Language[_xx_XX].properties
たとえば、日本語を上書きする場合は、Language_ja.properties
を使用します。
Bndファイルでオーバーライドを宣言する
モジュールのbnd.bnd
ファイルで、言語リソースプロバイダーの機能を指定します。 サンプルのProvide-Capability
ヘッダーは次のとおりです。
Provide-Capability:\
liferay.language.resources;\
resource.bundle.base.name="content.Language"
この例では、サービスのランキングを省略しており、OSGiのデフォルトのランキング 0
を使用しています。これは、デフォルトのグローバルリソースバンドルサービスのランキング-1
よりも高くなっています。
標準言語ファイルのオーバーライドは、同じモジュール内にあるほうが管理が簡単です。
複数のモジュールを使用して標準言語ファイルをオーバーライドすることはお勧めしませんが、複数のモジュールで同じ言語ファイルをオーバーライドすると、サービスランキングが最も高い言語リソースプロバイダーが優先されます。
たとえば、モジュールの言語ファイルがサービスランキング1
のプロバイダーの言語ファイルよりも優先されるようにする場合は、ランキングを2
以上に設定します。
Provide-Capability:\
liferay.language.resources;\
resource.bundle.base.name="content.Language";\
service.ranking:Long="2"
モジュールをデプロイして、新しい言語ファイル値を確認します。
以前のバージョンでのオーバーライド
7.4より前のLiferay DXP/Portalバージョンでは、標準言語ファイルをオーバーライドするには、カスタマイズする翻訳ごとに 言語プロパティファイル とjava.util.ResourceBundle
が必要です。 次の例をデプロイしてそのコードを調べることにより、詳細を確認してください。
言語ファイルの多くは標準言語ファイルにありますが、特定のアプリケーションモジュールにある場合もあります。 overriding module language translation in earlier versionsのプロセスは、標準ファイルをオーバーライドするプロセスとは異なります。
以前のバージョンの例をデプロイする
この例では、publish
言語ファイル設定を次のように変更します。
publish=X8F3 Publish
サンプルをデプロイする方法は次のとおりです。
liferay-x8f3.zip
サンプルプロジェクトをダウンロードし、解凍します。curl https://resources.learn.liferay.com/dxp/latest/ja/liferay-internals/extending-liferay/liferay-x8f3.zip -O
unzip liferay-x8f3.zip
プロジェクトモジュールをビルドしてデプロイします。
cd liferay-x8f3
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.x8f3.impl_1.0.0 [3209]
ブラウザで
https://localhost:8080
を開き、サインインしてください。サイトページに移動し、編集アイコンをクリックします(
)。 公開ボタンに、カスタム言語ファイルが表示されます。
言語セレクターを使用してブラジルのポルトガル語または日本語を選択すると、カスタム言語ファイルが表示されます。 モジュールは、モジュールに含める各ロケールの言語ファイルをオーバーライドします。
7.4以降の例と同様に、このモジュールは言語ファイルの変更値を指定します。 ただし、メタデータ(bnd.bnd
ファイルヘッダー)を使用してオーバーライドを宣言する代わりに、モジュールはResourceBundle
クラスを使用します。
リソースバンドルクラスを作成する
オーバーライドする各ロケールには、java.util.ResourceBundle
を拡張するクラスが必要です。 en_US
ロケールのリソースバンドルクラスの例を次に示します。
@Component(property = "language.id=en_US", service = ResourceBundle.class)
public class X8F3EnglishResourceBundle 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);
モジュールをデプロイして、新しい言語ファイル値を確認します。
DXP 7.4以降にアップグレードする準備ができたら、言語ファイルオーバーライドモジュールを引き続き使用できます。 オプションとして、 above で示すように、ResourceBundle
クラスを削除し、Provide-Capability
ヘッダーを bnd.bnd
ファイルで指定することで、モジュールを簡素化することができます。