FuelPHP: i18n Webアプリケーションの国際化

言語化について記事を見つけました。かなり拙いですが、勉強がてらに翻訳してみます。
ちなみに参考にしたのは、以下のサイトです
FuelPHP: i18n, internationalization of a web application

FuelPHPでの国際化(多言語化

大きなwebアプリを扱うことはセキュリティ、拡張性、性能など、沢山の要素に注意しなければなりません。
そしてもう一つ、普通は重要視されていない、または過小評価されているものに国際化があります。
「国際化(Internationalization)」は通常、"i18n"("i" と "n" の間に文字が18個ある)と略され、デザインやプログラミング、プロダクトのサービスの実行作業など、様々な言葉に適応しやすいようになされている最中です。

この取組みはwebアプリケーションの主な3つについて開発する際に気をつける事を沢山含んでいます。

  1. 翻訳化
  2. 数字のフォーマット
  3. 日時のフォーマット

このチュートリアルは上記の中で一番難しい1番目をカバーします。
しかし、それらを始める前に「どのように行われるか」「どのようにしてユーザが欲しがっている言語を知るのか」理解する必要があります。

ステップ1.ロケール(言語別または地域別に分けられた設定情報)の理解
国際化を扱うとき、ロケールについてしばしば考える時があります。
ロケールは国や普段話す言語などの要求を共通化したデータ方式で、それらの情報を持った人々のグループを特定するデータ方式です。

ロケールは通常、2つの文字で作られた異なったIDで識別できます。

  1. 言語IDはユーザの言語を表す
  2. 地域IDはユーザの地域を表す(なので、メインの言語は少し異なる場合があります)

ロケール"en_us"を例として上げます。これは「言語:"en"(English)」、「地域:"us"(United States)」で作られています。
パワフルなライブラリならどちらの言語や国かによって変更できるべきでしょう。
このチュートリアルでは言語を扱い、それらを通じて、地域をサポートできるようになることを学びます。

ステップ2:言語の取得
あなたはロケールや現地語化についての経歴が少しあり、ユーザの現在のロケールを取得する方法を探そうとしています。
やり方は色々ありますが、私の好きな方法はFuelPHPのフォーラムにC.K.Yさんが書いた方法です。
FuelPHP 1.4の最終バージョン だと正しく動きますが、現在のバージョンがサポートされているか分かりません。)

コードは非常にシンプルで少しのステップで実装可能です。

  • URI の拡張クラスを作成
  • autoloder に URI の拡張クラスを追加
  • config.phpロケールを定義
  • url に言語を追加
  • 言語ファイルを作成

URIクラスの拡張
まず、URIクラスを拡張しましょう。

<?php

class Uri extends Fuel\Core\Uri
{
    public function __construct($uri = NULL)
    {
        parent::__construct($uri);
        $this->detect_language();
    }

    public function detect_language()
    {
        if ( ! count($this->segments))
        {
            return false;
        }

        $first = $this->segments[0];
        $locales = Config::get('locales');

        if(array_key_exists($first, $locales))
        {
            array_shift($this->segments);
            $this->uri = implode('/', $this->segments);

            Config::set('language', $first);
            Config::set('locale', $locales[$first]);
        }
    }
}

このクラスは元のメソッドを上書きしており、Fuelのコアクラスと共に呼ばれます。
そして、ユーザがurlを打ち込むと、メソッド:"detect_language()"がURLから言語を取ってこようとします。
もし選択された言語がwebアプリでサポートされていればデフォルトの言語としてリクエストに対してセットします。
他の方法であれば、config.php にデフォルトの言語を設定できます。

このコードをコピーして fuel/app/classes/extension/uri.php として保存します。
ちょっとした備考ですが、コアファイルを拡張する場合は、備え付けであるこのextensionディレクトリの中に入れる事をオススメします。
そうすることでコードが整頓されると思いますよ。

Autoloader に URIクラスを追加
とても簡単です。bootstrap.php を編集して、下のコードを入力します。
そうすると、さっき作成した拡張機能が毎回呼び出され、ローカライゼーションを管理するためのリクエストを取得する事ができます。

<?php
・・・・・・
Autoloader::add_classes(array(
    // Add classes you want to override here
    'Uri' => APPPATH.'classes/extension/uri.php',
));

これでコントローラの変更なしに、urlから言語を使用することができます。
例:http://www.domain.com/{lang}/controller/action/value/

ロケールを config.php に定義する
さて、アプリケーションにロケールを定義しましょう。

<?php
・・・・・・
return array(
    'language'           => 'en', // Default language
    'language_fallback'  => 'en', // Fallback language when file isn't available for default language
    'locale'             => 'en_US', // PHP set_locale() setting, null to not set
    'locales'            => array(
        'en' => 'en_US',
        'it' => 'it_IT'
    ),
);

ここでローカライゼーションの設定を見ることができます。少し注意することがあります。

  • language はアプリケーションのデフォルト言語です
  • language_fallback はデフォルトの言語が見つからない場合の代わりに使われます
  • locale は現在のロケールで、PHP関数の"set_locale()" で使われます。null が入る場合もあります
  • locales はアプリケーションでサポートしているロケールで、各々のロケールを使用する事ができます(「言語+地域」の組み合わせ)
    個別に言語が欲しい場合は追加する事で使用できるようになります

この例では、2つのロケールを使用しました。イタリア人の場合は「it_IT」が母国語で、英語バージョンを作成する場合に「en_US」を用意しています。
もちろん英語を優先しています。

URLに言語の値を加える
urlにどう言語を加えたらいいかという問題が残っています。
一番簡単な方法は "Uri::create()" メソッドのラッパーを使用することです。
なので "generate()" メソッドを作成しています。

fuel/app/class/extension/url.php にそのメソッドを入れてみましょう。

<?php
・・・・・・
public static function generate($uri = null, $variables = array(), $get_variables = array(), $secure = null)
{
    $language = Config::get('language');
 
    if ( !empty($uri))
    {
        $language .= '/';
    }
         
    return \Uri::create($language.$uri, $variables, $get_variables, $secure);
}

これで"Uri::generate('mylink')" の構文で url を作成することができます。

言語ファイルの使用
ユーザの選択した言語を理解できるようになりました。
多言語になるようにアプリケーションを作ってみましょう。

  • load() は言語ファイルを読み込んで、変数に格納するようにします。
    (例)Lang::load('example', 'test');
    これでfuel/app/lang/{lang}/example.php が変数 test に展開します。
  • get() は翻訳された値とキーの組み合わせを取得できます。
    Lang::get('test.something');
    これは load() メソッド を使用したときと同じように、変数 "test" の "something" を取得します。

これで現在の言語ファイル、変数を取得することでができました。

言語ファイルを作成する
fuel/app/lang/{lang}/example.php を作成します。
{lang} は言語を指定し、example.php はファイルで、あなたの欲しい言語を名前にしてください。
各サイト毎にファイルを作成することをオススメします。

ファイルを作りましょう。

<?php
・・・・・・
return array(
    'hello' => 'Hello',
    'something' => 'brave new :name!',
    'test' => array('key1' => 'variable1')
);

どのように使うかの例も記述します。

<?php
・・・・・・
echo Lang::get('test.hello');
// This will print "Hello"
 
echo Lang::get('test.something', array('name' => 'world'));
// This will print "brave new world"
 
echo Lang::get('test.test.key'));
// This will print "variable1"

さらにLangクラスの情報が必要な場合は、ドキュメントを参照してください。