複数言語でのディプロイメント

概要

Curl® 言語は複数の自然言語で Web アプリケーション を デプロイ することをサポートするツールを提供しています。Curl 実行環境 (RTE) で完全にテストされサポートされている言語は、米国英語と日本語のみです。左から右に読むほとんどの言語は Curl アプレット によって表示でき、Curl コントロール から入力ができます。アプレットは適切なフォントを要求し、そのフォントはアプレットが実行されている環境で使用可能なものである必要があります。
Curl の複数言語サポートには 2 つのアプローチがあります。主にテキスト情報で構成されるアプリケーション部分では Curl を HTML のようにマークアップ言語として使用します。これらに対してはファイルの各言語バージョンを作成するのが最良のアプローチです。
Curl 言語の長所の 1 つは、これを高度なオブジェクト指向プログラミング言語として使い、インタラクティブ アプリケーションを開発できるという点ですが、この種の使用は翻訳上では別の問題を提起することにもなります。言語ごとにアプリケーション全体の複製を作成するのは効率的ではありません。さらに、アプリケーションで [送信] というラベルのボタンを何度でも使用することがあっても、そのたびに「送信」という単語を翻訳するのは避けたいものです。Curl 言語では、このような翻訳上の問題を解決するためのローカライゼーション メカニズムが提供されています。

ローカライゼーション メカニズム

ロケールの概念は、Curl アプリケーションの複数言語ディプロイメントの中心にあるものです。Locale クラスには、アプリケーションに適した言語リソースを見つけるのに使われる言語および国情報が含まれています。ロケールはまた、日付の書式設定や大きな数値の桁区切り記号の選択など、地域特有の問題をアプレットでどのように処理するかを決定します。Curl RTE はロケール名を使って翻訳辞書を検索します。
ホスト ロケールとはアプリケーションを実行するシステムで設定されているロケールのことです。例えば Windows システムでは、Windows コントロール パネルの [地域のオプション] ツールを使ってマシンのロケールを設定します。get-host-locale プロシージャはホスト ロケールを返します。さらに、各アプリケーションで作業ロケールを設定できます。get-working-locale プロシージャは作業ロケールを返し、set-working-locale プロシージャは作業ロケールを変更します。
既定では、作業ロケールはホスト ロケールに設定されているので、開発者が特に指定しなくてもアプレットは適切なロケールを使用することになります。
Curl アプリケーションに含まれるテキストには、翻訳が必要なものとそのまま使用すべきものがあります。エラー メッセージやボタンのラベルなど、ユーザー インターフェイスの一部であるテキストはエンドユーザーの言語に翻訳する必要があります。コマンド識別子やオプションの値など、内部使用のテキスト文字列は翻訳の必要はありません。アプレット内で翻訳すべきテキスト文字列を識別し、Curl 言語が提供する式のいずれかを使ってこれらをマークアップする必要があります。これらのマークアップ式の詳細は「翻訳すべき文字列のマークアップ」を参照してください。
翻訳が必要な文字列のマークアップが済んだら、extract-messages.xcurl という名前のスクリプトを使ってソース ファイルを処理し、Curl 翻訳システムが理解できる XML マークアップを使って翻訳対象文字列を含むファイルを書き出します。翻訳者はこのメッセージ ファイルを編集し、各メッセージの翻訳を追加します。このファイルの詳細は「書き出したメッセージの翻訳」を参照してください。このメッセージ書き出しスクリプトは Curl 統合開発環境 (IDE) に含まれています。
翻訳ファイルはアプレットと一緒にディプロイしなければなりません。実行時には、アプレットは翻訳ファイルを使って各文字列の適切な翻訳を探し出し、ユーザーに表示します。ロケールごとに XML 形式の翻訳ファイルを提供することによって、複数のロケールをサポートできます。
アプレットの実行時には、翻訳ファイルは翻訳辞書として機能します。翻訳対象としてマークされた文字列が実行時に使われると、RTE は該当するロケールに関連付けられた辞書でその文字列を検索します。翻訳が見つかると、アプリケーションでその翻訳テキストを使います。ロケールの翻訳ファイルが見つからない場合、またはその文字列の翻訳が見つからない場合は、元の文字列が使われます。この方法では、翻訳が見つからない場合のフォールバック アクションを提供しています。さらに、管理の難しい数値形式のメッセージ識別子の使用を避けています。その他の利点には、一意の文字列は辞書に一度しか登録されず、一度翻訳するだけで済むことが挙げられます。

翻訳システムの使用

Curl 言語の翻訳システムを使用するために必要な手順は以下のとおりです。
上記の手順について、以下のセクションで詳細に解説していきます。

翻訳すべき文字列のマークアップ

