地域化と国際化

より多くのユーザにリーチする最も良い方法のひとつは、たくさんの異なる言語でアプリケーションを作成することです。これはしばしば、気が遠くなるような作業になります。しかし、 CakePHP の地域化(localization)と国際化(internationalization)の機能は、これを簡単にします。

まずは、いくつかの専門用語について理解しましょう。 国際化(*Internationalization)*とは、あるアプリケーションをローカライズ出来るようにすることです。地域化(*localization)*とは、あるアプリケーションを特定の言語や文化での表現(すなわちロケール(locale))に適応させることです。 国際化と地域化は、それぞれ「i18n」と「l10n」というように省略されます。 「internationalization(国際化)」の最初と最後の文字の間に18文字あるから「i18n」となり、「localization(地域化)」も同様の理由で「l10n」となります。

アプリケーションを地域化する

地域化されたコンテンツを扱う全てのコントローラで、 CakePHP のユーティリティクラスである「L10n」を読み込んでおきましょう。

//Include the L10n class:
 App::import('Core', 'l10n');
 class RecipesController extends AppController {     //... }

次に必要なことは、地域化された文字列を管理するための言語ファイルを作成することです。各言語は、 ID と文字列のセットを含みます。このファイルを作成することで、系統立てと翻訳のためのコンテンツが準備できます。各言語は、その言語の一部を含む名前がついたフォルダの中に、必ず default.po ファイルを持たなければなりません。

/app/locale/eng/LC_MESSAGES/default.po (英語)
/app/locale/fre/LC_MESSAGES/default.po (フランス語)
/app/locale/por/LC_MESSAGES/default.po (ポルトガル語)

「locale」フォルダは、 CakePHP がインストールされた場所の app フォルダ内にあります。3文字のロケールコードは ISO 639-2 標準に準拠します。例はアメリカ議会図書館のウェブサイトで確認できます。 http://www.loc.gov/standards/iso639-2/php/code_list.php を参照してください。

ファイルを作成したら、ローカライズの過程で使用する、文字列のキーと値を入力してください。文字列の各キーは必ず、ユニークで対応する値をもたなければなりません。英語の .po ファイルの基本的な記入例は、次の通りです。

msgid   "purchase"
msgstr  "Please purchase a pastry by selecting its name and pressing BUY NOW."
msgid   "search"
msgstr  "Click here to search our recipe database."

.po ファイルは必ず UTF-8 で入力し、それぞれの msgstr の値の文字数上限は 1014 であることに注意してください。 Macintosh を使う場合、必ず Unix の改行文字(LF)を使うようにしてください。そうしないと、言語ファイルが正確に解析されないことがあります。 po ファイルを編集するにあたり、フリーのツールである Poedit を利用することで、このあたりの面倒を回避することができます。

.po ファイルを正しく作成すれば、アプリケーションは地域化されます。

CakePHP における国際化

ロケールデータはアプリケーションの中で簡潔に扱えます。まず、アプリケーションがコンテンツを出力する言語を CakePHP に伝えます。これはとりわけ、サブドメインで判定したり(en.example.com は英語、 fra.example.com はフランス語といったように)、ブラウザのユーザエージェントから情報を拾うことで行います。

言語の切り替えを行う最も良い場所はコントローラ内です。

$this->L10n = new L10n();
$this->L10n->get("eng");

コントローラの各メソッドが正しい言語で出力されるよう、このコードを beforeFilter に設置するという使い方があります。あるいは、認証のハンドルとなるアクションか、ロケールをデフォルトから切り替えるアクションに設置するのも良いでしょう。

地域化されたコンテンツを表示するには、「__()」という便利な関数を利用します。この関数はグローバルに使用できますが、ビューの中で使うことが多いでしょう。この関数に渡す第一引数は、 .po ファイル中で定義されている msgid です。デフォルトでは、地域化されたコンテンツが echo() により出力されます。しかしオプションの第二引数によって、 echo() による出力の代わりに値が返されます。これは例えば、テキストヘルパーを使って文字列をハイライトしたりリンクを作成したりする時に便利です。「__()」 関数を使ってどのように地域化されたコンテンツを出力するのかを、簡単な例を見ながら確認していきましょう。これらの例での実際の出力は、「L10n」クラスでの選択や、有効な構成の設定に依存します。

<?php __("purchase"); ?>

地域化されたデータを引数として渡しヘルパーメソッドを実行する場合、異なるヘルパーメソッドの escape パラメータを使用することを忘れないでください。また、「__()」関数の第二引数を利用することで、 echo() によって出力せず、データを戻り値として返すことに注意してください。

<?php
echo $form->error(
    'Card.cardNumber',
    __("errorCardNumber", true),
    array('escape' => false)
);
?>

もし全てのバリデーションエラーのメッセージをデフォルトから翻訳したい時、次の記述を app_model.php に書き加えるという簡単な方法があります。

function invalidate($field, $value = true) {
    return parent::invalidate($field, __($value, true));
}