CakePHP1.2を使った多言語サポート対応時の覚書き

CakePHP 1.2を使った国際化を実装する際に調べて役に立ったサイトを(主に自分のために)纏めておきます。

1)いつも、人知れずお世話になっているサイト「CakePHPのおいしい食べ方」にとても分かりやすい解説がありました。

CakePHP1.2の簡単国際化

CakePHP1.2のbakeで自動生成した画面は、画面に表示される文字列が__(‘文字列’) で囲まれています。これは、簡単に多言語翻訳ができるように配慮されているからです。

引用元: CakePHP のおいしい食べ方: CakePHP1.2の簡単国際化.

2)次に、言語の切り替えをマニュアルでするためのリンクの作り方では、このサイトの情報が役に立ちました。

To better understand the goal and why some things were done the way they were, I’ll summarize the requirements:

1. The app has to support two languages or more (in this case English and Russian)

2. Default language is English

3. The language switching is based on a URL param

4. The URL format should be: example.com/eng/controller/action

5. Language choice should persist in the session and a cookie

引用元: CakePHP URL-based language switching for i18n and l10n (internationalization and localization) « nuts and bolts of cakephp.

なお、自分のサイトでは

  1. 多言語サポートとして英語と日本語をサポート
  2. デフォルトの言語は日本語
  3. 言語はURL paramで変更できる
  4. URLフォーマットは: example.com/ja/controller/action といった感じ
  5. 好みの言語はセッションとクッキーで保持される。

としています。用はWordpressのプラグインで「qTranslate」という便利なプラグインがあるが、同じことをしたい!

なので、こちらの例ではConfigフォルダの中のroutes.phpで以下のように

Router::connect('/:language/:controller/:action/*',
                       array(),
                       array('language' => '[a-z]{3}'));

としていますが、自分は[en]と[ja]など2文字がよかったので以下のようにしました。

Router::connect('/:language/:controller/:action/*', array(), array('language' => '[a-z]{2}'));

で、後は引用元にもあるように、_setLanguage()をapp_controller.phpの中に記述して、beforeFilter()関数から呼び出すようにします。

	function _setLanguage() {

	    if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
	        $this->Session->write('Config.language', $this->Cookie->read('lang'));
	    }
	    else if (isset($this->params['language']) && ($this->params['language']
	             !=  $this->Session->read('Config.language'))) {     

	        $this->Session->write('Config.language', $this->params['language']);
	        $this->Cookie->write('lang', $this->params['language'], null, '20 days');
	    }
	}

さらに、app_helper.phpに以下のurl()関数をオーバーライドする関数を作ってお膳立ては出来上がり。

	function url($url = null, $full = false) {
        if(!isset($url['language']) && isset($this->params['language'])) {
          $url['language'] = $this->params['language'];
        }     

        return parent::url($url, $full);
	}

最後に、肝心のリンクを作ります。
自分はviews/layouts/default.ctpにリンクを作りました。

<p>
    <?php echo $html->link('English', array('language'=>'en')); ?>
</p>
<p>
    <?php echo $html->link('Japanese', array('language'=>'ja')); ?>
</p>

で、出来上がり。
example.com/en/controller/action
で言語を英語に切り替えた後、
example.com/controller/action
でアクセスしても、選択言語が保持されているのを確認します。

自分が作っているCakePHPサイトで挙動が確認できます。
http://labeauty.getmycity.com
(実はまだ多言語サポート対応中のためFooterの一番下にEnglish、Japaneseの隠しリンクがあるw)


ktatsuki

ケートリック株式会社 CEO & CTOをしています。
Notes/Dominoの開発を得意としますが、 C++ / Java / PHP / Javascript などの言語を使ってWEBアプリ、iPhone / Android アプリ開発などをしたりします。
XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。

I am owner of KTrick Co., Ltd. and Notes/Domino developer. HCL Ambassador (IBM Champion for 2015 - current). I am interested in web application development and preferred languages are Notes/Domino, C++ / Java / PHP / Javascript.

Author posts

Privacy Preference Center