Previous Next

翻訳アダプタの使用法

次は、アダプタをコード内で使用する方法です。

Example #1 単一言語の PHP コードの例



    

上の例の出力は、翻訳に対応していません。 おそらく実際はあなたの母国語でコードを書くでしょう。 翻訳しなければならないのは、普通は出力内容だけではありません。 たとえばエラーメッセージやログメッセージなども対象となります。

次のステップは、既存のコードに Zend Translate をインクルードすることです。 もちろん、あとからコードを変更するよりも 最初から Zend_Translate を使ったコードを書くほうがずっと簡単です。

Example #2 多言語対応の PHP コードの例

addTranslation('//my/path/fr-source.mo', 'fr');

print $translate->_("Example")."\n";
print "=======\n";
print $translate->_("Here is line one")."\n";
printf($translate->_("Today is the %1\$s") . "\n", date("d.m.Y"));
print "\n";

$translate->setLocale('fr');
print $translate->_("Fix language here is line two") . "\n";

では、何が起こっているのか、そしてどうやって Zend_Translate をコードに組み込むのかについて もうすこし詳しく見ていきましょう。

新しい Translation オブジェクトを作成し、もととなるアダプタを定義します。




        この例では、
        Gettext アダプタ
        を使うことにしました。
        source-de.mo というファイルを
        /my/path に置いています。
        この gettext ファイルにはドイツ語の翻訳が含まれています。
        また、その後で別途フランス語のファイルも追加しています。
    

次に行うのは、翻訳対象の文字列をすべてラップすることです。 一番シンプルな手法は、このように文字列や文章を囲むことです。

_("Example")."\n";
print "=======\n";
print $translate->_("Here is line one")."\n";
中には翻訳する必要のない文字列もあるでしょう。 区切り線などは、たとえ言語が何であっても同じです。

データの値を翻訳文字列に組み込むこともできます。 この場合は埋め込みパラメータを使用します。

_("Today is the %1\$s") . "\n", date("d.m.Y"));
print() の代わりに printf() 関数を使用し、 すべてのパラメータを %1\$s のように置き換えます。 最初のパラメータが %1\$s、その次が %2\$s、 といったようになります。 これにより、実際の値を知らなくても翻訳を進めることができます。 今回の例では、日付は常に今日の日付になります。 しかし、文字列を翻訳する際には、実際の日付が何であるかを知る必要はありません。

各文字列は、メッセージ ID によって識別します。 文字列の代わりに、コード内でメッセージ ID を指定することもできます。 その場合は、このようになります。

_(1)."\n";
print "=======\n";
print $translate->_(2)."\n";
しかし、この方法にはいくつか欠点があります。

コードを見ただけでは、そこでどんな内容が出力されるのかがわかりません。

また、文字列の一部が翻訳されていない場合にも問題が起こるでしょう。 翻訳の動作原理について考えてみましょう。 まず Zend_Translate は、指定した ID あるいは文字列に対応する翻訳が その言語に存在するかどうかを探します。 翻訳文字列が見つからない場合は、Zend_Locale で定義されているその次の言語の翻訳を探します。 つまり "de_AT" の場合は "de" のみで探します。 "de" の翻訳も見つからない場合は、 もとのメッセージをそのまま返します。 このようにして、たとえ翻訳文字列がなくても何らかの出力を得ることになっています。 Zend_Translate は、文字列の翻訳の際に エラーや例外を発生させることはありません。

翻訳ソースの構造

次に行うのは、翻訳したい言語用の翻訳ソースを作成することです。 それぞれのアダプタには個別の方法があるので、それをここで説明します。 その前に、すべてのアダプタに共通する一般的な事項について説明しておきます。

