多言語対応(国際化)

Posted by muchag | CakePHP |
初回投稿:2011-06-12 (日) 19:40:06 | 最終更新:2011-06-23 (木) 15:21:39

CakePHP では、地域化国際化 という機能があり
それぞれ、i10n , i18n と定義されているようだ。
The CakePHP 1.3 Book:4.8 地域化と国際化

上記マニュアルを読んでわかったのだが、i18n は
「internationalization(国際化)」という単語は i と n の間に 18文字あるからなんだって。
なんちゅうネーミング・・・。
(個人的には人間臭くて賛成するけどw)

【環境】
[CakePHP] 1.3.10
概要

ルールは WordPress と同じなので、分かり易かった。

要は、

  1. 表示したい文字列は、専用の関数の引数として配置
  2. .po ファイルを定義して、そこで翻訳

 

文字列の配置
書式

MVC どこでもよいので、表示したい文字列がある場合は

  1. // そのまま出力する場合
  2. __('文字列')
  3.  
  4. // 戻り値となる場合
  5. __('文字列', true)

のように記述する。

但し、CakePHP 2.x では、下の書式はなくなるようだ。
参考元サイト:24時間CakePHP CakePHP2.0の概要(訳)
 

文字列

どうせ翻訳するわけだから、指定する文字列は何語でもよいといえばそうなんだが
やはり英語がよいと思う。

何となくそう思い込んでいたけど
トーハム紀行:CakePHPで多言語対応をする 2/3
こちらの記事を読んで、漠然としていたイメージが確立した。

というわけで、コード内文字列は英語に決まり!
 

翻訳
抽出

翻訳対象文字列をアプリケーションの中から抽出する。

この作業はコマンドラインで行うのだが
ここで思いっきりはまってしまった。 🙄
が、長くなるので後回し。
CakePHP は環境変数設定必須?
Linux, Windows の自動振り替えは?
 

i18n オプション
cake\console

まで移動するとか、パスを設定するとか、適宜自分の環境に合わせて行動。

  1. > cake i18n

 

POT
  1. Welcome to CakePHP v1.3.10 Console
  2. ---------------------------------------------------------------
  3. App : console
  4. Path: J:\Eclipse_PDT\cakeprojects\myapp\cake\console
  5. ---------------------------------------------------------------
  6. I18n Shell
  7. ---------------------------------------------------------------
  8. [E]xtract POT file from sources
  9. [I]nitialize i18n database table
  10. [H]elp
  11. [Q]uit
  12. What would you like to do? (E/I/H/Q)
  13. > e

 

抽出元

基本的には app フォルダを指定。

  1. What is the full path you would like to extract?
  2. Example: J:\Eclipse_PDT\cakeprojects\(アプリ名)\cake\myapp
  3. [Q]uit [D]one
  4. [J:\Eclipse_PDT\cakeprojects\(アプリ名)\cake\console] > J:\Eclipse_PDT\cakeprojects\(アプリ名)\app

 

実行
  1. What is the full path you would like to extract?
  2. Example: J:\Eclipse_PDT\cakeprojects\(アプリ名)\cake\myapp
  3. [Q]uit [D]one
  4. [D] > d

 

出力先

Example のままでよければそのままリターン。
他にしたければ、絶対パスを入力。

  1. What is the full path you would like to output?
  2. Example: J:\Eclipse_PDT\cakeprojects\(アプリ名)\app\locale
  3. [Q]uit
  4. [J:\Eclipse_PDT\cakeprojects\(アプリ名)\app\locale] >

 

上書き確認

上で設定した出力先に、既に .pot ファイルが存在する場合には上書き確認が出る。

  1. Would you like to merge all domains strings into the default.pot file? (y/n)
  2. [n] >

 

実行

これでダラダラダラ~っとログが流れて
出力完了。

J:\Eclipse_PDT\cakeprojects\(アプリ名)\app\locale\default.pot

 
上書き確認を n にしていると

  1. Error: default.pot already exists in this location. Overwrite? [Y]es, [N]o, [A]ll (y/n/a)
  2. [y] >

えw また聞くのね・・・。

  • [y] そのまま上書きするのでしょう・・・
  • [n] 作業をやめるのかしら・・・
  • [a] 選択してみたけど、普通に上書きされた感じ・・・不明

 

配置

デフォルトでは

app\locale\eng\LC_MESSAGES

しかないので

app\locale\jpn\LC_MESSAGES

を作成し、先ほどの

default.pot

を移動して、拡張子を .po に変更して配置。

app\locale\jpn\LC_MESSAGES\default.po

 

翻訳

テキストエディタなり Poedit なりで .po ファイルを編集。
Poedit 参照。
 
でけた~!!
 

翻訳文言の追加

Poedit を参考にして追加するわけだけど
ちょっと問題が・・・。

カタログの更新に失敗しました。

詳細を見ると

default.pot’ は有効な POT ファイルではありません。
カタログ中の項目に不正(未対応?)なものがあるようです。

色々と試してみた結果、どうやら app フォルダ内に日本語を含んだファイル名があるのが問題だったみたい。
バックアップしていたファイルが「コピー ~ hoge.php」で、
これを削除して POT ファイルを作り直したらエラーが出なくなった。
 

CakePHP は環境変数設定必須?

あちこちの解説を読むと、いとも簡単に

cake\console

へ移動して

  1. >cake i18n

とすればよい、と書いてあるのだが上手くいかない。
 

原因?

というのも、私はパスを通していない。
PHP のヴァージョン混在開発環境のため
どの PHP かわからなくなってしまうから、毎回フルパスで指定している。

つまり、私の場合は

cake\console

まで移動してから

  1. >I:\xampp\php\php cake i18n

としている。
 

対処

いくら調べてもこの情報がなくて
結局一時的にパスを通す手法を採ることにした。

情報を探すうちに素敵なサイトを発見♪
Rewish:WindowsでCakePHPコンソール(bake)を使い易くする方法

こちらのサイトでバッチファイルを配布してくださっていたので
頂戴して試してみた。
 

console.bat

このファイルは

(アプリ名)\cake\console

という環境の

(アプリ名)

に配置するように作られているようだが
別の場所に配置しても、動作してくれる。

別の場所へ配置した場合は、バッチファイル実行後

(アプリ名)\cake\console

までのパスを聞かれる。
 

PHP へのパスを通す

また、PHP までのパスを通す場合は、19行目に記述。

  1. set "PATH=%PATH%;%CAKECONSOLE%"
  2. set "PATH=%PATH%;%CAKECONSOLE%;I:\xampp\php"

 

Linux, Windows の自動振り替えは?
cake\console

には

cake
cake.bat

という2つのファイルが用意されている。

どこかのサイトでも見かけたが
Linux 用と Windows 用が用意されいると思っていた。

しかし、前述の「パスが通っていない状態でフルパスでコマンド実行」を試している最中

  1. >I:\xampp\php\php cake

とすると cake ファイルが実行され

  1. >I:\xampp\php\php cake.bat

とすると cake.bat が実行された。

ん~・・・自動振り分けできていない?

でも、いただいてきた console.bat を利用したら

  1. >cake i18n

でちゃんと動いたから
やっぱり環境変数の問題なのかな・・・。

Posted by muchag | CakePHP |
初回投稿:2011-06-12 (日) 19:40:06 | 最終更新:2011-06-23 (木) 15:21:39

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment