2024年9月12日木曜日

Oracle APEXがサポートしているランタイム・メッセージの翻訳を確認する

Oracle APEX 24.1ではウクライナ語とベトナム語が、ランタイム・メッセージの翻訳に追加されました。今までサポートしていた言語と合わせると34言語の翻訳を提供しています。

提供されているランタイム・メッセージの翻訳は以下です。


Oracle APEXの管理ツールやアプリケーション・ビルダーは、10言語(ドイツ語、英語、スペイン語、フランス語、イタリア語、ポルトガル語(ブラジル)簡体中国語、繁体中国語、日本語、韓国語)に翻訳されています。

ランタイム・メッセージというのは主にOracle APEXの組み込みコンポーネントが扱うメッセージになります。具体的には対話モード・レポートや対話グリッドです。

サポートされている34言語はどのような言語なのか、自動的に切り替えるアプリケーションを作成してみました。

以下のように動作します。ボタンStart LoopをクリックするとIntervalで指定した秒ごとにランタイム・メッセージの言語を切り替えていきます。

開発ツールも翻訳されている言語では、Welcomeの表示がそれぞれの言語に翻訳されます。また、アラビア語とヘブライ語については、表示をRTL(Right-to-Left)に切り替えています。


このAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/oracle-apex-support-languages.zip

対話モード・レポートのソースとして、サンプル・データセットEMP/DEPTに含まれる表EMPが必要です。

作り方はあまり参考にならないアプリケーションですが、いくつかの実装のポイントを紹介します。すべての機能をホーム・ページに実装しています。


ボタンSTART_LOOPを押すとJavaScriptのファンクションstartLoop()を呼び出します。STOP_LOOPではstopLoop()を呼び出します。翻訳を選択するページ・アイテムP1_LANGは値が変更されると、動的アクションでページの送信を実行します。

ページ・アイテムP1_LANGは以前の値を保存させるため、セッション・ステートストレージセッションごと(永続)にします。

ページ・アイテムP1_LANGが変更され、ページの送信が実行されたときに呼び出されるプロセスでは、以下のコードが実行されます。
begin
    apex_util.set_preference(
        p_preference => 'FSP_LANGUAGE_PREFERENCE'
        ,p_value => :P1_LANG
    );
    /*
     * autoChangeでの呼び出しであれば、P1_AUTO_ENABLEDをYとする。
     * 手動切り替えのときはP1_AUTO_SUBMITは空になるため、自動切り替えは
     * 継続しない。
     */
    if :P1_AUTO_SUBMIT = 'Y' then
        :P1_AUTO_ENABLED := 'Y';
    else
        :P1_AUTO_ENABLED := '';
    end if;
end;
プリファレンスFSP_LANGUAGE_PREFERENCEに言語コードを設定することにより、ランタイム・メッセージの翻訳を切り替えています。


アプリケーション定義グローバリゼーションアプリケーション言語の導出元として、アプリケーション・プリファレンス(FSP_LANGUAGE_PREFERENCEを使用)を選択しています。


ページ・プロパティJavaScriptファンクションおよびグローバル変数の宣言に、以下を記述しています。

/* Oracle APEX 24.1 でサポートされているランタイム言語 */
const SUPPORTED_LANGUAGES = "ar,pt-br,hr,cs,da,nl,fi,fr,fr-ca,de,el,he,hu,is,it,ja,ko,no,pl,pt,ro,ru,sr-cyrl,sr-latn,zh-cn,sk,sl,es,sv,th,zh-tw,tr,uk,vi".split(',');
var taskId;
/*
* ページ・アイテムP1_LANGに切り替える言語を設定する。P1_LANGには、値の変更でページを送信する
* 動的アクションが設定されている。結果として切り替えた言語でAPEX_UTIL.SET_PREFENCEが呼び出され、
* FSP_LANGUAGE_PREFERENCEが変更される。
*
* P1_AUTO_SUBMITにYが設定されていると、言語の自動切り替えを継続する。
*/
function autoChange() {
let currentIndex = SUPPORTED_LANGUAGES.findIndex(lang => lang === apex.item("P1_LANG").getValue());
let nextIndex = currentIndex === (SUPPORTED_LANGUAGES.length - 1) ? 0 : currentIndex + 1;
apex.item("P1_LANG").setValue(SUPPORTED_LANGUAGES[nextIndex]);
apex.item("P1_AUTO_SUBMIT").setValue("Y");
}
/*
* 言語の自動切り替えを開始する。
* ボタンSTART_LOOPのクリック時に呼び出される。
*/
function startLoop() {
if ( !taskId ) {
let interval = apex.item("P1_INTERVAL").getValue() * 1000;
taskId = setInterval(autoChange, interval);
document.getElementById("START_LOOP").disabled = true;
document.getElementById("STOP_LOOP").disabled = false;
console.log('Start Language selection changed task ', taskId);
}
}
/*
* 言語の自動切り替えを停止する。
* ボタンSTOP_LOOPのクリック時に呼び出される。
*/
function stopLoop() {
if (taskId) {
clearInterval(taskId);
document.getElementById("START_LOOP").disabled = false;
document.getElementById("STOP_LOOP").disabled = true;
console.log('Stop Language selection changed task ', taskId);
taskId = null;
}
}

