2026年6月23日火曜日

APEX 26.1のテキスト・メッセージベースの翻訳にXLIFFファイルを使用する

Oracle APEX 26.1ではアプリケーションの翻訳にテキスト・メッセージを使えるようになりました。以前に、OpenAI Codexを使ってAPEXアプリケーションの翻訳を行う方法を紹介しています。この記事のように生成AIに丸投げして翻訳できるのは、APEX 26.1でテキスト・メッセージベースの翻訳が導入されたためです。

記事「APEX 26.1の新しい翻訳モードであるテキスト・メッセージベースでアプリケーションを翻訳する

APEX 26.1のテキスト・メッセージベースの翻訳でもXLIFF(CSVも可)を使った翻訳ができます。今回は、XLIFFを使って翻訳することを前提として、APEXアプリケーションの翻訳を手順を追って実施してみます。

以下の記事を参照しています。

Oracle Corporationの公式ブログ
Oracle APEX 26.1: Simplifying Application Translation with Text Messages

Oracle APEX Developer's Companion
22 Translating Your Application

作業環境として、ローカルのコンテナで実行しているAPEX 26.1を使用します。翻訳対象とするアプリケーションとして、サンプル・データセットのEMP/DEPTをインストールして作成できる、日本語のAPEXアプリケーションを使用します。

ユーティリティサンプル・データセットを開き、EMP/DEPTをインストールします。


日本語のアプリケーションを作成するため、インストールする言語として日本語を選択します。

へ進みます。


データセットをインストールします。


アプリケーションの作成を実行します。


アプリケーション作成ウィザードが開きます。

機能すべてをチェックをクリックし、標準機能をすべて対象外にします。続いて、言語日本語(ja)が選択されていることを確認します。

以上でアプリケーションの作成を実行します。


アプリケーションが作成されました。

このプライマリ言語が日本語のアプリケーションに、英語の翻訳を追加します。

共有コンポーネントを開きます。


グローバリゼーションアプリケーション翻訳を開きます。


まだアプリケーションの翻訳が有効になっていません。翻訳を使用可能にするをクリックします。


アプリケーション定義グローバリゼーションのタブに遷移します。

アプリケーションの翻訳オンにし、翻訳モードとしてテキスト・メッセージベースを選択します。翻訳言語の導出元として、アプリケーション側の実装が不要な、ブラウザ(ブラウザの言語プリファレンスを使用)を選択します。

以上で変更を適用します。


変更を適用した後、共有コンポーネントアプリケーション翻訳に戻ります。

アプリケーション言語として英語を追加します。言語の追加をクリックします。


言語として英語(en)を選択し、言語の追加をクリックします。


プライマリ言語の日本語(ja)と、翻訳を追加する言語として選択した英語(en)が追加されます。

翻訳対象となっているテキスト・メッセージが50個ほどあることが確認できます。


それぞれの言語のアクションよりテキスト・メッセージの同期化を実行する、または、テキスト・メッセージ翻訳テキスト・メッセージに変換を実行することにより、アプリケーションに含まれる翻訳対象の文字列をテキスト・メッセージに置き換えます。


テキスト・メッセージへの変換(または同期化)が行われる前は、以下のようになっています。以下はページのプロパティですが、識別タイトルが翻訳対象である文字列です。


テキスト・メッセージへの変換を実行すると、タイトルがテキスト・メッセージ従業員に置換される置換文字列&{従業員}.に置き換えられます。


置換文字列&{従業員}.従業員に置き換えられるよう、テキスト・メッセージが作成されています。

共有コンポーネントテキスト・メッセージを開いて確認します。


静的ID従業員言語として英語(en)および日本語(ja)テキスト・メッセージが作成されています。英語、日本語の両方とも、置換後のテキスト従業員となっています。


言語が日本語のテキストは翻訳は不要です。言語が英語でも日本語のテキストがシードされています。この日本語のテキストを英語に翻訳すると、APEXアプリケーションの英語への翻訳が完了します。

しかし、アプリケーションに設定されていた日本語から生成されるテキスト・メッセージの静的IDは、静的IDとして適切とは言えません。

例えばエラー・メッセージ「権限が不十分です。ユーザーは管理者ではありません」が静的IDになっています。


これは認可スキームに設定されているエラー・メッセージです。画面に表示されるメッセージはテキスト・メッセージとして登録されているテキストなので、テキスト・メッセージを更新します。その上で、静的IDを維持する必要があります。