どこに翻訳ソースファイルを保存すべきなのかを知っておきましょう。 Zend_Translate では特に制限はありませんが、 以下のような構造を推奨します。

  • 単一構造のソース

    /application
    /languages
      lang.en
      lang.de
    /library

    利点: すべての言語のソースファイルを同じディレクトリに配置できます。 関連するファイルを分割する必要がありません。

  • 言語ごとに分けた構造

    /application
    /languages
      /en
        lang.en
        other.en
      /de
        lang.de
        other.de
    /library

    利点: すべての言語がひとつのディレクトリにまとめられます。 各言語のチームは、ひとつのディレクトリを翻訳するだけですみます。 また、複数のファイルを透過的に使用できます。

  • アプリケーションごとに分けた構造

    /application
      /languages
        lang.en
        lang.de
        other.en
        other.de

    利点: すべての言語のソースファイルを同じディレクトリに配置できます。 関連するファイルを分割する必要がありません。

    欠点: 同じ言語で複数のファイルを使用する場合に問題が発生します。

  • Gettext 形式の構造

    /languages
      /de
        /LC_MESSAGES
          lang.mo
          other.mo
      /en
        /LC_MESSAGES
          lang.mo
          other.mo

    利点: 以前から使っている gettext 形式のソースを、 そのままの形式で使用できます。

    欠点: これまでに gettext を使ったことがない人たちにとって、 サブディレクトリの中にまたサブディレクトリという構造は不可解でしょう。

  • ファイル構造のソース

    /application
      /models
        mymodel.php
        mymodel.de
        mymodel.en
      /views
      /controllers
        mycontroller.de
    /document_root
      /images
      /styles
      .htaccess
      index.php
      index.de
    /library
      /Zend

    利点: すべてのファイルについて、翻訳ソースを関連付けられます。

    欠点: 小さな翻訳ファイルがあちこちに散らばってしまうので、翻訳が面倒です。 また、すべてのファイルに対して翻訳ソースを追加する必要があります。

Zend_Translate で最も便利なのは、単一構造か 言語ごとに分けた構造でしょう。

さあ、これでどんな構造でいくかが決まりました。 次に翻訳ソースファイルを作っていきましょう。

Array ソースファイルの作成

Array ソースファイルは、単なる配列です。 しかし、専用のツールはないので自分でそれを定義しなければなりません。 とは言え、この配列は非常にシンプルです。 コードが期待通りに動作しているかを確認するのにも最も手っ取り早いでしょう。 翻訳作業を始めるにあたっては、一般的に最適なアダプタであるといえます。

$english = array('message1' => 'message1',
                 'message2' => 'message2',
                 'message3' => 'message3');
$german = array('message1' => 'Nachricht1',
                'message2' => 'Nachricht2',
                'message3' => 'Nachricht3');

$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($deutsch, 'de');

リリース 1.5 以降では、配列を外部のファイルに含めることもサポートしています。 ファイル名を指定すると、Zend_Translate が自動的にそれをインクルードして配列を探します。 詳細は、次の例を参照ください。

// myarray.php
 'Nachricht1',
    'message2' => 'Nachricht2',
    'message3' => 'Nachricht3');

// コントローラ
$translate = new Zend_Translate('array', 'path/to/myarray.php', 'de');

Note:

配列を返さないファイルはインクルードできません。 また、このファイル内での出力はすべて無視されます。

Gettext ソースファイルの作成

Gettext ソースファイルは、GNU の gettext ライブラリで作成します。 あなたのコードをパースして gettext ソースファイルを作成してくれるツールが、 フリーで公開されています。このファイルは、 *.mo のような名前のバイナリファイルとなります。 ファイルを作成するためのフリーソフトウェアのひとつに » poEdit があります。これは、ファイルの作成だけでなく翻訳作業自体もサポートしています。

// mo ファイルを作成し、翻訳を済ませているものとします
$translate = new Zend_Translate('gettext', 'path/to/english.mo', 'en');
$translate->addTranslation('path/to/german.mo', 'de');

ご覧の通り、アダプタの使用法はまったく同じです。 違っているのはたったの一点だけ。 'array' が 'gettext' になっているということです。 その他の部分は、どのアダプタを使用してもまったく同じになります。 gettext アダプタを使用する際には、 gettext の標準的なディレクトリ構造や bindtextdomain、 textdomain にこだわる必要はありません。 単にパスとファイル名をアダプタに渡せばいいのです。

Note:

ソースのエンコーディングには常に UTF-8 を使用しなければなりません。そうしないと、 複数のソースエンコーディングを使用することで問題が発生します。 たとえば、あるソースファイルは ISO-8815-11 でエンコードされており、 他のファイルは CP815 でエンコードされているとしましょう。 ソースファイルのエンコーディングはひとつしか指定できないので、 どちらか一方は正しく表示されなくなります。

UTF-8 は可搬性の高いフォーマットで、全言語をサポートしています。 すべての言語で UTF-8 を使用することで、 エンコーディングの非互換性による問題をなくすことができます。

TMX ソースファイルの作成

