2023年1月12日木曜日

XLIFFファイル翻訳支援アプリの作成(5) - アプリケーションの翻訳

 APEXアプリケーションの翻訳を支援するアプリケーションを作成したので、実際にアプリケーションの翻訳作業を実施してみます。

一言でAPEXアプリケーションの翻訳といってもいっても考慮すべきことは沢山あります。今回はアプリケーション作成ウィザードが生成するラベルを、APEXがあらかじめ翻訳しているテキストを使って翻訳することにより、基本的な作業の流れを確認します。

Oracle APEXに含まれている翻訳済みテキストが、表CWR_MESSAGESに保存済みであることを前提とします。

最初に作成したアプリケーションXLIFF Translateのコピーを作成します。

タスクよりこのアプリケーションのコピーを実行します。


新規アプリケーション名Global XLIFF Translateに変更します。

へ進みます。


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


アプリケーションのコピーが作成されます。このコピーしたアプリケーションに含まれるラベルを英語から日本語に翻訳します。

現在は、ラベルは英語ですがアプリケーションのプライマリ言語は日本語になっています。アプリケーション定義を開きます。


グローバリゼーションアプリケーションのプライマリ言語日本語(ja)から英語(en)に変更します。また、アプリケーション言語の導出元セッションに変更します。

変更の適用をクリックします。


共有コンポーネントグローバリゼーションアプリケーション翻訳を開きます。


翻訳方法を上から順番に実行してきます。テキストの翻訳の作業に本記事で作成したXLIFFファイル翻訳支援アプリケーションを使います。


アプリケーション言語の定義を実行します。

アプリケーション言語マッピングを作成します。作成をクリックします。


アプリケーションの翻訳はAPEXの内部では異なるアプリケーションとして作成されます。そのため、翻訳アプリケーションとして未使用のアプリケーションIDを指定します。

言語日本語(ja)を選択します。今回はプライマリ言語アプリケーションの言語を英語(en)にしていますが、アプリケーションを日本語で作成し、そのアプリケーションに対して英語のアプリケーション言語マッピングを作成することもできます。必ずしも、英語から他言語に翻訳する必要はありません。


日本語のアプリケーション言語マッピングが作成されました。


続いて、翻訳可能なテキストのシードを実行します。

作成したアプリケーション言語マッピング(今回は日本語(ja))にチェックを入れシードを実行します。プライマリのアプリケーションに含まれる翻訳可能なテキストが、日本語を保持するアプリケーションにコピーされます。


翻訳可能なテキストが正常にシードされました。とメッセージが表示されることを確認します。


XLIFF翻訳ファイルのダウンロードを実行します。

今回はアプリケーション全体を翻訳するため、完全なアプリケーション用のXLIFFファイルのダウンロードを実行します。

言語として日本語(ja)を選択します。XLIFF翻訳支援アプリケーションはXLIFFファイルにtarget要素が含まれていることを想定しているため、XLIFFターゲット要素を含めるチェックを入れますエクスポートとしてすべての翻訳可能な要素を選択します。

以上を設定し、アプリケーションのXLIFFファイルのエクスポートを実行します。


XLIFFファイル翻訳支援アプリケーション(コピー前のアプリケーション)を実行し、エクスポートされたXLIFFファイルを翻訳します。

アプリケーションを実行し、エクスポートされたXLIFFファイルをアプリに取り込みます。その後、翻訳作業を行うページを開きます。


Load From SourceBatch TranslateStore As Resultの順でボタンをクリックします。


XLIFF Filesのページに戻り、Xliff Resultダウンロードします。APEXに含まれている翻訳済みのテキストに使って翻訳されたXLIFFファイルがダウンロードされます。


アプリケーション・ビルダーに戻り、XLIFF翻訳ファイルの適用を実行します。

ファイルのアップロードをクリックし、XLIFF翻訳支援アプリよりダウンロードしたファイルをアップロードします。


翻訳済みのXLIFFファイルを選択し、アップロードを実行します。


アップロードされたファイルにチェックを入れ、翻訳に適用として作成したアプリケーション言語マッピング(この場合、日本語(ja)へのマッピング)を選択します。