結果として、静的IDは画面に表示される文字列に見えるのに、実際に表示される文字列は異なるということになります。


テキスト・メッセージの静的IDが日本語であっても、APEXアプリケーションの翻訳はできます。なので、気にしないというのもひとつの方法です。アプリケーションのプライマリ言語が英語であれば、概ね気にする必要はないでしょう。

以下よりアプリケーションのプライマリ言語が日本語で、静的IDを日本語から英語の識別子に付け替える手順について検討します。

今回、翻訳の対象としているAPEXアプリケーションのホーム・ページは以下です。


ホーム・ページのタイトル&{デモ_従業員_部門}.から&{DEMO_EMP_DEPT}.に変更します。


ブレッドクラム・リージョンは、翻訳を考慮して以下のように変更します。

識別.名前: Breadcrumb
識別.タイトル: &{DEMO_EMP_DEPT}.
ソース.HTMLコード: &{HOME.BREADCRUMB.SOURCE}.
詳細.静的ID: breadcrumb


ページ・ナビゲーションのリージョンは以下のように変更します。

識別.名前: Page Navigation
識別.タイトル: &{PAGENAVIGATION}.
詳細.静的ID: pagenavigation


共有コンポーネントリストページ・ナビゲーションを開きます。


名前&{ダッシュボード}.&{従業員}.、&{部門}.を、&{DASHBOARD}.&{EMPLOYEES}.&{DEPARTEMENT}.に置き換えます。


この状態でホーム・ページを開くと、静的IDに対応したテキスト・メッセージが作成されていないため、置き換えた静的IDがそのまま表示されます。

(実際は静的IDのEMPLOYEESとDEPARTMENTはテキスト・メッセージが作成済みなので、EmployeesとDepartmentに置き換わっています)。


テキスト・メッセージの静的IDは翻訳の機能では置き換えられないため、APEXlang形式でアプリケーションをエクスポートして置き換えます。

APEXlang形式のエクスポート時にフォルダ名が英語になるように、アプリケーション定義アプリケーションの別名demonstration-emp-deptに変更します。

SQLclでエクスポートするため、アプリケーションIDを控えておきます。以下の例では103です。


SQLclでAPEXワークスペースのパーシング・スキーマに接続し、APEXアプリケーションをエクスポートします。

apex export -api 103 -exptype apexlang

SQL> apex export -api 103 -exptype apexlang

ワークスペースAPEXDEVをエクスポートしています - アプリケーション103:デモ - 従業員 / 部門

ファイルdemonstration-emp-dept/application.apxが作成されました


SQL> 


テキスト・メッセージはdemonstration-emp-dept/shared-components/messages.apxとして出力されています。

textMessageに続く以下の識別子を見つけ、英語の識別子に置き換えます。EMPLOYEESDEPARTMENTはすでにテキスト・メッセージが作られているので、そのまま使用します。

デモ_従業員_部門: DEMO_EMP_DEPT
サンプルデータから開発: HOME.BREADCRUMB.SOURCE
ページナビゲーション: PAGENAVIGATION
ダッシュボード: DASHBOARD

テキスト・メッセージEMPLOYEESの日本語は従業員DEPARTMENT部門に置き換えます。今回のアプリケーションのプライマリ言語は日本語で、プライマリ言語についてはXLIFFやCSVでの出力ができません(プライマリ言語は翻訳の対象ではないため)。
textMessage HOME.BREADCRUMB.SOURCE (
    message {
        text: サンプルデータから開発
        language: en
    }
)

textMessage HOME.BREADCRUMB.SOURCE (
    message {
        text: サンプルデータから開発
        language: ja
    }
)

textMessage DASHBOARD (
    message {
        text: ダッシュボード
        language: en
    }
)

textMessage DASHBOARD (
    message {
        text: ダッシュボード
        language: ja
    }
)

textMessage DEMO_EMP_DEPT (
    message {
        text: デモ - 従業員 / 部門
        language: en
    }
)

textMessage DEMO_EMP_DEPT (
    message {
        text: デモ - 従業員 / 部門
        language: ja
    }
)

textMessage PAGENAVIGATION (
    message {
        text: ページ・ナビゲーション
        language: en
    }
)

textMessage PAGENAVIGATION (
    message {
        text: ページ・ナビゲーション
        language: ja
    }
)