TMX ソースファイルは、新しい業界標準です。 XML ファイルを使用しているので、どんなエディタでも読み込め、 かつ人間にも読める形式であるという利点があります。 TMX ファイルはテキストエディタで作成することもできますし、 ツールを用いて作成することもできます。しかし、 現在使用できる TMX ソースファイル作成ツールの多くは フリーソフトウェアではありません。

Example #3 TMX ファイルの例




 
Nachricht1 message1 message2 Nachricht2
$translate = new Zend_Translate('tmx', 'path/to/mytranslation.tmx', 'en');
// TMX では、複数の言語をひとつの TMX ファイルに含めることができます

TMX ファイルには、同一ファイルに複数の言語を含めることができます。 含まれている言語はすべて自動的に追加されるので、 addLanguage() をコールする必要はありません。

ソース中の特定の言語のみを翻訳対象としたい場合は、オプション defined_languagetrue に設定します。このオプションを指定した場合は、 対象としたい言語を addLanguage() で明示的に指定します。このオプションのデフォルト設定は、 全言語を対象とするようになっています。

CSV ソースファイルの作成

CSV ソースファイルは、サイズが小さく可読性があります。 顧客が自分で翻訳をしたいということなら、 おそらく CSV アダプタを使用することになるでしょう。

Example #4 CSV ファイルの例

# csv ファイルの例
message1;Nachricht1
message2;Nachricht2
$translate = new Zend_Translate('csv', 'path/to/mytranslation.csv', 'de');
$translate->addTranslation('path/to/other.csv', 'fr');

CSV アダプタで使用できるオプションは、 'delimiter''limit' そして 'enclosure' の 3 つです。

CSV 文字列の標準の区切り文字は ';' 記号です [1] 。 しかし、必ずこれでなければならないというわけではありません。 オプション 'delimiter' を使用すると、 別の区切り文字を使用することができます。

CSV ファイルのデフォルトの行長制限は '0' です。 この場合は、CSV ファイルの行末を自動的に検出します。 'limit' オプションに何らかの値を設定すると CSV ファイルの読み込みが高速になりますが、 その長さを超えた部分は切り捨てられます。

CSV ファイルの値を囲む文字のデフォルトは '"' です。 別の文字を使用する場合は 'enclosure' オプションを設定します。

Example #5 CSV ファイルの例 その 2

# csv ファイルの例
# 元メッセージは 'message,1'
"message,1",Nachricht1
# 翻訳は 'Nachricht,2'
message2,"Nachricht,2"
# 元メッセージは 'message3,'
"message3,",Nachricht3
$translate = new Zend_Translate('csv', 'path/to/mytranslation.csv', 'de', array('delimiter' => ','));
$translate->addTranslation('path/to/other.csv', 'fr');

INI ソースファイルの作成

INI ソースファイルは可読性がありますが、 翻訳以外のデータを含めるとサイズはそれほど小さくなりません。 直接顧客に変更させるようなデータの場合にも INI アダプタが使えるでしょう。

Example #6 INI ファイルの例

[Test]
;TestPage Comment
Message_1="Nachricht 1 (de)"
Message_2="Nachricht 2 (de)"
Message_3="Nachricht :3 (de)"
$translate = new Zend_Translate('ini', 'path/to/mytranslation.ini', 'de');
$translate->addTranslation('path/to/other.ini', 'it');