チェックした項目の適用をクリックし、XLIFFファイルの内容を翻訳アプリケーションに適用します。


ファイルは適用されました。と表示されます。


最後に翻訳済アプリケーションのパブリッシュを実行します。

最新の翻訳を反映した言語にチェックを入れ(今回は日本語(ja))、パブリッシュをクリックします。


アプリケーションが正常にパブリッシュされました。と表示されると、アプリケーションの翻訳作業は完了です。


アプリケーションに変更を加えた場合は、これまでに実行したシードからパブリッシュまでの一連の作業を繰り返します。

翻訳したアプリケーションを実行し、結果を確認します。

アプリケーションを実行すると、サインインの画面が開きます。この画面は英語です。

今の所、アプリケーションの言語を変更する方法が実装されていません。そのため、セッション・オーバーライドを使って言語を変更します。開発者ツール・バーのSessionからSession Overridesを呼び出します。


Session Overridesアプリケーション言語ONにし、日本語(ja)を選択します。

Saveをクリックします。


サインイン画面はアプリケーション作成ウィザードによって生成されるので、そのラベルもほとんどは標準のテキストです。そのため、概ね画面上のテキストは日本語に置き換えられています。


MessagesNameCreateといったラベルはそれぞれメッセージ名前作成に置き換えられています。


アプリケーション作成ウィザードによって作成されたボタンについても、ラベルは取消削除変更の適用に置き換えられています。


最後にログイン画面に言語セレクタを追加します。

ページ・デザイナにてページ番号9999のページLogin Pageを開きます。

リージョンXLIFF Translateのサブ・リージョンとしてリージョンを作成します。

識別名前Language SelectorタイプPL/SQL動的コンテンツ[レガシー]を選択します。レガシーのタイプはデフォルトでは選択リストに現れないため、レガシーを表示...を最初に選択します。

ソースPL/SQLコードとして以下を記述します。

APEX_LANG.EMIT_LANGUAGE_SELECTOR_LIST;

外観テンプレートとしてBlank with Attributesを選択します。


以上の変更を実施しアプリケーションを再度実行すると、ログイン画面に言語セレクタが現れます。


しかし、日本語をクリックして表示されるログイン画面には言語セレクタがありません。


アプリケーションの変更を翻訳されたアプリケーションに反映させるには、シードからパブリッシュまでの作業を繰り返します。

今回は言語セレクタの追加だけなので、シードとパブリッシュだけを実行することで日本語のログイン画面に言語セレクタが反映されます。


今の所、言語セレクタを生成するプロシージャAPEX_LANG.EMIT_LANGUAGE_SELECTOR_LISTは、レガシーのPL/SQL動的コンテンツでしか使用できません。新しく提供されたリージョン・タイプである動的コンテンツに対応したAPIの提供が望まれます。

動的コンテンツを使用するのであれば、以下のようなコードがワークアラウンドになるでしょう。

declare
l_this_url varchar2(400);
l_current_lang varchar2(8);
l_lang varchar2(16);
l_body clob;
type languages_aat is table of varchar2(80) index by varchar2(8);
l_languages languages_aat;
begin
/* 英語と日本語 */
l_languages('en') := 'English';
l_languages('ja') := '日本語';
/* 現在の言語を取得する。 */
l_current_lang := apex_util.get_session_lang;
/* 現在開いているページ、つまりログイン・ページのURLを取得する。 */
l_this_url := apex_page.get_url(
p_application => :APP_ID
,p_page => :APP_PAGE_ID
);
l_body := '<ul class="a-LinksList a-LinksList--lang">';
l_lang := l_languages.first;
while(l_lang is not null)
loop
l_body := l_body || '<li class="a-LinksList-item';
if l_current_lang = l_lang then
/* 現在アクティブな言語 */
l_body := l_body || ' is-active';
end if;
l_body := l_body || '"><a href="' || l_this_url || '&amp;p_lang=' || l_lang || '" class="a-LinksList-link">' || l_languages(l_lang) || '</a></li>';
l_lang := l_languages.next(l_lang);
end loop;
l_body := l_body || '</ul>';
return l_body;
end;

Oracle APEXのアプリケーションを翻訳する方法の簡単な紹介は以上になります。

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