Zen のローカライズ
アプリケーションのテキストをローカライズする場合は、まず 1 つの言語でテキスト文字列のインベントリを作成します。次に、アプリケーションのロケールが異なるときに、翻訳したバージョンでこれらのメッセージを置き換えるための規約を確立します。Zen ページのローカライズに必要な情報の大半は、"Caché Server Pages (CSP) の使用法" ドキュメントの “CSP アプリケーションにおけるテキストのローカライズ” の章に記載されています。CSP ページの開発について、この章に記載されている内容はすべて、Zen ページにも当てはまります。
この章では、Zen にのみ該当する以下の項目について説明します。この章では、以下の内容について説明します。
Zen のローカライズ手法があらゆる Zen クラスで機能するためには、各クラスで DOMAIN クラス・パラメータの値を指定する必要があります。
CSP のローカライズ
ここでは "Caché Server Pages (CSP) の使用法" ドキュメントの “CSP アプリケーションにおけるテキストのローカライズ” の章の内容を簡単に説明します。CSP を初めて使用する場合は、この章を読んでから、本書を読み進めてください。
ローカライズした Web アプリケーションの簡単なデモを見るには、Caché の実行中に以下の URI を入力します。57772 は Caché Web サーバのポート番号に置き換えます。
http://localhost:57772/csp/samples/language.cspOpens in a new tab
ローカライズの実際
Caché は、Web アプリケーションのテキストをローカライズする以下のプロセスをサポートします。
-
開発者は、アプリケーションのユーザ・インタフェースのどこにテキスト文字列を表示するかを決定します。
-
開発者は、元の言語でテキスト文字列を記述した XML メッセージ・ファイルを作成します。
-
開発者は、その XML を Caché ネームスペースにインポートします。
これにより、新規エントリがそのネームスペースのメッセージ・ディクショナリに追加されます。
-
開発者は、XML を翻訳者チームに渡します。
-
翻訳者は、元のテキストを翻訳したテキストに置き換えることで新規 XML メッセージ・ファイルを作成します。
-
開発者は、新規に作成されたこの XML を Caché ネームスペースにインポートします。
翻訳したテキストと元のテキストは、メッセージ・ディクショナリに共存します。
-
実行時に、アプリケーションはブラウザの既定の言語に基づいて、表示するテキストを選択します。
メッセージ・ディクショナリ
メッセージ・ディクショナリは、ドメイン名、言語名、メッセージ ID で構成されたテキスト文字列を格納する単純なデータベースです。
-
各メッセージのテキストは、32,000 文字以下の文字列です。メッセージはテキストのみでも構成できますが、%1、%2 などのパラメータを使用することもできます。
-
ドメイン名は任意の文字列です。特定のアプリケーションやページのすべてのメッセージなど、関連するテキスト・アイテムのグループはドメイン名で識別します。
-
言語名は、RFC1766Opens in a new tab で定義されている、すべて小文字の言語タグです。これは、1 つ以上の部分で構成されており、主言語タグ (en や ja) の後に、オプションでハイフン (-) で区切られた 2 番目の言語タグ (en-gb や ja-jp) を記述します。
-
メッセージID は任意の文字列で、メッセージを一意に識別します。メッセージ ID はドメイン内で一意とすれば十分です。メッセージ ID は、メッセージを作成するための規則に応じて、ユーザ側で割り当てるか、Caché で自動的に割り当てます。
Caché のそれぞれのユーザ定義ネームスペースでは、^CacheMsg という添え字付きグローバルにメッセージ・ディクショナリが格納されます。^CacheMsg の添え字の順序は、ドメイン、言語、メッセージ ID です。
$$$Text マクロ
$$$Text マクロがあらゆる Zen クラスで機能するためには、各クラスで DOMAIN クラス・パラメータの値を指定する必要があります。
メッセージ・ディクショナリを作成する最も簡単な方法は、$$$Text マクロ呼び出しを使用して CSP クラス・コードをシードすることで、コンパイル時にメッセージ・ディクショナリのエントリを自動的に生成することです。このトピックで説明するとおり、$$$Text は、コンパイル時にはメッセージを自動的に作成し、実行時にそのメッセージを取得するコードを生成します。
アプリケーション・メッセージを別の言語に翻訳するときに、Export コマンドを実行することにより、元の言語のメッセージをすべて収めたリストをメッセージ・ディクショナリからエクスポートできます。これにより、完全な XML メッセージ・ファイルが元の言語で生成されます。"Caché Server Pages (CSP) の使用法" の “CSP アプリケーションにおけるテキストのローカライズ” の章にある “メッセージ・ディクショナリの管理” を参照してください。
$$$Text マクロの返り値は %String です。使用する正しい $$$Text マクロは、この出力文字列に必要な形式によって、次のように異なります。
-
$$$Text
-
$$$TextJS ($$$Text の結果に JavaScript エスケープを適用します。)
-
$$$TextHTML ($$$Text の結果に HTML エスケープを適用します。)
$$$Text によって返される %String を変数に割り当て、以降の呼び出しではこの変数を使用してメッセージを指定できます。以下はその例です。
Set tmsg = $$$TextJS("Error saving production")
&js<alert('#(tmsg)#: #($ZCVT($ZE,"O","JS"))#');>
または、以下のように、文字列が必要な場所に $$$Text マクロを挿入できます。
&js<alert('#($$$TextJS("Error saving production"))#: #($ZCVT($ZE,"O","JS"))#');>
$$$Text の引数
$$$Text は、次のテーブルに示す引数 text、domain、および language を持ちます。先頭の引数、text のみが必須です。
引数 | 説明 |
---|---|
text |
空でない文字列 text には、リテラル文字列を指定する必要があります。いずれのタイプの式構文も使用できません。text では、次の形式を使用できます。 "actualText" または以下のようにします。 "@textId@actualText" textId はメッセージ ID で、actualText はメッセージのテキストです。 文字列 actualText には以下のものを指定できます。これらを組み合わせて指定することもできます。
指定されている場合、textId がメッセージ ID として使用されます。@textId@ が指定されていない場合、このテキストの 32 ビット CRC (冗長巡回検査) を計算して新規の textId が生成されます。指定した textId と同じ ID を持つメッセージが既に存在する場合は、その既存のメッセージと actualText が同じ内容のテキストであるかどうかがチェックされます。同じテキストではない場合は、エラーが報告されます。 |
domain | (オプション) 新規メッセージのドメインを指定する文字列。指定しない場合、既定では domain はコンパイル時に DOMAIN クラス・パラメータの値に設定され、実行時に %response.Domain に設定されます。 |
language |
(オプション) 言語を指定する RFC1766Opens in a new tab コード。Caché では、この文字列はすべて小文字に変換されます。指定しない場合、language は既定で以下のようになります。
|
コンパイル時の $$$Text
$$$Text、$$$TextJS、または $$$TextHTML の各マクロの呼び出しを持つクラスをコンパイルすると、これらの呼び出しごとに、マクロ引数で指定された text、メッセージ ID、domain、および language を使用してメッセージ・ディクショナリにメッセージが生成されます。
実行時の $$$Text
メッセージに引数 %1、%2、%3、%4 などを記述している場合は、対応する置換テキストを指定した後でそのテキストを表示する必要があります。$$$Text は文字列を返すので、コーディング言語に固有の文字列操作を使用できます。例えば JavaScript では以下のとおりです。
var prompt = '#($$$TextJS("Remove user %1 from this Role?"))#';
prompt = prompt.replace(/%1/g,member.userName);
$$$Text 文字列を %response.FormatText メソッドまたは $$$FormatText マクロの最初の引数に入力することもできます。 詳細は、"Caché Server Pages (CSP) の使用法" の “CSP アプリケーションにおけるテキストのローカライズ” の章にある “クラス・コードからのローカライズ” を参照してください。
Zen のローカライズ
以下の規約があらゆる Zen クラスで機能するためには、各クラスで DOMAIN クラス・パラメータの値を指定する必要があります。
Zen ページは CSP ページです。CSP のローカライズでの運用はすべて、Zen ページにも適用できます。ただし、Zen には、ローカライズを容易にするために、次の規約が追加されています。
-
ZENLOCALIZE パラメータを 1 (True) に設定する Zen プロパティはすべて、自動的にメッセージ・ディクショナリ・エントリを生成します。Caché によるメッセージ・ディクショナリの生成では、<csp:text> などのローカライズ可能な CSP タグで textid="" を使用するときと類似した規約が使用されます。つまり、以下のようになります。
-
メッセージのテキストは、このプロパティの文字列値です。
-
メッセージ ID は、このテキストの 32 ビット CRC です。
-
ドメインは、DOMAIN クラス・パラメータの値をとります。
-
言語は、実行時にブラウザの既定言語の値をとります。
-
-
Zen のデータ型クラスである %ZEN.Datatype.captionOpens in a new tab の ZENLOCALIZE パラメータの既定値は 1 (True) なので、%ZEN.Datatype.captionOpens in a new tab タイプを持つと定義されたプロパティはすべて、自動的に前述のようにローカライズされます。
Zen コンポーネントのローカライズ
データ型のパラメータ ZENLOCALIZE に 1 を設定した文字列値プロパティがZen コンポーネントにある場合、Zen が <page> の記述から %CreatePage メソッドを生成すると、それらのプロパティに指定されたテキストが自動的にローカライズされます。
すべての文字列値プロパティに Zen データ型 %ZEN.Datatype.captionOpens in a new tab を指定すると便利です。このデータ型では、ZENLOCALIZE は自動的に 1 に設定されますが、プロパティ定義にデータ型のパラメータ ZENLOCALIZE=1 を含めることで、直接 ZENLOCALIZE を設定することもできます。
以下のすべての条件が True の場合 :
-
ZENLOCALIZE を 1 に設定したプロパティを持つコンポーネントを使用している
-
これらのコンポーネントを XData Contents の <page> 要素に配置している
-
Zen ページ・クラスに DOMAIN パラメータ値を定義している
%CreatePage メソッドに対して Zen で生成されるコードが、自動的に $$$Text を呼び出して、これらの各プロパティをローカライズします。当然、“ローカライズの実際” の説明に従って、自分で翻訳する必要があります。ただし、このセクションで説明されているとおりにこの作業を行い、ZENLOCALIZE および $$$Text を使用すると、翻訳された文字列が自動的に提供されます。その結果、実行時にブラウザまたは Caché サーバ向けの言語ロケールを検出することで、Zen では正しい翻訳がユーザに自動的に提供されます。
以下の簡単な例で説明します。
<button caption="OK" />
%CreatePage で以下のコードが生成されます。
Set bttn.caption = $$$Text("OK")
<page> を使用しないでプログラムでページをビルドすると、ZENLOCALIZE=1 であっても、コンポーネント・プロパティが自動的にローカライズされることはありません。この場合、ボタン・キャプションのコードを生成する前述の例に示したように、これらの各文字列の $$$Text を呼び出す必要があります。
カスタム・コンポーネントのローカライズ
新しいコンポーネントを作成している場合は、次のようにデータ型 %ZEN.Datatype.captionOpens in a new tab としてローカライズされるプロパティを定義できます。
Property title As %ZEN.Datatype.caption;
コンポーネント内でプロパティを参照するには、二重ドット構文を付けたプロパティ名を使用するだけです (この例では、..title)。ローカライズする必要のある静的なテキストが存在する場合を除き、カスタム・コンポーネント・コードで $$$Text を使用する必要はありません。<page> でこのコンポーネントを参照するたびに、このプロパティは、組み込みの Zen プロパティと同じように自動的にローカライズされます。以下はその例です。
<MyComponent title="AAA" />
これにより、以下のようなコードが %CreatePage に生成されます。
Set MyCmp = $$$Text("AAA")
クライアント側のテキストのローカライズ
Zen は、JavaScript メソッド内で使用できる $$$Text のバリアントをサポートします。この機能により、クライアント側コードでのローカライズ文字列の使用が簡素化されます。
JavaScript ローカライズの構文は、ObjectScript での $$$Text マクロに類似しています。
var str = $$$Text('This is a localized string.');
このコードを含むメソッドが Zen ページ内で実行しているときに、DOMAIN パラメータの設定によってローカライズが有効になっていてローカライズされた文字列が使用可能な場合、$$$Text はローカライズされた文字列を返します。$$$Text は、オプションの 2 番目の引数 DOMAIN 名を使用できます。この引数を使用すると、既定のローカライズ・ドメインをオーバーライドできます。
var str = $$$Text('This is a localized string.', 'MyDomain');
JavaScript はマクロをサポートしないため、$$$Text は文字列を返す関数として実装されます。JavaScript 内の文字列は、一重引用符 (') または二重引用符 (") のいずれかで囲むことができ、どちらの規則もサポートされています。$$$Text に対する引数は、いずれもリテラル (引用符付き) 文字列である必要があります。そうでない場合は、ローカライズされた値は返されません。単一のコード行に完全な $$$Text() 式を記述する必要があります。$$$Text('string') のすべての出現は、コメントおよび文字列内を含め、JavaScript 内のいずれかに表示されると処理されます。これは、コードの動作には影響しませんが、文字列テーブルに追加のエントリが追加される場合があります。
サーバ側 $$$Text と同じ方法で、文字列に "@33@MyString" などの明示 ID を使用できます。
Caché バージョン 2010.2 では、$$$Text 関数は存在しますが、単純に渡された文字列を返すのみです。
JavaScript 関数 $$$FormatText もサポートされています。これは、最大 4 つのパラメータ値を持つ %1、%2、%3、%4 のすべての出現を置換します。
alert($$$FormatText('Ok to delete file %1?', filename));
$$$Text は、文字列コンテンツを自動的に取得して、ローカライズ・グローバルに追加します。ObjectScript の $$$Text マクロの場合は、マクロ・プリプロセッサがこれを行います。JavaScript にはマクロがないため、JavaScript メソッドをクライアント側関数に変換するコンパイラは、JavaScript で $$$Text('string','domain') の出現をスキャンし、最初の引数 (および存在する場合には 2 番目の引数) を取り込んでローカライズされた値の JavaScript 配列を構築します。これは、ページの一部として機能します。$$$Text 関数は、この配列を使用して文字列をローカライズ・バージョンに変換します。配列の生成では、サーバ側 $$$Text マクロを使用します。これにより JavaScript のローカライズされた文字列がサーバ側文字列と同じメカニズムを使用して作成されます。
Zen ページが表示されるときに、ページ上で検出されたすべてのタイプのコンポーネントおよびそのコンポーネントのスーパークラスに対して、ローカライズされた文字列の配列が作成されます。コンポーネントが動的にページに追加され、Zen がこのコンポーネントのクラス定義を動的にロードする必要があると判断した場合、このコンポーネント用のローカライズされた文字列も生成されます。
zenText を使用したローカライズ
クライアント側で $$$Text と同等なものとして、zenText JavaScript 関数もあります。
zenText(id,p1,p2,p3,p4)
この関数は、クライアント側の一連のリソースからローカライズされたテキスト・メッセージを検索します。以下はその説明です。
-
id はテキスト・メッセージの ID です。
-
p* 変数はオプションです。Zen は、メッセージ・テキストにこれらの変数が表示されている場合、%1、%2 などの代わりに使用します。
指定された id にローカライズされた文字列が定義されていない場合、zenText は既定の文字列を返します。
Zen ページ・クラスで %OnGetJSResources コールバック・メソッドをオーバーライドすることで、一連のローカライズされたテキスト・メッセージを定義して、Set 文を入力します。次の例では、リソース MyMessage および FieldValidation を定義しています。
Method %OnGetJSResources(ByRef pResources As %String) As %Status [ Private ]
{
Set pResources("MyMessage") = $$$Text("This is my message")
Set pResources("FieldValidation") = $$$Text("Field %1 has an error")
Quit $$$OK
}
%OnGetJSResources メソッドは、リソース識別子とテキスト文字列のペアが格納される配列に値を入力します。%OnGetJSResources は、自動的に呼び出され、必要に応じて zenText 関数を使用して JavaScript からこれらのリソースにアクセスできます。以下はその例です。
alert(zenText('MyMessage'));
alert(zenText('FieldValidation','SSN'));
アプリケーションの各ページに適用するクライアント側のリソースを定義できます。このためには、ページ・クラスではなくアプリケーション・クラス内の %OnGetJSResources メソッドをオーバーライドします。
$$$Text と同様、“ローカライズの実際” の説明に従って、"This is my message" などの文字列を自分で翻訳する必要があります。ただし、このセクションで説明されているとおりにこの作業を行い、zenText および %OnGetJSResources を使用すると、これらの翻訳済みの文字列が自動的に提供されます。その結果、実行時にブラウザまたは Caché サーバ向けの言語ロケールを検出することで、Zen では正しい翻訳がユーザに自動的に提供されます。
すべての Zen ページ・クラスには、クライアント側のローカライズのリソースとして定義済みのローカライズされたテキスト文字列がいくつかあります。以下はその一覧です。この例の構文は完全ではありません。これは、行を短くするために、表示の右側が切り捨てられているためです。ただし、zenText を使用して呼び出すと、各行はこのリソースの内容を示すのに十分な長さで表示されます。
Set pResources("zenMonthNames") = $$$Text("January,February,March,April,May,June
Set pResources("zenMonthShortNames") = $$$Text("Jan,Feb,Mar,Apr,May,Jun,Jul,Augu
Set pResources("zenDayNames") = $$$Text("Sunday,Monday,Tuesday,Wednesday,Thursda
Set pResources("zenDayShortNames") = $$$Text("S,M,T,W,T,F,S","%ZEN")
zenText 以外の JavaScript 関数の詳細は、“Zen ページ” の章の “Zen ページ・クラス” セクションにある “クライアント側の関数と変数” を参照してください。