Zend_Locale は、各ロケールについての情報も、
自分自身のロケールに合わせた形式で提供します。
たとえば他のロケールの名前や曜日名、月名などがこれにあたります。
オブジェクトのクローンを作成し、
ロケールオブジェクトを正確かつ効率的に複製することができます。
ロケール対応のメソッドのほとんどは、$locale->toString()
が返す文字列表現のロケールを受け付けます。
例 18.8. clone
<?php
require_once 'Zend/Locale.php';
$locale = new Zend_Locale('ar');
// $locale オブジェクトをシリアライズして保存します
$serializedLocale = $locale->serialize();
// もとのオブジェクトを再度作成します
$localeObject = unserialize($serializedLocale);
// ロケールの文字列表記を取得します
$stringLocale = $locale->toString();
// $local オブジェクトの複製を作成します
$copiedLocale = clone $locale;
print "copied: ", $copiedLocale->toString();
print "copied: ", $copiedLocale; // PHP は、__toString() 経由で自動的に toString() をコールします
?>
Zend_Locale は、
二つのロケールを比較するための便利な関数も提供しています。
ロケール対応のクラスはすべて、これと同等の同一性チェック機能を提供しなければなりません。
getDefault() メソッドは、関連するロケールの配列を返します。
これは、ユーザのウェブブラウザからの情報 (取得できる場合)、
ホストサーバの環境変数および ZF の設定をもとに取得します。
Zend_Locale のコンストラクタの最初のパラメータで、
(BROWSER、ENVIRONMENT あるいは FRAMEWORK のうちの)
どの情報を優先するかを選択します。
二番目のパラメータでは、マッチしたロケールをすべて返すのか
あるいは最初にマッチした/一番マッチしたものを返すのかを指定します。
ロケール対応のコンポーネントは、通常は最初のロケールのみを使用します。
優先度が指定されている場合は、それも考慮します。
例 18.10. デフォルトロケールの取得
<?php require_once 'Zend/Locale.php'; $locale = new Zend_Locale(); // すべてのデフォルトロケールを返します $found = $locale->getDefault(); print_r($found); // ブラウザのロケールのみを返します $found2 = $locale->getDefault(Zend_Locale::BROWSER,TRUE); print_r($found2); ?>
BROWSER、ENVIRONMENT あるいは FRAMEWORK
のいずれかに対応するデフォルトロケールを取得するには、
それぞれ対応するメソッドを使用します。
getEnvironment()
getBrowser()
getLocale()
新しいロケールを設定するには、関数 setLocale()
を使用します。この関数は、ロケール文字列をパラメータとして受け取ります。
ロケールを省略した場合は、ロケールが
自動的に選択
されます。Zend_Locale オブジェクトは "light"
なので、このメソッドは既存のインスタンスを参照しているすべてのコードに影響をおよぼします。
getLanguage() を使用して、二文字の言語コード文字列を
ロケール識別文字列から取得します。また、
getRegion() を使用して、二文字の地域コード文字列を
ロケール識別文字列から取得します。
getTranslationList() を使用すると、地域化された情報を利用することができます。
これらの情報は、各地域に特化したデータを顧客に対して提供する際に
翻訳の必要がなくなるので便利です。
これらはすでに使用可能となっています。
すべての言語についてこの情報を取得できます。しかし、 言語によってはすべての情報が提供されているわけではないものもあります。 これらの型のいくつかについては、その型に特化した関数を用意して簡単に使用できるようにしています。 詳細はこの一覧を参照ください。
表 18.1. getTranslationList($type = null, $locale = null) の詳細
| 型 | 特化した関数 | 説明 | 完全性 |
|---|---|---|---|
| Language | getLanguageTranslationList | 地域化された全言語の一覧 | 完全 |
| Script | getScriptTranslationList | 地域化された全文字の一覧 | 完全 |
| Country | getCountryTranslationList | 地域化された全国名の一覧 | 完全 |
| Territory | getTerritoryTranslationList | 地域化された全領域の一覧 | 完全 |
| Calendar | 地域化された全ての暦の一覧 | 完全 | |
| Month | 地域化された全月名の一覧 | 完全 | |
| Month_short | 地域化された全月名 (通常 2 文字から 4 文字の短縮形) の一覧 | 完全 | |
| Month_narrow | 地域化された全月名 (通常 1 文字の短縮形) の一覧 | 完全 | |
| Day | 地域化された全ての曜日名の一覧 | 完全 | |
| Day_short | 地域化された全ての曜日名 (通常 2 文字から 4 文字の短縮形) の一覧 | 完全 | |
| Day_narrow | 地域化された全ての曜日名 (通常 1 文字の短縮形) の一覧 | 完全 | |
| Dateformat | 地域化された全ての日付書式の一覧 | 完全 | |
| Timeformat | 地域化された全ての時刻書式の一覧 | 完全 | |
| Timezone | 地域化された全てのタイムゾーンの一覧 | 不完全、言語によって異なります | |
| Currency | 地域化された全ての通貨の一覧 | 不完全、言語によって異なります | |
| Currency_sign | 地域化された全ての通貨記号の一覧 | 不完全、言語によって異なります | |
| Currency_detail | 地域化された、全ての国とその国で用いられる通貨の一覧 | 完全 | |
| Territory_detail | 地域化された、全ての領域とその領域内の国の一覧 | 完全 | |
| Language_detail | 地域化された、全ての国とその国で用いられる言語の一覧 | 完全 | |
| Characters | このロケールでの既知の文字の一覧を表す正規表現 | 完全 |
単一の翻訳データがほしい場合は、getTranslationList() ではなく getTranslation()
を使用します。この関数は文字列あるいは配列を返します。これは、返り値が複数となりえる (たとえば language_detail
など。というのも、ひとつの言語が複数の国で用いられることもあるからです) か、あるいはひとつにしかなりえない
(たとえば language など。言語に対応する翻訳はひとつしかありません) によって決まります。これらの両方の関数で、
上のリストの型を使用できます。利便性のため、以下のような関数も用意しています。これは上のふたつの関数と等価です。
例 18.12. getTranslation() 系の便利な関数
<?php getCountryTranslation($what, $locale = null) getCountryTranslationList($locale = null) getLanguageTranslation($what, $locale = null) getLanguageTranslationList($locale = null) getScriptTranslation($what, $locale = null) getScriptTranslationList($locale = null) getTerritoryTranslation($what, $locale = null) getTerritoryTranslationList($locale = null) ?>
以下の例は、さまざまな言語でのものの名前を取得する方法を示すものです。
例 18.13. getTranslationList
<?php
require_once 'Zend/Locale.php';
$locale = new Zend_Locale('en_US');
// すべての国名をドイツ語で表示します
print_r($locale->getTranslationList('country', 'de'));
?>
次の例は、ある言語の名前を別の言語でどのようにいうのかを、 二文字の CLDR 国コードを知らない場合に調べるものです。
例 18.14. 国の名前を、ある言語から別の言語に変換する
<?php
require 'Zend/Locale.php';
$locale = new Zend_Locale('en_US');
$code2name = $locale->getLanguageTranslationList();
$name2code = array_flip($code2name);
$frenchCode = $name2code['French'];
echo $locale->getLanguageTranslation($frenchCode, 'de_AT');
// 出力は、「フランス語」を表すドイツ語の名前になります
?>
何ができるのかをもう少し詳しく知るには、次の例の出力を確認してみましょう。
例 18.15. 使用できるすべての翻訳
<?php
// すべての翻訳の一覧を取得します
$lists = $locale->getTranslationList();
// 使用できるすべての翻訳を表示します (大量に出力されます。すべて英語で表示されます)
foreach ($lists as $list) {
echo "List $list = ";
print_r($locale->getTranslationList($list));
}
?>
Zend_Locale で使用できるすべての言語の一覧を、それぞれの言語での表記で取得するには、
以下の例をウェブページで使用してみましょう
同様に getCountryTranslationList() および
getRegionDisplay() を使用すると、
あなたのネイティブ言語での地域名と別の言語での地域名の対応表を作成できます。
また、getCalendarTranslationList() および
getCalendarDisplay() も同様に動作します。
try .. catch ブロックで、
存在しないロケールを使用した場合の例外を処理するようにしましょう。
すべての言語がすべてのロケールに対応しているわけではありません。
この例では、例外を無視することで、
スクリプトが途中で終わってしまうことを防いでいます。
例 18.16. すべての言語を、その国のネイティブ言語で書き出す
<?php
require_once 'Zend/Locale.php';
$sourceLanguage = null; // あなたのネイティブ言語のコードを設定します
$locale = new Zend_Locale($sourceLanguage);
$list = $locale->getLanguageTranslationList();
foreach($list as $language => $content) {
try {
$output = $locale->getLanguageDisplay($language, $language);
if (is_string($output)) {
print "\n<br>[".$language."] ".$output;
}
} catch (Exception $e) {
continue;
}
}
?>
プログラム上で、ユーザに "はい" あるいは "いいえ"
で答えてもらうことがよくあります。
getQuestion() を使用すると、
ユーザに問い合わせるときに使用する単語あるいは正規表現文字列を含む配列を、
特定の $locale (デフォルトは、そのオブジェクトのロケール)
にあわせて返します。この配列には六つの要素が含まれます。それぞれが
"はい"、"いいえ" とその省略形、
そして適切にパースするための正規表現文字列を表します。
以下の例を参照ください。
例 18.17. getQuestion()
<?php
require_once 'Zend/Locale.php';
$locale = new Zend_Locale();
// 設問の文字列
print_r($locale->getQuestion('de'));
- - - 出力 - - -
Array
(
[yes]ja[/yes]
[no]nein[/no]
[yesabbr]j[/yesabbr]
[noabbr]n[/noabbr]
[yesexpr]^([yY]([eE][sS])?)|([jJ][aA]?)[/yesexpr]
[noexpr]^([nN]([oO]|([eE][iI][nN]))?)[/noexpr]
)
?>