INI にはいくつかの制約があります。 INI ファイルの値に非英数字が含まれる場合は、値をダブルクォート (") で囲まなければなりません。また、ini ファイルのキーとしては使えない予約語があります。 予約語には null, yes, no, true, そして false があります。 値に null, no および false を指定するとそれは "" と同じ扱いとなり、yes と true を指定するとそれは "1" と同じ扱いとなります。 {}|&~![()" といった文字はキーの中では使えず、 また値の中で使用すると特別な意味を持つことになります。 予期せぬ挙動を起こすようなら、このアダプタを使わないようにしましょう。

アダプタのオプション

すべてのアダプタで、オプションを使用することができます。 もちろん、アダプタによってオプションは異なります。 アダプタを作成する際に、オプションを設定することができます。 すべてのアダプタで共通のオプションは 'clear' で、これは、翻訳データを既存のものに追記するのかしないのかを指定します。 標準の動作は、新しい翻訳を既存の翻訳に追記します。 しかし、これを指定すると、既存の翻訳データをいったん消去して 新しいデータを追加します。消去されるのは選択した言語のみであり、 その他の言語は影響を受けません。

オプションを一時的に設定するには、 addTranslation($data, $locale, array $options = array()) とオプションの三番目のパラメータを指定します。 setOptions() 関数でオプションを設定することもできます。

Example #7 翻訳オプションの使用

// ':' を、翻訳ソースファイルの区切り文字として指定します
$options = array('separator' => ':');
$translate = new Zend_Translate('csv', 'path/to/mytranslation.csv', 'de', $options);

...

// 定義されている言語を消去し、新しい翻訳データを使用します
$options = array('clear' => true);
$translate->addTranslation('path/to/new.csv', 'fr', $options);

各アダプタで使用できるオプションについて、 その使用法を以下にまとめます。

翻訳アダプタのオプション
アダプタ オプション 標準の値 説明
すべて clear false true にすると、既に読み込んでいる翻訳を消去します。 新しい翻訳データを読み込む際に、 新しいインスタンスを作成する代わりに使用します。
すべて scan null null にすると、ディレクトリ構造のスキャンを行いません。 Zend_Translate::LOCALE_DIRECTORY にすると、 ディレクトリからロケールを検出します。 Zend_Translate::LOCALE_FILENAME にすると、 ファイル名からロケールを検出します。 詳細は 自動的なソースの検出 を参照ください。
Csv delimiter ; ソースと翻訳を区切る際に使用する記号を指定します。
Csv length 0 CSV の行の長さの最大値を定義します。0 にすると、自動的に検出します。
Csv enclosure " 値を囲むための文字を定義します。デフォルトはダブルクォートです。

自分でオプションを定義すれば、それをすべてのアダプタで使用することができます。 オプションを定義するには setOptions() メソッドを使用します。setOptions() には、指定したいオプションの配列を渡します。 指定したオプションがすでに存在する場合は、上書きされます。 存在しないオプションを指定した場合はアダプタは何もしないので、 必要となるであろうオプションはすべて指定しておくことができます。 アダプタが使用している既存オプションは上書きされないことに注意してください。

現在設定されているオプションを取得するには getOptions() メソッドを使用します。getOptions() をパラメータなしでコールすると、すべてのオプションを返します。 オプションのパラメータを指定した場合は、 特定のオプションの内容のみを返します。

言語の処理

複数の言語を使用する場合に便利なメソッドを紹介します。

getLocale() メソッドを使用すると、 実際に設定されている言語を取得することができます。 これは、Zend_Locale のインスタンスかロケール ID のいずれかとなります。

setLocale() メソッドは、 翻訳用の新しい標準言語を設定します。 これを使用すると、translate() に毎回オプションの言語パラメータを指定する必要がなくなります。 指定した言語が存在しない場合やその言語用の翻訳データがない場合、 もし地域指定のない言語があれば setLocale() は代わりにそれを使用しようとします。つまり、たとえば en_US の場合だと代わりに en を使用するということです。これも見つからない場合は、 例外をスローします。

isAvailable() メソッドは、 指定した言語が既に存在するかどうかを調べます。 指定した言語のデータが存在する場合に true を返します。

また、getList() メソッドを使用すると、 そのアダプタに設定されている言語の一覧を配列で取得できます。

Example #8 アダプタの言語の処理

...
// 実際に設定されている言語を返します
$actual = $translate->getLocale();

...
// 翻訳時にオプションのパラメータで言語を指定することができます
echo $translate->_("my_text", "fr");
// あるいは標準の言語を設定することもできます
$translate->setLocale("fr");
echo $translate->_("my_text");

...
// この言語が存在するかどうかを調べます
if ($translate->isAvailable("fr")) {
    // 存在します
}

言語の自動処理

新しい翻訳ソースの追加を addTranslation() メソッドでのみ行っている場合は、Zend_Translate は環境にあわせて適切な言語を自動設定します。 つまり、通常は setLocale() をコールする必要はありません。

ユーザのブラウザやサーバの環境に応じて、最適なロケールを探します。 詳細は、以下の例を参照ください。

Example #9 言語の自動検出の動作例

// ブラウザから返される言語設定は次のようなものであると仮定します
HTTP_ACCEPT_LANGUAGE = "de_AT=1;fr=1;en_US=0.8";

// 例 1:
$translate = new Zend_Translate("gettext", "\my_it.mo", "it_IT");
$translate->addTranslation("\my_es.mo","es_UG");
// 適切な言語がみつからないので、メッセージ ID を返します

// 例 2:
$translate = new Zend_Translate("gettext", "\my_en.mo", "en_US");
$translate->addTranslation("\my_it.mo","it_IT");
// 適切な言語は "en_US" となります

// 例 3:
$translate = new Zend_Translate("gettext", "\my_it.mo", "it_IT");
$translate->addTranslation("\my_de.mo","de");
// 適切な言語は "de" となります。"de_AT" の代替言語は "de" だからです

// 例 4:
$translate = new Zend_Translate("gettext", "\my_it.mo", "it_IT");
$translate->addTranslation("\my_ru.mo","ru");
$translate->setLocale("it_IT");
$translate->addTranslation("\my_de.mo","de");
// 翻訳ソースとして "it_IT" を返します

setLocale() メソッドで言語を手動設定したら、 自動設定機能は無効となります。

自動検出を再度有効にしたい場合は、setLocale() で言語として auto を指定します。これにより、Zend_Translate の自動検出機能が再度有効になります。

自動的なソースの検出

Zend_Translate は、翻訳ソースを自動的に検出することができます。 つまり、各ソースファイルを手動で宣言する必要はないということです。 そんな作業は Zend_Translate に任せてしまい、 ディレクトリ内からソースファイルを見つけさせることができるのです。

Note:

自動的なソース検出機能は、Zend Framework バージョン 1.5 以降で使用可能です。

使用法は、翻訳ソースを個別に登録していくのとほとんど同じですが、 ひとつだけ違う点があります。ファイル名の代わりに、 ソースを探すディレクトリを指定するのです。

Example #10 ディレクトリを指定してソースを探す

// 以下のようなディレクトリ構造があることを想定しています
//  /language
//  /language/login/login.tmx
//  /language/logout/logout.tmx
//  /language/error/loginerror.tmx
//  /language/error/logouterror.tmx

$translate = new Zend_Translate('tmx', '/language');

Zend_Translate は、指定したディレクトリだけでなく そのサブディレクトリすべてから翻訳ソースファイルを探します。 おかげで、非常に簡単に使用できるようになっています。 しかし、Zend_Translate では ソースを含まないファイルは無視します。 また翻訳データの読み込みに失敗した場合もそのファイルを無視します。 つまり、翻訳ソースが正しい形式であることと 読み込み可能であることを確認しておく必要があります。 ファイルの形式が間違っていたり読み込みに失敗したりした場合でもエラーは発生しないからです。

Note:

ディレクトリ階層の深さやその中のファイルの数によっては、 Zend_Translate の処理に長い時間がかかることもあります。

この例では TMX フォーマットを使用しており、言語の情報をソース内に含んでいます。 しかし、他のフォーマットの多くは言語の情報をファイル内に持たせることができません。 そんなソースであっても自動検索させることができます。 ただし、次に示す条件を満たす必要があります。

ディレクトリ名からの言語の取得

自動的に言語を検出させる方法のひとつは、 言語名を表すディレクトリの配下にソースファイルを配置することです。 これはもっとも簡単な方法であり、標準的な gettext の実装でも用いられています。

Zend_Translate に 'scan' オプションを指定すると、 ディレクトリ名から言語を検出させることができます。 詳細は次の例を参照ください。

Example #11 ディレクトリ名による言語の検出

// 以下のようなディレクトリ構造があることを想定しています
//  /language
//  /language/de/login/login.tmx
//  /language/de/error/loginerror.tmx
//  /language/en/login/login.tmx
//  /language/en/error/loginerror.tmx

$translate = new Zend_Translate('gettext', '/language', null, array('scan' => Zend_Translate::LOCALE_DIRECTORY));

Note:

これが動作するのは、 ソースファイル中に言語情報を持たないフォーマットを使用している場合のみです。 たとえば TMX などでこのオプションを使用しても、無視されます。 また、このオプションを使用した場合は ファイル名による言語の自動検出は無視されます。

Note:

同じ構造のもとで複数のサブディレクトリがある場合は注意が必要です。 たとえば /language/module/de/en/file.mo のような構造を考えてみましょう。 このパスには、ロケールと検出されうる文字列が複数含まれています。 deen です。 このような場合は、ファイル名による検出を用いることを推奨します。

ファイル名からの言語の取得

言語を自動検出するもうひとつの方法は、特別なファイル名を使用することです。 ファイル名を言語名そのものにするか、あるいはその一部に言語名を含めます。 この方式を使用する場合は、初期化時に 'scan' オプションを設定する必要があります。 ファイル名のつけかたには、以下に示すようにいくつかの方法があります。

Example #12 ファイル名からの言語の取得

// 以下のようなディレクトリ構造があることを想定しています
//  /language
//  /language/login/login_en.tmx
//  /language/login/login_de.tmx
//  /language/error/loginerror_en.tmx
//  /language/error/loginerror_de.tmx

$translate = new Zend_Translate('gettext', '/language', null, array('scan' => Zend_Translate::LOCALE_FILENAME));

ファイル名全体

言語名そのものをファイル名にしてしまうのは一番シンプルな方法ですが、 同一ディレクトリにソースファイルがひとつだけの場合にしか使用できません。

/languages
  en.mo
  de.mo
  es.mo

ファイルの拡張子

もうひとつのシンプルな方法としては、 ファイル名の拡張子を用いて言語を検出させるというものがあります。 しかしこの方法にも問題があり、本来の拡張子が何であったのかがわからなくなります。

/languages
  view.en
  view.de
  view.es

ファイル名の一部

Zend_Translate は、 ファイル名の一部に言語名が含まれている場合にもそれを検出することができます。 しかし、この方式を使用する場合は言語名をトークンで分割する必要があります。 トークンとしてサポートされているのは、小数点 '.' かアンダーライン '_'、 あるいはハイフン '=' のいずれかです。

/languages
  view_en.mo  -> 英語となります。
  view_de.mo  -> ドイツ語となります。
  view_it.mo  -> イタリア語となります。

ロケールとして判断できる部分が複数あった場合は、 最初に見つかったものを使用します。詳細は次の例でご確認ください。

/languages
  view_en_de.mo  -> 英語となります。
  view_en_es.mo  -> 英語となり、最初のファイルを上書きします。メッセージ ID が同じだからです。
  view_it_it.mo  -> イタリア語となります。

3 種類のトークンのどれを用いても言語を検出することができます。 まず最初に使用するのが小数点 '.'、次に使用するのがアンダーライン '_'、そして最後に使用するのがハイフン '-' となります。 ひとつのファイル名の中に複数のトークンが用いられている場合、 トークンの優先順位の順に調べて最初に見つかったものを使用します。 詳細は次の例でご確認ください。

/languages
  view_en-it.mo  -> 英語となります。'_' のほうが '-' より優先されるからです。
  view-en_it.mo  -> イタリア語となります。'_' のほうが '-' より優先されるからです。
  view_en.it.mo  -> イタリア語となります。'.' のほうが '_' より優先されるからです。

翻訳の確認

通常は、テキストが翻訳されているかどうかを気にすることはありません。 しかし、そのテキストが翻訳されているかどうかを、ソースコードから調べたいこともあるでしょう。 そんな場合に使用するメソッドが isTranslated() です。

isTranslated($messageId, $original = false, $locale = null) の最初のパラメータには、翻訳されているかどうかを調べたいテキストを指定します。 また、オプションの三番目のパラメータには、翻訳を調べたいロケールを指定します。 オプションの二番目のパラメータで指定するのは、 その言語に完全に一致した翻訳があるのか、あるいはもう少し広い範囲の翻訳を使用するのかという内容です。 たとえば、あるテキストについて 'en' の翻訳はあるが 'en_US' の翻訳はないといった場合、 通常は 'en' の翻訳を取得することになるでしょう。しかし $original を true にしておくと、このような場合は isTranslated() は false を返すようになります。

Example #13 テキストの翻訳が存在するかどうかの確認

$english = array('message1' => 'Nachricht 1',
                 'message2' => 'Nachricht 2',
                 'message3' => 'Nachricht 3');
$translate = new Zend_Translate('array', $english, 'de_AT');

if ($translate->isTranslated('message1')) {
    print "'message1' の翻訳が存在します";
}
if (!($translate->isTranslated('message1', true, 'de'))) {
    print "'message1' は 'de' に翻訳することはできません。'de_AT' 用の翻訳しかありません";
}
if ($translate->isTranslated('message1', false, 'de')) {
    print "'message1' は 'de_AT' に翻訳できます。もし存在しない場合は代替として 'de' を使用できます";
}

ソースデータへのアクセス

時には、翻訳前のソースデータにアクセスしたいこともあるでしょう。 そんなときのためにふたつのメソッドを用意しています。

getMessageIds($locale = null) メソッドは、 すべてのメッセージの ID を配列で返します。

そして、getMessages($locale = null) メソッドは 翻訳前のソースを配列で返します。メッセージ ID がキー、 それに対応するデータが値となります。

どちらのメソッドについても、オプションのパラメータ $locale を指定することができます。これを指定すると、 指定した言語についての翻訳情報を返します。 このパラメータを省略した場合は、実際に設定されている言語を対象とします。 注意してほしいのは、普通はすべての言語ですべての翻訳が存在すべきであるということです。 つまり、通常はこのパラメータを指定する必要はないはずです。

さらに、getMessages() メソッドで翻訳辞書全体を返すこともできます。 その際には、疑似ロケール 'all' を指定します。 これを指定すると、追加された各ロケールについてのすべての翻訳データを返します。

Note:

注意: 追加されているロケールの数や翻訳データの量によっては、 返される配列は 非常に大きな ものとなります。

Example #14 アダプタでの言語の処理

...
// すべてのメッセージ ID を返します
$messageids = $translate->getMessageIds();
print_r($messageids);

...
// あるいは指定した言語の ID を返します
$messageids = $translate->getMessageIds('en_US');
print_r($messageids);

...
// すべての翻訳データを返します
$source = $translate->getMessages();
print_r($source);
[1] 訳注: カンマ以外で区切ったら、もはや CSV でも何でもないのですが、 そのあたりはあまり気にしない方向で :-)
Previous Next
Introduction to Zend Framework
概要
インストール
Zend_Acl
導入
アクセス制御の洗練
高度な使用法
Zend_Auth
導入
データベースのテーブルでの認証
ダイジェスト認証
HTTP 認証アダプタ
LDAP 認証
Open ID 認証
Zend_Cache
導入
キャッシュの仕組み
Zend_Cache のフロントエンド
Zend_Cache のバックエンド
Zend_Captcha
Introduction
Captcha Operation
Captcha Adapters
Zend_Config
導入
動作原理
Zend_Config_Ini
Zend_Config_Xml
Zend_Console_Getopt
Getopt について
Getopt の規則の宣言
オプションおよび引数の取得
Zend_Console_Getopt の設定
Zend_Controller
Zend_Controller クイックスタート
Zend_Controller の基本
フロントコントローラ
リクエストオブジェクト
標準のルータ: Zend_Controller_Router_Rewrite
ディスパッチャ
アクションコントローラ
アクションヘルパー
レスポンスオブジェクト
プラグイン
モジュラーディレクトリ構造の規約の使用
MVC での例外
以前のバージョンからの移行
Zend_Currency
Zend_Currency について
通貨の操作方法
以前のバージョンからの移行
Zend_Date
導入
動作原理
基本メソッド
Zend_Date API の概要
日付の作成
日付関数全般用の定数
動作例
Zend_Db
Zend_Db_Adapter
Zend_Db_Statement
Zend_Db_Profiler
Zend_Db_Select
Zend_Db_Table
Zend_Db_Table_Row
Zend_Db_Table_Rowset
導入
Zend_Debug
変数の出力
Zend_Dojo
Introduction
Zend_Dojo_Data: dojo.data Envelopes
Dojo View Helpers
Dojo Form Elements and Decorators
Zend_Dom
導入
Zend_Dom_Query
Zend_Exception
例外の使用法
Zend_Feed
導入
フィードの読み込み
ウェブページからのフィードの取得
RSS フィードの使用
Atom フィードの使用
単一の Atom エントリの処理
フィードおよびエントリの構造の変更
独自のフィードクラスおよびエントリクラス
Zend_File
Zend_File_Transfer
Validators for Zend_File_Transfer
Zend_Filter
導入
標準のフィルタクラス群
フィルタチェイン
フィルタの書き方
Zend_Filter_Input
Zend_Filter_Inflector
Zend_Form
Zend_Form
Zend_Form クイックスタート
Zend_Form_Element を用いたフォーム要素の作成
Zend_Form によるフォームの作成
Zend_Form_Decorator による独自のフォームマークアップの作成
Zend Framework に同梱されている標準のフォーム要素
Zend Framework に同梱されている標準のデコレータ
Zend_Form の国際化
Zend_Form の高度な使用法
Zend_Gdata
Gdata について
AuthSub による認証
ClientLogin による認証
Google Calendar の使用法
Google Documents List Data API の使用法
Google Spreadsheets の使用法
Google Apps Provisioning の使用法
Google Base の使用法
YouTube Data API の使用法
Picasa Web Albums の使用法
Gdata の例外処理
Zend_Http
Zend_Http_Client - 導入
Zend_Http_Client - 高度な使用法
Zend_Http_Client - 接続アダプタ
Zend_Http_Cookie および Zend_Http_CookieJar
Zend_Http_Response
Zend_InfoCard
導入
Zend_Json
導入
基本的な使用法
JSON オブジェクト
XML から JSON への変換
Zend_Json_Server - JSON-RPC server
Zend_Layout
導入
Zend_Layout クイックスタート
Zend_Layout の設定オプション
Zend_Layout の高度な使用法
Zend_Ldap
導入
Zend_Loader
ファイルやクラスの動的な読み込み
プラグインのロード
Zend_Locale
導入
Zend_Locale の使用法
正規化および地域化
日付および時刻の扱い
ロケールがサポートする言語
ロケールがサポートする地域
Zend_Log
概要
ライター
フォーマッタ
フィルタ
Zend_Mail
導入
SMTP 経由での送信
SMTP 接続による複数のメールの送信
異なる転送手段の使用
HTML メール
ファイルの添付
受信者の追加
MIME バウンダリの制御
追加のヘッダ
文字セット
エンコーディング
SMTP 認証
セキュアな SMTP トランスポート
メールメッセージの読み込み
Zend_Measure
導入
計測値の作成
計測値の出力
計測値の操作
計測値の型
Zend_Memory
概要
メモリマネージャ
メモリオブジェクト
Zend_Mime
Zend_Mime
Zend_Mime_Message
Zend_Mime_Part
Zend_OpenId
導入
Zend_OpenId_Consumer の基本
Zend_OpenId_Provider
Zend_Paginator
Introduction
Usage
Configuration
Advanced usage
Zend_Pdf
導入
PDF ドキュメントの作成および読み込み
PDF ドキュメントへの変更内容の保存
ドキュメントのページ
描画
ドキュメントの情報およびメタデータ
Zend_Pdf モジュールの使用例
Zend_Registry
レジストリの使用法
Zend_Rest
導入
Zend_Rest_Client
Zend_Rest_Server
Zend_Search_Lucene
概要
インデックスの構築
インデックスの検索
クエリ言語
クエリ作成用の API
文字セット
拡張性
Java Lucene との相互運用
応用
ベストプラクティス
Zend_Server
導入
Zend_Server_Reflection
Zend_Service
導入
Zend_Service_Akismet
Zend_Service_Amazon
Zend_Service_Audioscrobbler
Zend_Service_Delicious
Zend_Service_Flickr
Zend_Service_Nirvanix
Zend_Service_ReCaptcha
Zend_Service_Simpy
導入
Zend_Service_StrikeIron
Zend_Service_StrikeIron: バンドルされているサービス
Zend_Service_StrikeIron: 応用編
Zend_Service_Technorati
Zend_Service_Yahoo
Zend_Session
導入
基本的な使用法
高度な使用法
グローバルセッションの管理
Zend_Session_SaveHandler_DbTable
Zend_Soap
Zend_Soap_Server
Zend_Soap_Client
WSDL Accessor
AutoDiscovery. Introduction
Class autodiscovering.
Functions autodiscovering.
Autodiscovering. Datatypes.
Zend_Test
Introduction
Zend_Test_PHPUnit
Zend_Text
Zend_Text_Figlet
Zend_TimeSync
導入
Zend_TimeSync の動作
Zend_Translate
導入
Zend_Translate のアダプタ
翻訳アダプタの使用法
Zend_Uri
Zend_Uri
Zend_Validate
導入
標準のバリデーションクラス群
バリデータチェイン
バリデータの書き方
Zend_Version
Zend Framework のバージョンの取得
Zend_View
導入
コントローラスクリプト
ビュースクリプト
ビューヘルパー
Zend_View_Abstract
Zend_Wildfire
Zend_Wildfire
Zend_XmlRpc
導入
Zend_XmlRpc_Client
Zend_XmlRpc_Server
Zend Framework のシステム要件
PHP のバージョン
PHP の拡張モジュール
Zend Framework のコンポーネント
Zend Framework の依存性
Zend Framework PHP 標準コーディング規約
概要
PHP ファイルの書式
命名規約
コーディングスタイル
著作権に関する情報