2026年6月24日水曜日

Oracle APEX Developer's Companionを読む

Oracle APEX 26.1のリリースに合わせて、新しい公式ドキュメントが追加されました。

Developer's Companion, Release 26.1
著者であるOracle CorporationのSenior ArchitectであるSteve Meunchさんによる、紹介記事が公式ブログで公開されています。

APEX Developer’s Companion

Developer's Companionは公式ドキュメントですが、テクニカル・ライターではなく製品をよく知っている技術者によって書かれています。

内容は包括的で、Oracle APEXのほとんどの機能を網羅しています。また、説明も実践的です。事実上、Oracle APEXでアプリケーションを開発するにあたって、最初に参照すべきドキュメントになっています。

とはいえ、全25章、総ページ数で1000を超えています。さらに英語です。それほど遠くない将来にオラクルから日本語の翻訳が出るとは思いますが、それまでどうしようかということで、生成AIに翻訳してもらうことにしました。

Claude Cowork、Sonnet 4.6で翻訳してみました。同様にOpenAI Codex、Google Antigravityでも翻訳を試してみましたが、Claude Sonnet 4.6が一番読みやすい翻訳だったので、Claudeを使うことにしています。翻訳結果はプロンプトにも依存するので、Codex(GPT-5.5)、Google(Gemini 3.5 Flash)の性能が劣っているとも言えないかとは思います。

翻訳なのでOpusまでは不要という判断で、Sonnet 4.6を選択しています。概ね、Sonnetで問題なく翻訳できました。

翻訳したドキュメントを配布するのは著作権の問題があるので、Claude Coworkでの翻訳手順を紹介します。

Developer's CompanionのPDF版をダウンロードし、それを翻訳します。Developer's Companionのサイトを開き、PDFをダウンロードします。



ファイルoracle-apex-developers-companion.pdfがダウンロードされます。

このファイルをそのまま渡して日本語への翻訳を依頼したところ、180MB強のサイズで一気に翻訳できないといわれました。そのため、章ごとに分割して翻訳することにしました。

Coworkで最初に以下のプロンプトを与えています。

「添付のPDF資料を章別に分割し、それぞれを日本語に翻訳してください。出力するファイルはchapter-1.pdf、chaprter-2.pdfのように章別のファイル名にしてください。」


第1章の翻訳結果を確認すると、スクリーンショットが除外されていました。作業を停止して、以下のプロンプトを与え、翻訳結果にスクリーンショットを含めるように指示しました。

「翻訳はしなくてよいので、スクリーンショットの画像ははPDFにそのまま含めてください。」


指示が誤解されて、文章の翻訳までされていなかったので、以下の指示を与えて翻訳を再実行してもらいました。

「文章は日本語に翻訳し、画像は翻訳しないで含めてください。」


翻訳結果の単語の選び方が今ひとつに感じたため、手元にAPEX 26.1のインスタンがあったので、以下のスクリプトを実行して対訳表をtranslated_text.csvとして出力しました。

ユーザーSYSでデータベースに接続して実行しています。
alter session set current_schema = apex_260100;
set sqlformat csv
spool translated_text.csv
select en.message_text as "English", ja.message_text as "Japanese" from
(
   select name, message_text from wwv_flow_messages$ where message_language = 'en'
) en join (
   select name, message_text from wwv_flow_messages$ where message_language = 'ja'
      and length(message_text) < 30
) ja on en.name = ja.name;
spool off;
exit;
以下のプロンプトを与え、対訳表を認識させています。

「英語から日本語へ変換する際に、translated_text.csvの対訳表を参照してください。」


翻訳結果を確認すると、要約されていました。理由を聞いてみました。

「翻訳結果が英語の本文よりもずいぶんと要約されているのはなぜ?」

以下の回答が返されました。


最も品質が高い翻訳を依頼しました。

「章を指定して1章ずつ精訳する(最も品質が高い)を期待しています。」

あとは、Claudeが粛々と翻訳してくれました。chapter-1-ja.pdfからchapter-25-ja.pdfまでの25のファイルがプロジェクトにアタッチしたフォルダに作成されました。ClaudeのProプランだと、途中でセッション・リミットに引っかかりましたが、リセットされた後に継続できています。

翻訳結果の第1章の最初のページです。


せっかく翻訳したので、それぞれの章について所感をまとめます。AIは使用していません。

第1章:はじめに

概ね一般的なOracle APEXの紹介です。APEX 26.1を対象としているため、1.6としてAPEXlangの紹介が含まれています。

第2章:ローカル・データの操作