textMessage EMPLOYEES (
    message {
        text: 従業員
        language: ja
    }
)

textMessage DEPARTMENT (
    message {
        text: 部門
        language: ja
    }
)
その他のテキスト・メッセージも置き換えることはできますが、英語についてはXLIFFを出力して翻訳します。

messages.apxを変更して保存し、APEXワークスペースにインポートします。

apex import -input demonstration-emp-dept

SQL> apex import -input demonstration-emp-dept

アプリケーションID: 103をワークスペース: APEXDEVにインポートしています

インポートに成功しました。


SQL> 


置き換えられたAPEXアプリケーションのホーム・ページを表示します。

日本語はもともと翻訳不要で、翻訳対象のプロパティに設定した静的IDがテキスト・メッセージに紐づけられれば、日本語のテキストに置き換えられて表示されます。


英語への翻訳に使用するXLIFFファイルを出力します。

共有コンポーネントアプリケーション翻訳を開き、英語のXLIFFファイルをエクスポートします。

英語(en)のアクション・メニューよりXLIFFとしてエクスポートを実行します。


XLIFFファイルとしてf103_ja_en.xlf(アプリケーションIDが103の場合)がダウンロードされます。

最低限、trans-unitのidが以下のメッセージについては、targetを英語に翻訳します。
    <trans-unit id="HOME.BREADCRUMB.SOURCE">
      <source>サンプルデータから開発</source>
      <target>Deeloped from Sample Data</target>
    </trans-unit>
    <trans-unit id="DASHBOARD">
      <source>ダッシュボード</source>
      <target>Dashboard</target>
    </trans-unit>
    <trans-unit id="DEMO_EMP_DEPT">
      <source>デモ - 従業員 / 部門</source>
      <target>Demonstration - EMP / DEPT</target>
    </trans-unit>
    <trans-unit id="PAGENAVIGATION">
      <source>ページ・ナビゲーション</source>
      <target>Page Navigation</target>
    </trans-unit>
targetを翻訳したXLIFFファイルをアップロードします。

テキスト・メッセージのインポートを実行します。


翻訳したファイルを選択し、インポートを実行します。


以上でホーム・ページは英語に翻訳できました。

ブラウザの言語の優先言語を英語にします。(以下はChromeの例です)。


ホーム・ページの表示が以下に変わります。概ね英語の表示切り替わっています。


左上のロゴが日本語のままなので、アプリケーション定義ユーザー・インターフェースロゴテキスト&{DEMO_EMP_DEPT}.に変更します。


再度、ホーム・ページを表示すると、すべて英語で表示されます。


ブラウザの優先言語を日本語に戻すと、ホーム・ページの表示は日本語に変わります。


同様の作業を、すべてのページについて繰り返すと、アプリケーション全体の翻訳が完了します。

Oracle APEXはアプリケーション・ビルダーなどが複数の言語に対応しているため、辞書を持っています。APEXのインストール時にload_trans.sqlを実行してロードした言語については、APEXのスキーマ(APEX 26.1であればAPEX_260100)以下の表WWV_FLOW_MESSAGES$に翻訳されたメッセージが保存されています。

ボタンのラベルなどは、標準のメッセージを流用できます。

ページ4のフォームには、以下のラベルが付いたボタンが配置されています。

取消削除変更の適用作成


フォームに作成されているボタンCANCELラベル&{キャンセル}.となっています。


同様に、ボタンCREATE&{作成}.SAVE&{変更の適用}.DELETE&{削除}.となっています。

これらは、標準でインストールされているメッセージを参照するように、以下のテキスト・メッセージに置き換えることができます。

&{APEXAPP.BUTTON.CANCEL}.
&{APEXAPP.BUTTON.DELETE}.
&{APEXAPP.BUTTON.APPLY}.
&{APEXAPP.BUTTON.CREATE}.

優先言語を英語に切り替えると、ボタンのラベルも英語に変わります。


標準のメッセージを流用すると、テキスト・メッセージを作成する手間は省けますが、APEXの製品の都合で翻訳結果が変わるリスクもあります。また、APEXに含まれているテキスト・メッセージの静的IDについても、リファレンスなどはない(一部は22.6.3 Translating Messages Used Internally by APEXなどで説明されている)ので、面倒でもテキスト・メッセージは自前で用意した方が安全でしょう。

今回の記事は以上になります。

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