翻訳ヘルパー
ウェブサイトを複数言語で提供することもよくあります。
サイト上のコンテンツを翻訳するには、
Zend_Translate
を使用します。 Zend_Translate をビューと統合するために使用するのが
Translate ビューヘルパーです。
これ以降のすべての例では、単純は配列翻訳アダプタを使用します。
もちろん Zend_Translate の任意のインスタンスやお好みの
Zend_Translate_Adapter のサブクラスを使うことも可能です。
Translate ビューヘルパーのインスタンスを作成するにはいくつかの方法があります。
事前に Zend_Registry に登録済みのインスタンスを使用する
流れるようなインターフェイスで後から追加する
クラスのインスタンスの作成時に直接指定する
登録済みの Zend_Translate のインスタンスを使用する方法をおすすめします。
アダプタをレジストリに追加する際に、使用するロケールを選択できます。
ここで言語ではなくロケールと言っているのは、
言語には地域を含む可能性があるからです。
たとえば英語は様々な地域で話されています。
イギリス英語やアメリカ英語など複数の翻訳が存在します。
そこで、ここでは "言語" と言わずに "ロケール" としているのです。
登録済みのインスタンス
登録済みのインスタンスを使用するには、まず Zend_Translate あるいは
Zend_Translate_Adapter のインスタンスを作成し、
それを Zend_Registry に登録します。登録する際のキーとして
Zend_Translate を使用します。
'array',
'content' => array('simple' => 'einfach'),
'locale' => 'de'
)
);
Zend_Registry::set('Zend_Translate', $adapter);
// ビューの中で
echo $this->translate('simple');
// これは 'einfach' を返します
]]>
流れるようなインターフェイスのほうがなじみがあるという場合は、
ビューの中でインスタンスを作成し、ヘルパーのインスタンスは後で作成することもできます。
ビューの中で
流れるようなインターフェイスで Zend_Translate あるいは
Zend_Translate_Adapter のインスタンスを作成するには、
パラメータを指定せずにヘルパーをコールし、それから
setTranslator() メソッドをコールします。
'array',
'content' => array('simple' => 'einfach'),
'locale' => 'de'
)
);
$this->translate()->setTranslator($adapter)->translate('simple');
// これは 'einfach' を返します
]]>
ヘルパーを Zend_View なしで使用すると、
ヘルパーを直接使用することもできます。
直接使用する方法
'array',
'content' => array('simple' => 'einfach'),
'locale' => 'de'
)
);
// アダプタを初期化します
$translate = new Zend_View_Helper_Translate($adapter);
print $translate->translate('simple'); // これは 'einfach' を返します
]]>
Zend_View は使わないけれど、
翻訳した結果がほしいという場合にこの方式を使用します。
これまで見てきたように、translate() メソッドは翻訳を返します。
翻訳アダプタのメッセージ ID を指定してこれをコールします。
さらに、翻訳文字列の中のパラメータを置換することも可能です。
パラメータの値を指定する方法には二通りあります。
パラメータのリストを指定する方法か、あるいはパラメータの配列を指定する方法です。
たとえば次のようになります。
単一のパラメータ
単一のパラメータを使用するには、単にそれをメソッドに追加します。
translate("Today is %1\$s", $date);
// これは 'Heute ist Monday' を返します
]]>
パラメータの値にテキストを使用する場合は、
このパラメータの値も翻訳しなければならないことに注意しましょう。
パラメータのリスト
パラメータのリストを使用して、それをメソッドに追加することもできます。
translate("Today is %1\$s in %2\$s. Actual time: %3\$s",
$date,
$month,
$time);
// これは 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' を返します
]]>
パラメータの配列
パラメータの配列を使用して、それをメソッドに追加することもできます。
translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// これは 'Heute ist Monday in April. Aktuelle Zeit: 11:20:55' を返します
]]>
翻訳のロケールを変更しなければならないこともあるでしょう。
翻訳単位で動的に変更することもできますが、
静的に変更してそれ以降のすべての翻訳に適用させることもできます。
そして、パラメータリスト型あるいはパラメータ配列型のどちらの形式でもそれを使用できます。
どひらの形式の場合も、ロケールは最後のパラメータとして指定します。
ロケールの動的な変更
translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date, 'it');
]]>
この例は、指定したメッセージ ID に対応するイタリア語の翻訳を返します。
しかし、イタリア語を返すのはこのときだけです。
次の翻訳では、アダプタに設定されているロケールを使用します。
通常は、使用したいロケールを翻訳アダプタに設定してからレジストリに追加します。
しかし、ロケールの設定をヘルパー内で行うこともできます。
ロケールの静的な変更
translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
]]>
上の例では新しいデフォルトロケールとして 'it'
を設定しており、これ以降の翻訳ではこのロケールを使用します。
もちろん、現在設定されているロケールを取得するためのメソッド
getLocale() もあります。
現在設定されているロケールの取得
translate()->getLocale();
$this->translate()->setLocale('it');
$this->translate("Today is %1\$s in %2\$s. Actual time: %3\$s", $date);
// 新たに設定されたデフォルトロケールである 'it' を返します
$this->translate()->getLocale();
]]>