いわゆるリレーショナル・データベースの機能の紹介です。表を定義したり、操作したりするために使用できるユーティリティなども紹介しています。

第3章:ユーザー・エクスペリエンス・デザインの簡素化

ページ・デザイナを使ってページを作る方法などの説明で、いわゆるAPEXを使ったアプリケーション作成の中心的な作業について説明されています。

第4章:ページでのデータ値の参照

ページ・アイテムやアプリケーション・アイテムといった、値を保持するコンポーネントから、値を取り出して操作する方法を紹介しています。置換文字列、バインド変数、テンプレート・ディレクティブ、SQLおよびPL/SQLでのセッション・ステートの扱いなど。

第5章:データの視覚化と分析

データの表示に使う組み込みのリージョンの紹介です。各種レポート(クラシック・レポート、対話モード・レポート)、カード、チャート、マップ、カレンダー、ツリー、動的コンテンツなど。

第6章:エンド・ユーザーの検索機能の強化

ファセット検索、スマート・フィルタなどの組み込みの検索機能の紹介です。

第7章:プライグインによる機能の追加

プラグインですが主にテンプレート・コンポーネントの作成方法と、出来合いのプラグインの活用方法について紹介しています。テンプレート・コンポーネントを除いた、一般的なプラグインの作り方は触れていません。

第8章:ページ・フローとセッション状態の理解

ページの遷移とセッション・ステートという、APEXアプリケーションの基本部分の紹介です。

第9章:グリッドでのデータの編集

対話グリッドの紹介です。

第10章:マスター/詳細データの操作

Oracle APEXでできる、マスター・ディテール関係の扱い方を紹介しています。マスター・ディテールを扱うページには、積上げ、左右、ドリルダウンがあります。

第11章:ユーザーとロールによるアクセス制御

Oracle APEXに標準で組み込まれている、ロールによるアクセス制御について紹介しています。仮想プライベート・データベースやOracle IAMによるソーシャル・サインインも紹介されています。

第12章:人工知能の適用

生成AIサービスの構成や、AIエージェントの開発について紹介しています。ベクトル検索も含まれます。

第13章:リモート・データの統合

主にORDSを呼び出して、リモート・データを操作する方法について紹介しています。REST有効SQL、RESTデータ・ソースおよび認証も含みます。パッケージAPEX_EXECの使い方も含みます。

第14章:統合のためのAPIの公開

APEXというよりは、Oracle REST Data ServicesでのREST APIの作り方の紹介です。

第15章:住所のジオコーディング

Oracle eLocationサービスを使用したジオコーディングの紹介です。Oracle eLocationサービスは日本をサポートしていないため、その部分は参考になりませんが、CSSやJavaScriptの書き方については参考になります。

第16章:ファイルのアップロード、表示、ダウンロード

画像を含むBLOB列へのファイルのアップロード、画像の表示、PDFのプレビュー、ZIPファイルのダウンロードなどを紹介しています。ファイルの保存先としてOCIのオブジェクト・ストレージにバケットを使用する方法や、事前承認済みリクエストについての説明があります。

第17章:外部データのロード

Excel、XML、JSON、CSVなどのフォーマットの外部ファイルをデータベースにロードする方法の紹介です。データ・ロード定義を作り、宣言的にロードする方法とパッケージAPEX_DAT_LOADINGやAPEX_DATA_PARSERを使う手続的な方法など。

第18章:ロジックのグループ化とバックグラウンド実行

プロセスの実行チェーンとバックグラウンド実行についての紹介です。

第19章:繰り返し処理の実行

共有コンポーネントの自動化(Automation)についての紹介です。

第20章:エンドユーザーへの通知

成功メッセージとエラー・メッセージの表示、メールの送信、プッシュ通知についての紹介です。

第21章:ピクセス・パーフェクト・レポートの生成

OCIのOracle Document Generatorを呼び出してレポートを出力する手順の紹介です。

第22章:アプリケーションの翻訳

APEXアプリケーションの翻訳方法の紹介です。APEX 26.1のテキスト・メッセージベース翻訳に依っています。

第23章:アプリケーション・ライフサイクルの理解

APEXアプリケーションの開発、テスト、リリースのサイクルを回す方法を紹介しています。アプリケーションのインポートとエクスポート、作業コピーなど。次章のAPEXlangと関連します。

第24章:APEXlangの使用

APEXlang形式のエクスポートやインポート、およびAPEXlangの構文を紹介しています。編集方法も含みます。

第25章:ビジネス・プロセスの自動化

分量が多いですが、全編APEXワークフローの紹介です。

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のアプリケーション作成の参考になれば幸いです。

