2021年5月31日月曜日

翻訳済みの文字列を変更する

 Oracle APEXの標準コンポーネントが表示している文字列は、コンポーネントとしてはキーとなる名前を持っているだけで、実際に表示している文字列はWWV_FLOW_MESSAGES$から取り出されています。XLIFFファイルの翻訳アプリケーションを作成していると、以下のレポートを表示することができます。

例えば、対話グリッドのメッセージの名前は概ねAPEX.IG.から始まります。対話モード・レポートはAPEXIRから始まります。

これらのメッセージを、共有コンポーネントグローバリゼーションに含まれるテキスト・メッセージとして設定すると、アプリケーションに設定した文字列が、システムのデフォルトより優先されます。

実際に置き換えてみて確認してみます。以下の操作は、サンプル・データセットのEMP/DEPTがインストール済みであることを前提としています。しかし、例として使用する表EMPは、異なる表を使っても同様の操作は可能です。

最初にアプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。アプリケーションの名前翻訳の置き換えとします。言語(アプリケーションのプライマリ言語)が日本語(ja)であることを確認します。アプリケーションの作成を実行します。

アプリケーションが作成されたら、ホーム・ページをページ・デザイナで開き、対話グリッドのリージョンの作成を実行します。識別タイトル対話グリットとし、タイプとして対話グリッドを選択します。ソース表名EMP(EMP以外を選択してもかまいません)を選択します。

対話モード・レポートのリージョンも追加します。リージョンの作成を実行し、識別タイトル対話モード・レポートとします。タイプ対話モード・レポートを選択し、ソース表名としてEMPを選択します。

アプリケーションを実行すると、以下の画面が表示されます。今回は、これらのレポートで表示されているアクションという文字列をレポートの操作に変更してみます。

ある程度Oracle APEXの利用経験がある人たちを想定しているのであれば、標準の文字列を変更すると使い方がわからなくなる可能性はあります。逆に本当のエンドユーザーでAPEXを使った経験はなく、今後もAPEXのアプリケーションを意識して使うことはない人たちを対象としているのであれば、翻訳文字列を置き換えるのは効果があるかもしれません。

アプリケーションが想定している利用者を鑑みて判断するのがよいと思います。

対話グリッドに含まれる文字列は、名前が概ねAPEX.IG.から始まります。XIFF翻訳ファイルのアプリを使って、名前を見つけてみます。

フィルタの条件として、以下を指定します。

NameはAPEX.IG.で始まります。

Message Languageはjaと等しい。

Message Textはアクションと等しい。


NameとしてAPEX.IG.ACTIONSが見つかりました。

共有コンポーネントテキスト・メッセージを開きます。作成済みのテキスト・メッセージの一覧よりテキスト・メッセージの作成を実行します。

名前としてAPEX.IG.ACTIONSを指定します。言語には日本語(ja)を選択します。JavaScriptで使用はOFFのまま(ここで設定しても、システムとしてAPEX.IG.ACTIONSに定義されている設定に変更されます)、テキストレポートの操作に変更します。テキスト・メッセージの作成を実行します。

名前APEX.IG.ACTIONSがテキスト・メッセージとして作成されます。

同様にして名前APEXIR_ACTIONSテキストレポートの操作に変更します。

テキスト・メッセージとして作成されます。JavaScriptで使用の属性は、双方OFFを指定していますが、結果として、APEX.IG.ACTIONSはいAPEXIR_ACTIONSいいえになっていることが確認できます。

ホーム・ページをリフレッシュすると、アクションとなっていたメニューがレポートの操作に変わっていることが確認できます。


翻訳済みテキストを取得するPL/SQL APIは、APEX_LANG.MESSAGEです。このファンクションの実行結果も確認してみます。

タイプPL/SQL動的コンテンツのリージョンを作成し、以下のコードをソースPL/SQLコードに記述します。

declare
l_name varchar2(20);
begin
l_name := 'APEX.IG.ACTIONS';
htp.p(l_name || ' = ' || apex_lang.message(l_name));
htp.br;
l_name := 'APEXIR_ACTIONS';
htp.p(l_name || ' = ' || apex_lang.message(l_name));
end;

リージョンの識別タイトルAPIとしました。

ページを実行すると、APIの呼び出しでもアプリケーションに作成したテキストが優先されることが確認できます。

翻訳文字列を扱うJavaScript APIはapex.lang.getMessageです。こちらも確認してみましょう。

先程作成したリージョンAPIにページ・アイテムの作成を行います。識別名前P1_MESSAGEタイプテキスト・フィールドとします。ラベル文字列とします。


動的アクション・ビューを開き、ページのロードで動的アクションの作成を行います。識別名前メッセージの設定とします。タイミングイベントページのロードになります。

Trueアクションとして値の設定を指定します。設定タイプの設定JavaScript Expressionを選択し、以下のJavaScript式を記述します。影響を受ける要素選択タイプアイテムとし、アイテムP1_MESSAGEを指定します。

apex.lang.getMessage("APEX.IG.ACTIONS")


以上で、JavaScript APIを使った確認ができるようになりました。ページを実行します。


引数をAPEX.IG.ACTIONSとしたapex.lang.getMessageの結果が、レポートの操作になっていることが確認できます。APEXIR_ACTIONSはJavaScriptで使用いいえなので、JavaScript APIでは参照できません(対話モード・レポートはJavaScriptでの実装ではないので、JavaScript APIから参照する必要がありません)。

確認に使用したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/translated-message.sql

Oracle APEXのアプリケーション作成の参考になれば幸いです。