lmessage マクロはアプリケーション内のテキストの翻訳を提供するものです。この最も簡単な形式は次のとおりです。
{lmessage original-text}
ここで、original-text は元の翻訳されていないテキストです。このテキスト文字列は、lmessage が翻訳を見つけられない場合に返す既定値で、TranslationDictionary 内の翻訳テキストを検索するために使うキーにもなります。Curl 実行環境は、アプレットまたはパッケージのメタデータで指定されている翻訳ファイル内の情報から、TranslationDictionary を生成します。元のテキスト文字列とは異なるキーを指定したり、翻訳者へのコメントを指定するには lmessage に他の引数を追加します。
lmessage マクロは作業ロケールを使用します。既定では、これはホスト ロケールと同じです。必要に応じてアプレットで明示的に作業ロケールを設定できます。「ロケールの指定」を参照してください。lformatlocalize マクロも使用できます。

テキスト メッセージの書き出し

アプリケーション内で翻訳対象のテキスト メッセージをすべてマークアップしたら、Curl スクリプト curl://install/ide/translate/bin/extract-messages.xcurl を実行してスケルトンの翻訳ファイルを生成します。このスクリプトはバッチ ファイルから実行することも、コマンド プロンプトで直接実行することもできます。スクリプトは、インクルード ステートメントに従いアプリケーション内のすべてのファイルを読み取り、すべてのローカライゼーション式を処理して指定ファイルに結果を出力します。
次の表は、メッセージを書き出すコマンド ライン インターフェイスの説明です。
構文 :curl extract-messages.xcurl [--help] | -o filename file1, file2, ..., filen
説明:
オプション/引数説明
--helpextract-messages スクリプトのオンライン ヘルプを表示します。
-o翻訳ファイルを指定します。filename をファイルのパスと名前に置き換えます。
file1, file2, ..., filen処理する Curl ソース ファイルを指定します。任意の数の入力ファイルを指定できます。files をソース ファイルのパスと名前に置き換えます。
たとえば、コマンド スクリプト ウィンドウで次のコマンドを 1 行に入力すると、Curl ソース ファイル source-file.curl でメッセージ書き出しツールが実行され、結果が translation-file.xml に出力されます。
d:\automated-build-temp\build\win32-atom\bin\curl.exe curl://install/ide/translate/bin/extract-messages.xcurl -o translation-file.xml source-file.curl

翻訳ファイルの指定

翻訳ファイルとは、アプリケーションが TranslationDictionary を作成するために必要な情報を含む XML ファイルです。「書き出したメッセージの翻訳」のセクションでは、このファイルの構造について詳細に説明しています。
所与のロケールとパッケージ(もしくはアプレット)に翻訳ファイルの場所を指定する方法は2種類あります。
マニフェスト検索システム の使用
適切なマニフェストにエントリーを追加します。パッケージの既定のマニフェスト (get-default-manifest を参照してください。)とそのデリゲート マニフェストに対しパッケージとロケールが一致する翻訳のエントリの検索が行われます。
この技術は 「マニフェストを使用した翻訳ファイルの位置付け」 に詳細が記述されています。
ファイル検索システムの使用
resource-directory 属性と translations-file 属性を、翻訳を必要とする全てのパッケージとアプレットのpackage 宣言と applet 宣言 の中で指定します。リソース ディレクトリに対して指定されたファイルを含んだ一致するロケールの検索が、そのサブディレクトリまで行われます。
この ファイル検索のアプローチは、マニフェスト検索のアプローチでファイルが検索できなかった場合にのみ使用されます。
この技術は以下に詳細に記述されています。
ファイルシステム内の検索を回避するため、この2つのうちマニフェスト検索の方がより効率的です。これは翻訳ファイルや、他のローカライズされたリソースの実際のロケーションに対してより柔軟性を持たせることができます。その短所は明示的にリソース エントリをマニフェストに追加する必要があるという点です。
ファイル検索システムは、次のような構造を持つファイル パスを使用します。
resource-directory/locale-directory/translation-file
アプリケーション内の各パッケージでは、リソース ディレクトリと翻訳ファイルを指定します。ロケール ディレクトリの名前は、アプレットが使うロケールの rfc1766 で定義されている言語タグになります。ファイル検索は、存在するロケール ディレクトリ名で最も明確に指定されたものを使用します。
例えばアプレットが米国英語を使う場合、言語タグは en-US で、翻訳システムは次の場所 :
resource-directory/en-US/translation-file
で翻訳ファイルを探すか (このロケール ディレクトリが存在する場合)、または
resource-directory/en/translation-file
で (en-US は存在しないが en が存在する場合) 探します。英語の翻訳ファイルが存在しない場合、RTE は default という名前のディレクトリがあるかどうか調べます。これが存在しない場合、アプリケーションは TranslationDictionary を作成せず、lmessage などのローカライゼーション式は元の翻訳されていないテキストを返します。
具体的な例として、次のパッケージ宣言と、
{package DOC.CHECKBUTTONS,
    resource-directory = "resources",
    translations-file = "messages.xml"
}
ロケール "ja" を使用するアプレットによって、resources/ja/messages.xml に翻訳ファイルが指定されることになります。
次の図は、ロケール名の指定とその結果の翻訳ファイルのパスの関係を示しています。
Figure: Relationship Between Specification and Path
この図では、米国および他の全地域の英語、全地域のフランス語とドイツ語の翻訳ファイルを表しています。ロケール en-CA (カナダ圏英語) を指定したアプレットは resources\en\messages.xml を使用し、ロケール fr-CA (カナダ圏フランス語) を指定したアプレットは resources\fr\messages.xml を使用します。
翻訳ファイル指定すべてを applet 宣言に含めることもできます。
{applet
    locale = "ja",
    resource-directory = "resources",
    translations-file = "messages.xml"
}
翻訳ファイルをアプリケーション ファイルとともにディプロイする必要があります。IDEドキュメンテーションのプロジェクトのディプロイメントを参照してください。