2026年6月22日月曜日

APEXlang形式のエクスポート・ファイルに含まれる日本語について

Oracle APEX 26.1ではエクスポート・フォーマットとしてAPEXlangが採用されています。それまでもYAML形式などでエクスポートはできましたがインポートはできなかったため、出力されたファイルを積極的に読んだり、Gitで管理する(Gitに置くだけではなく、差分やマージを行う)ことは行われていなかったと思います。

APEXlang形式のファイルを扱っていて、ファイルに含まれる日本語について気になった点を記述します。APEXlangでのエクスポートやアプリケーションの翻訳を行わない場合は、あまり意識する必要はないでしょう。

APEXlangについては、以下のAPI Referenceを参照します。


アプリケーションの名前と別名



アプリケーション・ビルダーを使ってAPEXアプリケーションを作成する際に、アプリケーションの名前を日本語にします。通常、意識せずにアプリケーションの名前は日本語にしていると思います。


作成されたアプリケーションの名前アプリケーション別名に、作成時に指定したアプリケーションの名前が使用されます。(この他にもユーザー・インターフェースのロゴ、ホーム・ページのブレッドクラムの名前、ログイン・ページのリージョンの名前などにも反映されます)。


この部分のAPEXlangでの出力は以下でした。
app 世界食堂 (
    name: 世界食堂
    logo {
        type: text
        text: 世界食堂
    }
日本語のアプリケーション別名appに続く識別子になっています。アプリケーションの名前も本来、翻訳の対象とはならないため、日本語では無い方が望ましいと思います。

SQLclでapex exportを実行すると、アプリケーション別名が出力フォルダ名になるため、アプリケーション別名が日本語だと、日本語のフォルダが作成されます。フォルダ名が日本語だと、Gitで管理する上でも望ましく無いでしょう。

SQL> apex export -api 105 -exptype apexlang

ワークスペースAPEXDEVをエクスポートしています - アプリケーション105:世界食堂

ファイル世界食堂/application.apxが作成されました


SQL> !ls

世界食堂


SQL> 


APEX 26.1以前でも、簡易URL(friendly URLs)が有効な場合、URLにアプリケーション別名が現れます。そのため、日本語のアプリケーション別名は(アクセスできないわけでは無いが)、避けるべきでした。


上記より、APEXアプリケーションを作成したら、すぐにアプリケーション別名は英数字(およびURLに含めることが許される一部の記号)による識別子として設定すべきです。


アプリケーション別名を変更すると、エクスポートされるフォルダ名およびURLに含まれる文字列は、英数字の識別名に変わります。

SQL> apex export -api 105 -exptype apexlang

ワークスペースAPEXDEVをエクスポートしています - アプリケーション105:世界食堂

ファイルworld-diner/application.apxが作成されました


SQL> !ls

world-diner

世界食堂


SQL> 


ビューAPEX_APPLICATIONSの列ALIASおよびAPEXlangの出力では、アプリケーション別名は英大文字ですが、フォルダ名やURLとなる文字列は英子文字になります。

SQL> select application_name, alias from apex_applications;


APPLICATION_NAME    ALIAS          

___________________ ______________ 

世界食堂                WORLD-DINER    


SQL>


APEXlangのリファレンスのappの項目を見ると、appに続く名前とは別にaliasが必須プロパティとなっていますが、APEX 26.1での出力はそのようになっていません。

アプリケーション別名の変更はプロパティの変更ではなく、識別子の変更にあたります。識別子の変更は、Gitなどでアプリケーションを管理している場合は影響が大きいです。アプリケーションの名前はアプリケーションのプロパティのひとつという扱いで、翻訳の対象ではありません。


ページの名前と別名



新規にページを作成する際に、ページ定義名前は日本語にすると思います。以下ではページの名前ダッシュボードとしています。


作成されたページでは、名前ダッシュボード別名ダッシュボードタイトルダッシュボードになります。


APEXlang形式でエクスポートすると、ファイル名にp00002-ダッシュボード.apxのように日本語が含まれ、プロパティnamealiastitleが日本語になります。
page 2 (
    name: ダッシュボード
    alias: ダッシュボード
    title: ダッシュボード
    appearance {
        pageTemplate: @/standard
        templateOptions: #DEFAULT#
    }
名前Dashboard別名DASHに変更します(別名DASHBOARDにするとファイル名にどちらが採用されている分からないので、あえて名前と別名を変えています)。タイトルはページに表示される文字列で、アプリケーションの翻訳を行わない限り変更する必要はありません。


APEXlang形式の出力ファイルの名前はページの別名が使用され、p00002-dash.apxでした。ページの内容は以下のように変更されています。
page 2 (
    name: Dashboard
    alias: DASH
    title: ダッシュボード
    appearance {
        pageTemplate: @/standard
        templateOptions: #DEFAULT#
    }
ビューAPEX_APPLICATION_PAGESの列PAGE_ALIASを確認すると、別名は英大文字で保存されていますが、ファイル名およびURLに現れる文字列ともに英子文字になります。


ページの識別子はページ番号なので(API Referenceのpage参照)、ページ番号が変わらなければ同じページですが、ページの別名が変わると出力ファイルが変わります。結果として差分やマージが困難になります。ページの名前はページのプロパティのひとつですが、これも翻訳対象ではありません。


リージョンの名前と静的ID



リージョンの名前タイトルは、ページ・デザイナではリージョンを作成した後にそれぞれ設定します。タイトルを設定していないとリージョンの名前がページに表示されるため、以前からのAPEX開発者であれば、リージョンにタイトルを設定せず名前をそのまま使用している場合も多いでしょう。


APEX 26.1ではAPEXlangのサポートの関係で、それまでの詳細静的IDHTML DOM IDという名称に変更し、新たに静的IDをプロパティとして加えています。

静的IDはリージョンの新規作成時に設定した名前から決まります。上記の例であれば、リージョンの名前MENUとしているため、静的IDmenuとなっています。

一度設定されたリージョンの静的IDはロック(変更禁止)され、リージョンの名前を変更しても静的IDは変更されません。


静的IDを変更するには、最初にロックを解除する必要があります。


APEXlang形式の出力を意識せず、APEX 26.1以前と同じようにリージョンの名前に日本語(ここではメニュー)を使用し、タイトルを空白としてリージョンを作成したとします。


この場合、静的IDは日本語のメニューになります(リージョンの新規作成後、編集するページを切り替えるまでは静的IDはロックされません)。


APEXlangでの出力は以下になります。静的IDがリージョンの識別子であるため、日本語が識別子に採用されます。
    region メニュー (
        name: メニュー
        type: classicReport
        source {
            location: localDatabase
            tableName: WR_MENUS_VL
        }
リージョンの識別子を後から変更すると、別のリージョンという扱いになります。そのため、リージョンの新規作成時には、設定される静的IDに注意する必要があります。


ウィザードが割り当てるデフォルトの識別子について



アプリケーション・ビルダーを日本語で使用していると、アプリケーション作成ウィザードページ作成ウィザードいった、APEXのウィザードが生成するページやコンポーネントの識別子が日本語になっているものがあります。

例えば認証スキームOracle APEXアカウントは、名前が識別子となるためAPEXlangにそのまま出力されます。


APEXlangでの出力は以下になります。authenticationの識別子に日本語が含まれます。
authentication oracle-apexアカウント (
    name: Oracle APEXアカウント
    type: oracleApexAccounts
)
リストの出力例です。
list ナビゲーション-バー (
    name: ナビゲーション・バー

    entry app-user (
        label: &APP_USER.
        icon {
            imageIconCssClasses: fa-user
        }
        layout {
            sequence: 10
        }
        link {
            target: {
                type: url
                url: #
            }
        }
        userDefinedAttributes {
            2: has-username
        }
    )

    entry list_item (
        label: ---
        layout {
            sequence: 20
            parentEntry: @app-user
        }
        link {
            target: {
                type: url
                url: separator
            }
        }
        serverSideCondition {
            type: userIsAuthenticated
        }
    )

    entry サインアウト (
        label: &{サインアウト}.
        icon {
            imageIconCssClasses: fa-sign-out
        }
        layout {
            sequence: 30
            parentEntry: @app-user
        }
        link {
            target: {
                type: url
                url: &LOGOUT_URL.
            }
        }
        serverSideCondition {
            type: userIsAuthenticated
        }
    )

)

list ナビゲーション-メニュー (
    name: ナビゲーション・メニュー

    entry ホーム (
        label: &{ホーム}.
        icon {
            imageIconCssClasses: fa-home
        }
        layout {
            sequence: 10
        }
        link {
            target: {
                page: 1
            }
        }
    )

)
アプリケーション作成ウィザード機能や、ページ作成ウィザード機能で追加したページも、ページ名やページに含まれるリージョンの静的IDは日本語になります。


ページの名前別名タイトルともに日本語になります。


リージョンの名前静的IDも日本語になります。


APEXlang形式のファイルをGitで管理したりテキスト・メッセージベースの翻訳を検討する場合は、これらの標準コンポーネントについても対応を検討する必要があるでしょう。

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