# Zend_Locale の使用法

注意：このドキュメントでは、英語版のリビジョン 22755 の更新内容をスキップしています。

Zend_Locale は、各ロケールについての情報も、 自分自身のロケールに合わせた形式で提供します。 たとえば他のロケールの名前や曜日名、月名などがこれにあたります。

## ロケールオブジェクトのコピー、クローン作成およびシリアライズ

オブジェクトのクローンを作成し、 ロケールオブジェクトを正確かつ効率的に複製できます。 ロケール対応のメソッドのほとんどは、`$locale->toString()` が返す文字列表現のロケールを受け付けます。

clone

    $locale = new Zend_Locale('ar');

    // $locale オブジェクトをシリアライズして保存します
    $serializedLocale = $locale->serialize();
    // もとのオブジェクトを再度作成します
    $localeObject = unserialize($serializedLocale);

    // ロケールの文字列表記を取得します
    $stringLocale = $locale->toString();

    // $local オブジェクトの複製を作成します
    $copiedLocale = clone $locale;

    print "copied: ", $copiedLocale->toString();

    // PHP は、__toString() 経由で自動的に toString() をコールします
    print "copied: ", $copiedLocale;

## 等式

Zend_Locale は、 二つのロケールを比較するための便利な関数も提供しています。 ロケール対応のクラスはすべて、これと同等の同一性チェック機能を提供しなければなりません。

ロケールが同一かどうかの調査

    $locale = new Zend_Locale();
    $mylocale = new Zend_Locale('en_US');

    // ロケールが同一かどうかを調べます
    if ($locale->equals($mylocale)) {
        print "これらのロケールは同一です";
    }

## デフォルトのロケール

getDefault() メソッドは、関連するロケールの配列を返します。 これは、ユーザのウェブブラウザからの情報 (取得できる場合)、 ホストサーバの環境変数および Zend Framework の設定をもとに取得します。 Zend_Locale のコンストラクタの最初のパラメータで、 (`BROWSER`、`ENVIRONMENT` あるいは `FRAMEWORK` のうちの) どの情報を優先するかを選択します。 二番目のパラメータでは、マッチしたロケールをすべて返すのか あるいは最初にマッチした/一番マッチしたものを返すのかを指定します。 ロケール対応のコンポーネントは、通常は最初のロケールのみを使用します。 優先度が指定されている場合は、それも考慮します。

デフォルトロケールの取得

    $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() を使用します。この関数は、ロケール文字列をパラメータとして受け取ります。 ロケールを省略した場合は、ロケールが 自動的に選択 されます。

setLocale

    $locale = new Zend_Locale();

    // 実際のロケール
    print $locale->toString();

    // 新しいロケール
    $locale->setLocale('aa_DJ');
    print $locale->toString();

## 言語および地域の取得

getLanguage() を使用して、二文字の言語コード文字列を ロケール識別文字列から取得します。また、 getRegion() を使用して、二文字の地域コード文字列を ロケール識別文字列から取得します。

getLanguage および getRegion

    $locale = new Zend_Locale();

    // ロケールが 'ja_JP' の場合は、'ja' が言語として返されます
    print $locale->getLanguage();

    // ロケールが 'ja_JP' の場合は、地域として 'JP' が返されます
    print $locale->getRegion();

## 領域を指定してロケールを取得

When you only have the territory or country then it's also possible to get a locale from that information. You can manually search if there is a locale for this territory by using getLocaleToTerritory(). This method returns a locale for the given territory or `NULL` when there was has no locale been found.

getLocaleToTerritory

    $locale = Zend_Locale::getLocaleToTerritory('US');
    // returns 'en_US'

Uppercase territories

When you know that you are using a territory, then you should uppercase it. Otherwise you could get an in your eyes false locale in return when you use other methods. For example: When you give "om" then getLocaleToTerritory() returns you "ar_OM" as it knows that you mean a territory. But all other methods will return "om", as it's also a language.

So when you know that the given string is a territory, eighter use getLocaleToTerritory() yourself before creating a locale, or uppercase the input.

## 地域化された文字列の取得

getTranslationList() を使用すると、地域化された情報を利用できます。 これらの情報は、各地域に特化したデータを顧客に対して提供する際に 翻訳の必要がなくなるので便利です。 これらはすでに使用可能となっています。

情報の一覧は、常に連想配列形式で返されます。 複数の値を明示的な型に渡したい場合は、複数の値ではなく配列を渡す必要があります。

getTranslationList

    $list = Zend_Locale::getTranslationList('language', 'de_AT');

    print_r ($list);
    // キーと値の組み合わせの例...
    // [de] -> Deutsch
    // [en] -> Englisch

    // これらのキーのいずれかを getTranslation() メソッドで使用します
    print Zend_Locale::getTranslation('de', 'language', 'zh');
    // これは、言語 'de' を中国語で表した文字列を返します

すべての言語についてこの情報を取得できます。しかし、 言語によってはすべての情報が提供されているわけではないものもあります。 これらの型のいくつかについては、その型に特化した関数を用意して簡単に使用できるようにしています。 詳細はこの一覧を参照ください。