書き出したメッセージの翻訳

翻訳ファイルは XML ファイルで、元のテキスト、テキスト検索キー、コメント、および翻訳を区切るために XML タグを使用しています。翻訳ファイル内の各テキスト要素は <string></string> タグで表され、タグの内部にはそのテキストの情報が次の形式で含まれています。
<string>
<key></key>
<original></original>
<comment></comment>
<translation></translation>
</string>
メッセージ書き出しスクリプトは、ローカライゼーション式ごとに <string></string> 要素と、その中に <key></key>、<original></original>、<comment></comment> 要素を生成します。ソースのローカライゼーション式に含まれていない要素はすべて省略されます。
たとえば、次の 2 つの lmessage 式を見てください。
{lmessage "Submit"}
{lmessage key = "submit alternate", comment = "Use 'click here' instead.", "Submit"}
これらに対して、スケルトンの翻訳ファイルでは次のように項目が生成されます。
<translation-dictionary version="1">

<string>
<original>Submit</original>
</string>

<string>
<key>submit alternate</key>
<original>Submit</original>
<comment>Use 'click here' instead.</comment>
</string>

</translation-dictionary>
翻訳者は、<translation></translation> 要素に元のテキストの翻訳を含めて追加します。
Curl ソース コードのローカライゼーション式で異なるキーを明示的に指定しない限り、翻訳内容の検索には元のテキストがキーとして使われる点に注意してください。Curl ソース ファイルで元のテキストを変更した場合は、翻訳ファイルで該当するテキストにも変更を反映させる必要があります。
テキスト出力に引数を含める必要がある場合、lformat または lmessage 式を使います。lformatformat のバリアントで、フォーマット文字列で localize を呼び出します。lformat を使用する場合、format で説明されているように残余引数にインデックスを使用します。たとえば文字列引数の場合、最初の引数のフォーマット識別子を %1!s!、2 番目を %2!s! のように指定します。この理由は、言語によって単語、句、データ値を異なる順序で表す必要性に対応するためです。
lmessagelformat 呼び出しに展開され、Curl 式を lformat の文字列引数とフォーマット文字列の %s フォーマット識別子に置き換えます。生成される %s フォーマット識別子は残余引数インデックスを使用しています。次のコードは、
{lmessage
    This uses lmessage. We're going to include some data values
    here. This is int-min: {value int-min}, and this is int-max:
    {value int-max}.
}
スケルトンの翻訳ファイルで次のように項目を生成します。
<string> 
<original>
This uses lmessage. We're going to include some
data values here. This is int-min: %1!s!, 
and this is int-max: %2!s!.
</original> 
</string>
次のコードは、
{lformat 
    "formatting int-min %1!d!, formatting int-max %2!d!, and a number
%3!.2f!, and another %4!.2f!", int-min, int-max, 22/7, 45/9 
}
スケルトンの翻訳ファイルで次のように項目を生成します。
<string>
<original>
formatting int-min %1!d!, formatting int-max %2!d!, 
and a number %3!.2f!, and another %4!.2f!
</original>
</string>

ロケールの選択

特別な状況では、アプレット マシンの作業ロケールを明示的に指定しなければならない場合があります。指定がなければホスト ロケールが直接使われます。

作業ロケールの指定

アプリケーションによっては、アプレットを実行するマシンのホスト ロケールと異なる作業ロケールを設定する必要が生じます。例えば、大都市の美術館の来館者が道順やその他の情報を取得するために使うシステムを想定してみましょう。このシステムを実行するマシンは、ある特定の国の美術館に設置され、そのホスト ロケールはその国に対応する値に設定されています。システムを利用する来館者は、それぞれの国の言語でボタンやメッセージが表示されることを望みます。このようなアプリケーションで、ユーザーによる優先ロケールの選択を可能にすることができます。
アプレットが特定ロケールを必要とすることが明らかな場合は、applet 宣言に locale パラメータを追加して作業ロケールを指定します。

ホスト ロケールの使用

アプリケーション全体にはホスト ロケールと異なる作業ロケールが設定されている状態で、ホスト ロケールを使いたい場合があります。例えば前のセクションにある美術館アプリケーションの場合、地元の館員が読み取らなければならないエラー メッセージは、来館者が選択する言語ではなく、ローカルの言語で表示する必要があります。
hlmessage マクロはホスト ケール、つまり Curl 実行環境を実行するクライアント マシンで指定されている Locale を使用します。host-localize および hlformat マクロは、ホスト ロケールを使用する localize および lformat のバリアントです。