ページ・ロー時に実行に以下を記述しています。自動的に発生したページ・ロードのときは、自動ロードを継続します。
/*
 * 言語の自動切り替えが有効であれば、startLoopを呼び出す。
 */
if ( apex.item("P1_AUTO_ENABLED").getValue() === "Y" ) {
    startLoop();
}
else
{
    document.getElementById("START_LOOP").disabled = false;
    document.getElementById("STOP_LOOP").disabled  = true;    
}

ページ・ロード時に言語がarまたはhe(つまりアラビア語またはヘブライ語)のときは、動的アクションでRight-to-Leftに変更しています。

document.documentElement.setAttribute('dir', 'rtl');


開発言語のリージョンに表示している「ようこそ」の翻訳文は、以下のコードを記述した動的コンテンツとして実装しています。
declare
    l_message clob;
begin
    l_message := apex_lang.message('INSTALLER.WELCOME');
    return l_message;
end;

Oracle APEXの製品としてはメッセージ・キーINSTALLER.WELCOMEで取得できるメッセージの言語は10言語ですが、以下のようにAPEX_LANG.CREATE_MESSAGEを呼び出すか、または共有コンポーネントテキスト・メッセージから、それぞれの言語のメッセージを追加することで、標準では翻訳文が提供されていない言語にも対応できます。

declare
l_app_id number := :APP_ID;
l_name varchar2(80) := 'INSTALLER.WELCOME';
begin
apex_lang.create_message(l_app_id, l_name, 'ar', 'أهلا وسهلا');
apex_lang.create_message(l_app_id, l_name, 'hr', 'Dobrodošli');
apex_lang.create_message(l_app_id, l_name, 'cs', 'Vítejte');
apex_lang.create_message(l_app_id, l_name, 'da', 'Velkommen');
apex_lang.create_message(l_app_id, l_name, 'nl', 'Welkom');
apex_lang.create_message(l_app_id, l_name, 'fi', 'Tervetuloa');
apex_lang.create_message(l_app_id, l_name, 'el', 'Καλώς ήρθατε');
apex_lang.create_message(l_app_id, l_name, 'he', 'ברוך הבא');
apex_lang.create_message(l_app_id, l_name, 'hu', 'Üdvözöljük');
apex_lang.create_message(l_app_id, l_name, 'is', 'Velkomin');
apex_lang.create_message(l_app_id, l_name, 'no', 'Velkommen');
apex_lang.create_message(l_app_id, l_name, 'pl', 'Witamy');
apex_lang.create_message(l_app_id, l_name, 'pt', 'Bem-vinda');
apex_lang.create_message(l_app_id, l_name, 'ro', 'Bine ați venit');
apex_lang.create_message(l_app_id, l_name, 'ru', 'Добро пожаловать');
apex_lang.create_message(l_app_id, l_name, 'sr-cyrl', 'Добродошли');
apex_lang.create_message(l_app_id, l_name, 'sr-latn', 'Dobrodošli');
apex_lang.create_message(l_app_id, l_name, 'sk', 'Vitajte');
apex_lang.create_message(l_app_id, l_name, 'sl', 'Dobrodošli');
apex_lang.create_message(l_app_id, l_name, 'sv', 'Välkommen');
apex_lang.create_message(l_app_id, l_name, 'th', 'ยินดีต้อนรับ');
apex_lang.create_message(l_app_id, l_name, 'tr', 'Hoş geldiniz');
apex_lang.create_message(l_app_id, l_name, 'uk', 'Ласкаво просимо');
apex_lang.create_message(l_app_id, l_name, 'vi', 'Chào mừng');
end;
view raw welcome.sql hosted with ❤ by GitHub

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

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