getTranslationList($type = null, $locale = null, $value = null) の詳細

型 | 説明
--- | ---
Language | 地域化された全言語の一覧を返します。 ロケールの言語部分がキー、そしてその翻訳が値となります。
Script | 地域化された全文字の一覧を返します。 ロケールの文字部分がキー、そしてその翻訳が値となります。
Territory | 地域化された全領域の一覧を返します。 ここに含まれるのは国と大陸、領域です。 領域と大陸のみを取得するには値として '1' を使用します。 国のみを取得するには値として '2' を使用します。 可能な場合、ロケールの国部分をキーとして使用します。 それ以外の場合は、この領域が使用している公式 ISO コードをキーとして使用します。 領域を翻訳したものが値となります。 値を省略した場合は、両方の一覧を取得します。
Variant | 地域化された文字変化形の一覧を返します。 変化形がキー、そしてその翻訳が値となります。
Key | 地域化されたキーの一覧を帰します。 このキーは、翻訳に使用する一般的な値となります。 通常はカレンダーや文字照合、通貨などです。 キーが配列のキー、そしてその翻訳が値となります。
Type | 翻訳されたキーの型の一覧を返します。 これらは、カレンダーの表現や文字列照合方式を表します。 値として 'collation' を使用すると、文字列照合方式の一覧を取得します。 値として 'calendar' を使用すると、カレンダーの型の一覧を取得します。 値を省略した場合は、両方の一覧を取得します。 型がキー、そしてその翻訳が値となります。
Layout | 特別なテキスト部分の書式を決めるルールの一覧を返します。
Characters | このロケールで使用できる文字の一覧を返します。
Delimiters | このロケールで使用できるクォート文字の一覧を返します。
Measurement | 単位の値の一覧を返します。この一覧は廃止予定です。
Months | このロケールにおけるすべての月の表現の一覧を返します。 異なる表現方式がある場合は配列として返されます。 値を省略すると、グレゴリオ暦におけるすべての月の一覧を返します。 値として、既知の暦の名前を指定できます。 その場合は指定した暦における月の一覧を返します。 単純に行うには Zend_Date を使用します。
Month | このロケールにおけるすべての月名の一覧を返します。 値を省略すると、グレゴリオ暦で通常使用する完全な月名を返します。 各月の数値がキー、そして月名の翻訳が値となります。 値として配列を指定すると、さまざまな暦や書式に対応する月を取得できます。 配列の最初のエントリが暦、2 番目は使用するコンテキスト、 そして 3 番目が返す幅となります。 単純に行うには Zend_Date を使用します。
Days | このロケールにおけるすべての曜日の表現の一覧を返します。 異なる表現方式がある場合は配列として返されます。 値を省略すると、グレゴリオ暦におけるすべての曜日の一覧を返します。 値として、既知の暦の名前を指定できます。 その場合は指定した暦における曜日の一覧を返します。 単純に行うには Zend_Date を使用します。
Day | このロケールにおけるすべての曜日名の一覧を返します。 値を省略すると、グレゴリオ暦で通常使用する完全な曜日名を返します。 英語の各曜日名の略称がキー、そして曜日名の翻訳が値となります。 値として配列を指定すると、さまざまな暦や書式に対応する曜日を取得できます。 配列の最初のエントリが暦、2 番目は使用するコンテキスト、 そして 3 番目が返す幅となります。 単純に行うには Zend_Date を使用します。
Week | ロケール内で週の計算を適切に行うための値の一覧を返します。 単純に行うには Zend_Date を使用します。
Quarters | このロケールにおけるすべての四半期の表現の一覧を返します。 異なる表現方式がある場合は配列として返されます。 値を省略すると、グレゴリオ暦におけるすべての四半期の一覧を返します。 値として、既知の暦の名前を指定できます。 その場合は指定した暦における四半期の一覧を返します。
Quarter | このロケールにおけるすべての四半期名の一覧を返します。 値を省略すると、グレゴリオ暦で通常使用する完全な四半期名を返します。 四半期番号がキー、そして四半期名の翻訳が値となります。 値として配列を指定すると、さまざまな暦や書式に対応する四半期を取得できます。 配列の最初のエントリが暦、2 番目は使用するコンテキスト、 そして 3 番目が返す幅となります。
Eras | このロケールにおけるすべての紀元の表現の一覧を返します。 値を省略すると、グレゴリオ暦におけるすべての紀元の一覧を返します。 値として、既知の暦の名前を指定できます。 その場合は指定した暦における紀元の一覧を返します。
Era | このロケールにおけるすべての紀元名の一覧を返します。 値を省略すると、グレゴリオ暦で通常使用する完全な紀元名を返します。 紀元番号がキー、そして紀元名の翻訳が値となります。 値として配列を指定すると、さまざまな暦や書式に対応する紀元を取得できます。 配列の最初のエントリが暦、 そして 2 番目が返す幅となります。
Date | このロケールにおけるすべての日付フォーマットの一覧を返します。 使用する日付フォーマットの名前がキー、そしてフォーマットそのものが値となります。 値を省略すると、グレゴリオ暦における日付フォーマットの一覧を返します。 暦の名前を指定すると、さまざまな暦に対応する日付フォーマットを取得できます。 単純に行うには Zend_Date を使用します。
Time | このロケールにおけるすべての時刻フォーマットの一覧を返します。 使用する時刻フォーマットの名前がキー、そしてフォーマットそのものが値となります。 値を省略すると、グレゴリオ暦における時刻フォーマットの一覧を返します。 暦の名前を指定すると、さまざまな暦に対応する時刻フォーマットを取得できます。 単純に行うには Zend_Date を使用します。
DateTime | このロケールにおけるすべての日付-時刻フォーマットの一覧を返します。 使用する日付-時刻フォーマットの名前がキー、そしてフォーマットそのものが値となります。 値を省略すると、グレゴリオ暦における日付-時刻フォーマットの一覧を返します。 暦の名前を指定すると、さまざまな暦に対応する日付-時刻フォーマットを取得できます。 単純に行うには Zend_Date を使用します。
DateItem | 指定した日付項目あるいは時刻項目に関するデフォルトフォーマットの一覧を返します。
DateInterval | 間隔を表示したい際に使用する日付・時刻フォーマットの一覧を返します。 この一覧は多次元配列です。最初の配列が間隔の書式、 その次の配列が最大の差のトークンとなります。
Field | 地域化した日付フィールドの一覧を返します。 これは、カレンダーや日付で 'month' や 'year' といった文字列を各国語で表示する際に使用します。 値を省略すると、グレゴリオ暦における一覧を返します。 暦の名前を指定すると、さまざまな暦に対応する一覧を取得できます。
Relative | 地域化した相対日付の一覧を返します。 'yesterday' や 'tomorrow' といった文字列を各国語で表示する際に使用します。 値を省略すると、グレゴリオ暦における一覧を返します。 暦の名前を指定すると、さまざまな暦に対応する一覧を取得できます。
Symbols | 数値表現に使用する文字の地域化した一覧を返します。
NameToCurrency | 地域化した通貨名の一覧を返します。 通貨がキー、そして通貨名の翻訳が値となります。 Zend_Currency を使用します。
CurrencyToName | 地域化した通貨名に対応する通貨の一覧を返します。 通貨名の翻訳がキー、そして通貨が値となります。 単純に行うには Zend_Currency を使用します。
CurrencySymbol | 通貨に対応する地域化した通貨記号の一覧を返します。 通貨がキー、そして記号が値となります。 単純に行うには Zend_Currency を使用します。
Question | 肯定 ('yes') および否定 ('no') に対応する地域化した文字列の一覧を返します。 単純に行うには Zend_Locale の getQuestion メソッド を使用します。
CurrencyFraction | 通貨に対応する小数部の桁数を返します。 通貨がキー、そして小数部の桁数が値となります。 単純に行うには Zend_Currency を使用します。
CurrencyRounding | 通貨に対応する丸め方式の一覧を返します。 通貨がキー、そして丸め方式が値となります。 単純に行うには Zend_Currency を使用します。
CurrencyToRegion | その地域で使用する通貨の一覧を返します。 `ISO3166` の値 ('region') が配列のキー、そして `ISO4217` の値 ('currency') が配列の値となります。 単純に行うには Zend_Currency を使用します。
RegionToCurrency | その通貨を使用している地域の一覧を返します。 `ISO4217` の値 ('currency') が配列のキー、そして `ISO3166` の値 ('region') が配列の値となります。 通貨が複数の地域で使用されている場合は、 空白で区切った形式になります。 単純に行うには Zend_Currency を使用します。
RegionToTerritory | その国の領域一覧あるいはその領域に含まれるサブ領域の一覧を返します。 その通貨を使用している地域と領域の一覧を返します。 ISO の領域コード ('currency') が配列のキー、そして `ISO3166` の値 ('region') が配列の値となります。 領域が複数の地域を含む場合は、 空白で区切った形式になります。
TerritoryToRegion | 地域とその地域が存在する領域の一覧を返します。 `ISO3166` のコード ('region') が配列のキー、 そして ISO の領域コード ('territory') が配列の値となります。 地域が複数の領域にまたがる場合は、 空白で区切った形式になります。
ScriptToLanguage | その国で使用する文字の一覧を返します。 言語コードが配列のキー、そして文字コードが配列の値となります。 言語が複数の文字を含む場合は、 空白で区切った形式になります。
LanguageToScript | ある文字を使用する言語の一覧を返します。 文字コードが配列のキー、そして言語コードが配列の値となります。 文字が複数の言語で用いられる場合は、 空白で区切った形式になります。
TerritoryToLanguage | 言語及び話される国の一覧を返します。 言語コードが配列のキー、そして国コードが配列の値となります。 ある言語が複数の国で用いられる場合は、 空白で区切った形式になります。
LanguageToTerritory | 国と、その国で話されている言語の一覧を返します。 国コードが配列のキー、そして言語コードが配列の値となります。 ある領域で複数の言語が話される場合は、 空白で区切った形式になります。
TimezoneToWindows | Windows のタイムゾーンと、関連する ISO タイムゾーンの一覧を返します。 Windows のタイムゾーンが配列のキー、 そして ISO タイムゾーンが配列の値となります。
WindowsToTimezone | ISO タイムゾーンと、関連する Windows のタイムゾーンの一覧を返します。 ISO タイムゾーンが配列のキー、 そして Windows のタイムゾーンが配列の値となります。
TerritoryToTimezone | 地域あるいは領域と、関連する ISO タイムゾーンの一覧を返します。 ISO タイムゾーンが配列のキー、そして領域コードが配列の値となります。
TimezoneToTerritory | タイムゾーンと、関連する地域あるいは領域コードの一覧を返します。 地域コードあるいは領域コードが配列のキー、 そして ISO タイムゾーンが配列の値となります。
CityToTimezone | 地域化した都市名の一覧を返します。 これを用いて、関連するタイムゾーンの翻訳を行います。 すべてのタイムゾーンが翻訳できるわけではありませんが、 ユーザにとっては ISO タイムゾーン名よりも 母国語で書かれた都市名のほうがわかりやすいでしょう。 ISO タイムゾーンが配列のキー、そして都市名の翻訳が配列の値となります。
TimezoneToCity | 地域化した都市名に対応するタイムゾーンの一覧を返します。 地域化した都市名が配列のキー、 そして ISO タイムゾーンが配列の値となります。
PhoneToTerritory | 領域内で使用されている電話コードの一覧を返します。 領域 (地域) が配列のキー、 そして電話コードが配列の値となります。
TerritoryToPhone | 電話コードが使用されている領域の一覧を返します。 電話コードが配列のキー、 そして領域 (地域) が配列の値となります。 ある電話コードが複数の領域で使用されている場合は、 空白で区切った形式になります。
NumericToTerritory | 領域内で使用されている 3 桁の数値コードの一覧を返します。 領域 (地域) が配列のキー、 そして 3 桁の数値コードが配列の値となります。
TerritoryToNumeric | 3 桁の数値コードに対応する領域の一覧を返します。 3 桁の数値コードが配列のキー、 そして領域 (地域) が配列の値となります。
Alpha3ToTerritory | 領域内で使用されている 3 桁の文字コードの一覧を返します。 領域 (地域) が配列のキー、 そして 3 桁の文字コードが配列の値となります。
TerritoryToAlpha3 | 3 桁の文字コードに対応する領域の一覧を返します。 3 桁の文字コードが配列のキー、 そして領域 (地域) が配列の値となります。
PostalToTerritory | その郵便番号が使われている領域の一覧を正規表現で返します。 ISO 領域コード ('territory') が配列のキー、 そして正規表現が配列の値となります。
NumberingSystem | 桁表記に使用する文字の一覧を返します。
FallbackToChar | よく使われる unicode 文字の置換用文字の一覧を返します。 これを使用して、たとえば "©" を "(C)" に置換したりします。
CharToFallback | よく使われる置換用文字に対応する unicode 文字の一覧を返します。 これを使用して、たとえば "(C)" を "©" に置換したりします。
LocaleUpgrade | ロケールの依存性の一覧を返します。 これを使用して、言語を完全修飾形式のロケールに変換します。
Unit | 地域化したカレンダーの単位の一覧を帰します。 これを使用して、"day" や "month" などといった文字列を自動的に翻訳します。

単一の翻訳データがほしい場合は、getTranslation() を使用します。 この関数は常に文字列を返しますが、getTranslationList() メソッドよりも多くの型を使用できます。 また、値についても一点を除いて同じです。 取得したい値について、詳細を指定する必要があります。

ほとんどすべての場合について値を指定する必要があるので、 このパラメータを最初に指定するようになっています。 この点は getTranslationList() メソッドと異なります。

詳細な情報は、次の表を参照ください。

getTranslation($value = null, $type = null, $locale = null) の詳細

型 | 説明
--- | ---
Language | 言語の翻訳を返します。 希望通りの翻訳を選択するために、言語コードを値として指定する必要があります。
Script | 文字の翻訳を返します。 希望通りの翻訳を選択するために、文字コードを値として指定する必要があります。
Territory あるいは Country | 領域の翻訳を返します。 これは国、大陸および領域のいずれかとなります。 希望通りの翻訳を選択するために、領域コードを値として指定する必要があります。
Variant | 文字の変化形の翻訳を返します。 希望通りの翻訳を選択するために、変化形コードを値として指定する必要があります。
Key | 既知のキーの翻訳を返します。 このキーは、翻訳で使用する一般的な値です。 通常はカレンダーや文字照合、通貨などです。 希望通りのキーを選択するために、キーコードを値として指定する必要があります。
DefaultCalendar | 指定したロケールにおけるデフォルトの暦を返します。 ほとんどのロケールでは、これは 'gregorian' (グレゴリオ暦) となります。 単純に行うには Zend_Date を使用します。
MonthContext | 指定した暦で用いる月のデフォルトコンテキストを返します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
DefaultMonth | 指定した暦で用いる月のデフォルトフォーマットを返します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
Month | 月の翻訳を返します。 月を表す数値を値として指定する必要があります。 これは 1 から 12 までの数値となります。 他の暦、コンテキスト、フォーマットのデータを取得したい場合は、 値として整数値ではなく配列を指定します。 この配列の形式は `array( 'calendar', 'context', 'format', 'month number')` となります。整数値のみを指定した場合のデフォルトは、 暦が 'gregorian'、コンテキストが 'format' そしてフォーマットが 'wide' となります。 単純に行うには Zend_Date を使用します。
DayContext | 指定した暦で用いる日のデフォルトコンテキストを返します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
DefaultDay | 指定した暦で用いる曜日のデフォルトフォーマットを返します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
Day | 曜日の翻訳を返します。 英語での曜日の省略名 ('sun', 'mon', など) を値として指定する必要があります。 他の暦、コンテキスト、フォーマットのデータを取得したい場合は、 値として文字列ではなく配列を指定します。 この配列の形式は `array('calendar', 'context', 'format', 'day abbreviation')` となります。文字列のみを指定した場合のデフォルトは、 暦が 'gregorian'、コンテキストが 'format' そしてフォーマットが 'wide' となります。 単純に行うには Zend_Date を使用します。
Quarter | 四半期の翻訳を返します。 四半期を表す数値を値として指定する必要があります。 これは 1 から 4 までの数値となります。 他の暦、コンテキスト、フォーマットのデータを取得したい場合は、 値として数値ではなく配列を指定します。 この配列の形式は `array('calendar', 'context', 'format', 'quarter number')` となります。文字列のみを指定した場合のデフォルトは、 暦が 'gregorian'、コンテキストが 'format' そしてフォーマットが 'wide' となります。
Am | そのロケールにおける 'AM' の翻訳を返します。 他の暦の値を取得したい場合は、その暦を文字列で指定します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
Pm | そのロケールにおける 'PM' の翻訳を返します。 他の暦の値を取得したい場合は、その暦を文字列で指定します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
Era | そのロケールにおける紀元の翻訳を返します。 紀元番号を文字列あるいは整数値で指定します。 他の暦やフォーマットの値を取得したい場合は、 値として数値ではなく配列を指定します。 この配列の形式は `array('calendar', 'format', 'era number')` となります。文字列のみを指定した場合のデフォルトは、 暦が 'gregorian'、コンテキストが 'format' そしてフォーマットが 'wide' となります。
DefaultDate | 指定した暦で用いる日のデフォルトフォーマットを返します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
Date | そのロケールにおける、指定した暦あるいはフォーマットでの日のフォーマットを返します。 値を省略した場合は、暦が 'gregorian'、フォーマットが 'medium' となります。 文字列を指定した場合は、暦が 'gregorian' でフォーマットが指定したものとなります。 `array('calendar', 'format')` のような配列を指定することもできます。 単純に行うには Zend_Date を使用します。
DefaultTime | 指定した暦で用いる時刻のデフォルトフォーマットを返します。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
Time | そのロケールにおける、指定した暦あるいはフォーマットでの時刻のフォーマットを返します。 値を省略した場合は、暦が 'gregorian'、フォーマットが 'medium' となります。 文字列を指定した場合は、暦が 'gregorian' でフォーマットが指定したものとなります。 `array('calendar', 'format')` のような配列を指定することもできます。 単純に行うには Zend_Date を使用します。
DateTime | そのロケールにおける日付、時刻のフォーマットを返します。 これは、指定した暦において日付と時刻を表示する方法を示すものです。 値を省略した場合はグレゴリオ暦を使用します。 単純に行うには Zend_Date を使用します。
DateItem | 指定した日付項目あるいは時刻項目に関するデフォルトフォーマットを返します。
DateInterval | 指定した日付・時刻フォーマットの間隔フォーマットを返します。 最初の値は暦のフォーマットで、通常は 'gregorian' となります。 二番目の値は間隔フォーマットで、 三番目の値は最大の差のトークンです。 たとえば、array('gregorian', 'yMMMM', 'y') は間隔フォーマット 'yMMMM' で、最大の差は 'y' となります。
Field | 日付フィールドの翻訳を返します。 これは、カレンダーや日付で 'month' や 'year' といった文字列を各国語で表示する際に使用します。 返したいフィールドを文字列で指定する必要があります。 この場合はグレゴリオ暦を使用します。 他の暦におけるフィールドを取得するには、 `array('calendar', 'date field')` のような配列を指定します。
Relative | 相対日付の翻訳を返します。 'yesterday' や 'tomorrow' といった文字列を各国語で表示する際に使用します。 返したい日付を表す数値 (明日を基準とした相対値) を指定する必要があります。 昨日はら '-1'、明日なら '1' といったようになります。 この場合はグレゴリオ暦を使用します。 他の暦における相対日を取得するには、 `array('calendar', 'relative days')` のような配列を指定します。 単純に行うには Zend_Date を使用します。
DecimalNumber | 指定したロケールにおける十進数値のフォーマットを返します。 単純に行うには Zend_Locale_Format を使用します。
ScientificNumber | 指定したロケールにおける科学記法の数値フォーマットを返します。
PercentNumber | 指定したロケールにおけるパーセンテージの数値フォーマットを返します。
CurrencyNumber | 指定したロケールにおける通貨の数値フォーマットを返します。 単純に行うには Zend_Currency を使用します。
NameToCurrency | 指定した通貨の翻訳を返します。 通貨は ISO フォーマットで指定する必要があります。 たとえば、通貨 'euro' を表すには 'EUR' と指定します。 単純に行うには Zend_Currency を使用します。
CurrencyToName | 指定した地域化名に対応する通貨を返します。 単純に行うには Zend_Currency を使用します。
CurrencySymbol | 指定したロケールにおいて使用する通貨記号を返します。 すべての通貨に記号が存在するわけではありません。 単純に行うには Zend_Currency を使用します。
Question | 肯定 ('yes') および否定 ('no') に対応する地域化した文字列を返します。 'yes' あるいは 'no' を値として指定すると、対応する文字列を取得できます。 単純に行うには Zend_Locale の getQuestion メソッド を使用します。
CurrencyFraction | 指定した通貨で使用する小数点以下の桁数を返します。 通貨は ISO 形式で指定する必要があります。 単純に行うには Zend_Currency を使用します。
CurrencyRounding | 指定した通貨の丸め方式を返します。 通貨は ISO 形式で指定する必要があります。 通貨を省略した場合は、デフォルトの丸め規則を返します。 単純に行うには Zend_Currency を使用します。
CurrencyToRegion | 指定した地域の通貨を返します。 地域コードは `ISO3166` 形式で指定する必要があります。 たとえばオーストリアは 'AT' となります。 単純に行うには Zend_Currency を使用します。
RegionToCurrency | その通貨を使用している地域を返します。 通貨は `ISO4217` のコードで指定する必要があります。 たとえばユーロは 'EUR' となります。 その通貨が複数の地域で用いられている場合は、 空白で区切った形式になります。 単純に行うには Zend_Currency を使用します。
RegionToTerritory | 指定した領域の地域を返します。 領域は `ISO4217` 形式の文字列で指定する必要があります。 たとえば '001' は世界を現します。 この領域内の地域が空白区切り形式となります。
TerritoryToRegion | 指定した地域が存在する領域を返します。 地域は `ISO3166` 形式の文字列で指定する必要があります。 たとえばオーストリアは 'AT' となります。 その地域が複数の領域にまたがる場合は、 空白で区切った形式になります。
ScriptToLanguage | 指定した言語で用いる文字を返します。 言語は ISO 言語コードで指定する必要があります。 たとえば英語は 'en' となります。 その言語で複数の文字が用いられる場合は、 空白で区切った形式になります。
LanguageToScript | 指定した文字が用いられている言語を返します。 文字は ISO 文字コードで指定する必要があります。 たとえばラテン文字は 'Latn' となります。 その文字が複数の言語で用いられている場合は、 空白で区切った形式になります。
TerritoryToLanguage | 指定した言語が用いられている領域を返します。 言語は ISO 言語コードで指定する必要があります。 たとえば英語は 'en' となります。 指定された言語が複数の領域で話される場合は、 領域は空白で区切った形式になります。
LanguageToTerritory | 指定した領域で話される言語の一覧を返します。 領域は `ISO3166` 形式のコードで指定する必要があります。 たとえばイタリアは 'IT' となります。 指定された領域で複数の言語が話される場合は、 言語は空白で区切った形式になります。
TimezoneToWindows | 指定した Windows タイムゾーンに対応する ISO タイムゾーンを返します。
WindowsToTimezone | 指定した ISO タイムゾーンに対応する Windows タイムゾーンを返します。
TerritoryToTimezone | 指定した ISO タイムゾーンに対応する領域を返します。
TimezoneToTerritory | 指定した領域に対応する ISO タイムゾーンを返します。
CityToTimezone | 指定した ISO タイムゾーンに対応する地域化した都市名を返します。 すべてのタイムゾーンが都市名に変換できるわけではありません。
TimezoneToCity | 指定した地域化都市名に対応する ISO タイムゾーンを返します。 すべての都市名がタイムゾーンに対応しているわけではありません。
PhoneToTerritory | 指定した領域 (地域) に対応する電話コードを返します。 領域コードは `ISO3166` 形式の文字列で指定する必要があります。 たとえばオーストリアは 'AT' となります。
TerritoryToPhone | 電話コードが使われている領域 (地域) を返します。 電話コードは整数値で指定する必要があります。 たとえば '43' は +43 を表します。 ひとつの電話コードが複数の領域 (地域) で使われている場合は、 空白で区切った形式になります。
NumericToTerritory | 指定した領域 (地域) に対応する 3 桁の数値コードを返します。 領域コードは `ISO3166` 形式の文字列で指定する必要があります。 たとえばオーストリアは 'AT' となります。
TerritoryToNumeric | 3 桁の数値コードに対応する領域 (地域) を返します。 3 桁の数値コードは整数値で指定する必要があります。 たとえば '43' のようになります。
Alpha3ToTerritory | 指定した領域 (地域) に対応する 3 桁の文字コードを返します。 領域コードは `ISO3166` 形式の文字列で指定する必要があります。 たとえばオーストリアは 'AT' となります。
TerritoryToAlpha3 | 3 桁の文字コードに対応する領域 (地域) を返します。
PostalToTerritory | 指定した領域に対応する郵便番号の正規表現を返します。 領域は `ISO4217` 形式の文字列で指定する必要があります。 たとえば世界全体は '001' となります。
NumberingSystem | 桁表記に使用する文字を返します。
FallbackToChar | よく使われる unicode 文字の置換用文字を返します。 これを使用して、たとえば "©" を "(C)" に置換したりします。
CharToFallback | よく使われる置換用文字に対応する unicode 文字を返します。 これを使用して、たとえば "(C)" を "©" に置換したりします。
LocaleUpgrade | 指定した言語に関するロケールの依存性を返します。 これを使用して、この言語を完全修飾形式のロケールに変換します。
Unit | 地域化したカレンダーの単位を帰します。 これを使用して、"day" や "month" などといった文字列を自動的に翻訳します。 最初のパラメータには型を、そして次のパラメータには数を指定しなければなりません。

Zend Framework 1.5 では、いくつかの古い型の名前が変わりました。 新しい型が追加されたこと、スペルが間違ったいたこと、 そして使いやすさを考慮したことなどが理由です。 変更内容は以下の表でご確認ください。

Zend Framework 1.0 と 1.5 の違い

古い型 | 新しい型
--- | ---
Country | Territory (値 '2')
Calendar | Type (値 'calendar')
Month_Short | Month (値 array('gregorian', 'format', 'abbreviated')
Month_Narrow | Month (値 array('gregorian', 'stand-alone', 'narrow')
Month_Complete | Months
Day_Short | Day (値 array('gregorian', 'format', 'abbreviated')
Day_Narrow | Day (値 array('gregorian', 'stand-alone', 'narrow')
DateFormat | Date
TimeFormat | Time
Timezones | CityToTimezone
Currency | NameToCurrency
Currency_Sign | CurrencySymbol
Currency_Detail | CurrencyToRegion
Territory_Detail | TerritoryToRegion
Language_Detail | LanguageToTerritory

以下の例は、さまざまな言語でのものの名前を取得する方法を示すものです。

getTranslationList

    // すべての国名をドイツ語で表示します
    print_r(Zend_Locale::getTranslationList('country', 'de'));

次の例は、ある言語の名前を別の言語でどのようにいうのかを、 二文字の ISO 国コードを知らない場合に調べるものです。

国の名前を、ある言語から別の言語に変換する

    $code2name = Zend_Locale::getLanguageTranslationList('en_US');
    $name2code = array_flip($code2name);
    $frenchCode = $name2code['French'];
    echo Zend_Locale::getLanguageTranslation($frenchCode, 'de_AT');
    // 出力は、「フランス語」を表すドイツ語の名前になります

Zend_Locale で使用できるすべての言語の一覧を、それぞれの言語での表記で取得するには、 以下の例をウェブページで使用してみましょう。 同様に getCountryTranslationList() および getCountryTranslation() を使用すると、 あなたのネイティブ言語での地域名と別の言語での地域名の対応表を作成できます。 `try .. catch` ブロックで、 存在しないロケールを使用した場合の例外を処理するようにしましょう。 すべての言語がすべてのロケールに対応しているわけではありません。 この例では、例外を無視することで、 スクリプトが途中で終わってしまうことを防いでいます。

すべての言語を、その国のネイティブ言語で書き出す

    $list = Zend_Locale::getLanguageTranslationList('auto');

    foreach($list as $language => $content) {
        try {
            $output = Zend_Locale::getLanguageTranslation($language, $language);
            if (is_string($output)) {
                print "\n<br>[".$language."] ".$output;
            }
        } catch (Exception $e) {
            continue;
        }
    }

## "yes" および "no" に対応する翻訳の取得

プログラム上で、ユーザに "はい" あるいは "いいえ" で答えてもらうことがよくあります。 getQuestion() を使用すると、 ユーザに問い合わせるときに使用する単語あるいは正規表現文字列を含む配列を、 特定の $locale (デフォルトは、そのオブジェクトのロケール) にあわせて返します。 返される配列の中身は次のようになります。

- yes および no: yes および no に対応する一般的な文字列表現です。 これは、yesarray および noarray の最初の要素でもあり、もっとも一般的な内容です。

  yesarray および noarray: yes および no に対応する内容をすべて含む配列です。 言語によっては単に「はい」「いいえ」以外の返答を持つものもあります。 一般に、これは完全な文字列とその省略形になります。

  yesexpr および noexpr: 正規表現で、ユーザの回答から yes か no かを判定できるようにします。

これらのすべての情報は当然地域化されており、 設定されているロケールによって変化します。 以下の例で、どのような情報が取得できるのかを確認してみましょう。

getQuestion()

    $locale = new Zend_Locale();
    // 設問の文字列
    print_r($locale->getQuestion('de'));

    - - - 出力 - - -

    Array
    (
        [yes] => ja
        [no] => nein
        [yesarray] => Array
            (
                [0] => ja
                [1] => j
            )

        [noarray] => Array
            (
                [0] => nein
                [1] => n
            )

        [yesexpr] => ^([jJ][aA]?)|([jJ]?)
        [noexpr] => ^([nN]([eE][iI][nN])?)|([nN]?)
    )

1.0.3 までは、yesabbr もロケールデータから取得可能でした。 1.5 以降、この情報は単体では存在しません。しかし、同じ情報を yesarray から取得できます。

## 既知のロケールの一覧の取得

すべての既知のロケールの一覧を取得したいこともあるでしょう。 たとえば、ロケール選択用の select 要素を作成する場合などに必要となるはずです。 このようなときには、静的メソッド getLocaleList() を使用します。 このメソッドは、すべての既知のロケールの一覧を返します。

getLocaleList()

    $localelist = Zend_Locale::getLocaleList();

返された配列のキーがロケール名となっていることに注意しましょう。 キーに対応する値は、常に `TRUE` です。

## ロケールの検出

指定した入力がロケールかどうかを知りたい場合は、静的メソッド isLocale() を使用します。 このメソッドの最初のパラメータとして、調べたい文字列を指定します。

シンプルなロケールの検出

    $input = 'to_RU';
    if (Zend_Locale::isLocale($input)) {
        print "'{$input}' is a locale";
    } else {
        print "Sorry... the given input is no locale";
    }

ごらんのとおり、このメソッドの出力は常に boolean となります。 このメソッドをコールして唯一例外が発生するのは、 システム側でロケールを一切提供しておらず、Zend Framework がロケールを自動検出できなかった場合です。 通常、このような場合は、ご利用の OS 上で PHP の setlocale() がうまく動作しないでしょう。

指定したロケールに地域部が存在しない場合でも、 自動的に地域部をはずして検出してくれることにもお気づきでしょう。 先ほどの例では、言語 `'to'` は地域 `'RU'` 内に存在しません。しかし、返される結果は `TRUE` となります。 Zend_Locale は指定した入力を処理できるからです。

しかし、この自動変換機能がじゃまになることもあるでしょう。そんな場合には isLocale() の 2 番目のパラメータを使用します。 `strict` パラメータのデフォルトは `FALSE` で、自動変換を無効にするにはこれを `TRUE` とします。

厳格なロケール検出

    $input = 'to_RU';
    if (Zend_Locale::isLocale($input, true)) {
        print "'{$input}' is a locale";
    } else {
        print "Sorry... the given input is no locale";
    }

これで指定した文字列がロケールかどうかを判別できるようになったので、 自作のクラスでロケール対応の処理ができるようになりました。 しかし、すでにお気づきかもしれませんが、毎回のように次のような 15 行のコードを書かなければならないことになってしまいます。

ロケールに対応した振る舞いの実装

    if ($locale === null) {
        $locale = new Zend_Locale();
    }

    if (!Zend_Locale::isLocale($locale, true, false)) {
        if (!Zend_Locale::isLocale($locale, false, false)) {
            throw new Zend_Locale_Exception(
                "The locale '$locale' is no known locale");
        }

        $locale = new Zend_Locale($locale);
    }

    if ($locale instanceof Zend_Locale) {
        $locale = $locale->toString();
    }

Zend Framework 1.8 で、静的メソッド findLocale() が追加されました。これは、現在使用中のロケール文字列を返します。 このメソッドは、次のような処理を行います。

- 指定した文字列がロケールかどうかを調べる

- 指定した地域にロケールが存在しない場合は地域部をはずす

- 言語のない地域として検出される場合、ロケールの等級を上げる

- 入力を省略した場合は、それまでにアプリケーションで設定されていたロケールを返す

- ここまでの検出に失敗した場合はブラウザのロケールを検出する

- ここまでの検出に失敗した場合は環境変数のロケールを検出する

- ここまでの検出に失敗した場合はフレームワークのロケールを検出する

- 常に、見つかったロケールを表す文字列を返す

次の例は、さきほどのコードをたったひとつのメソッドコールで置き換えるものです。

Zend Framework 1.8 以降でのロケール対応の振る舞いの実装

    $locale = Zend_Locale::findLocale($inputstring);