多言語化対応メモ
翻訳テキストを設定する方法で、多言語化(国際化)対応を行なった作業メモです。
データベースに設定する方法もあるそうですが、ただでさえACLでDBに負担かけているので、翻訳テキスト方を採用しました。
参考サイト
CakePHP1.2の簡単国際化: CakePHP のおいしい食べ方
1.2系の多言語対応メモ(1) - Writing Some Code
翻訳テキストファイルの作成
bakeで翻訳テキストファイルを作成。
ロケールなどの変更はないので、デフォルト値(空欄)で基本進めます。
[cake@cake console]$ ./cake i18n Welcome to CakePHP v1.2.4.8284 Console --------------------------------------------------------------- App : app Path: /[CAKEPHP_ROOT]/app --------------------------------------------------------------- I18n Shell --------------------------------------------------------------- [E]xtract POT file from sources [I]nitialize i18n database table [H]elp [Q]uit What would you like to do? (E/I/H/Q) > E What is the full path you would like to extract? Example: /[CAKEPHP_ROOT]/myapp [Q]uit [/[CAKEPHP_ROOT]/app] > What is the full path you would like to output? Example: /[CAKEPHP_ROOT]/app/locale [Q]uit [/[CAKEPHP_ROOT]/app/locale] > Extracting... --------------------------------------------------------------- Path: /[CAKEPHP_ROOT]/app Output Directory: /[CAKEPHP_ROOT]/app/locale/ ---------------------------------------------------------------
参考サイトにない次のメッセージで少し悩みましたが、参考サイトの例では、翻訳ファイルはdefault.po 1つに纏まっているようなので、[y]を選びます。
Would you like to merge all translations into one file? (y/n) [y] > y What should we name this file? [default] > Processing /[CAKEPHP_ROOT]/app/error.php... Processing /[CAKEPHP_ROOT]/app/index.php... (中略)
また、CakePlusのバリデーションエラー多言語化の部分でアラートが出ましたが、
「__()の第一引数が変数である('〜〜'になってない)」との指摘ではないか。
ひとまずスルーします
Processing /[CAKEPHP_ROOT]/app/plugins/cakeplus/models/behaviors/validation_error_i18n.php... Invalid marker content in /[CAKEPHP_ROOT]/app/plugins/cakeplus/models/behaviors/validation_error_i18n.php:171 * __( $model->validate[$fieldname][$rule]['message'],true) (中略) Processing /var/www/html/chara-shee/app/webroot/js/vendors.php... Done. --------------------------------------------------------------- I18n Shell --------------------------------------------------------------- [E]xtract POT file from sources [I]nitialize i18n database table [H]elp [Q]uit What would you like to do? (E/I/H/Q) > Q
これで、app/locale以下に default.poとengディレクトリが生成されました。
拡張子が[.po]ではなく[.pot]ですが、きっとサンプルファイルのようなもので、拡張子をあえて変えているのでしょう・・・
[cake@cake console]$ ls ../../app/locale/
default.pot eng
[cake@cake console]$ ls ../../app/locale/eng/
LC_MESSAGES
[cake@cake console]$ ls ../../app/locale/eng/LC_MESSAGES/
empty
翻訳テキストファイルの編集
自動生成されたdefault.potの中身は、テキストエディタで見るとこんな感じです。
# LANGUAGE translation of CakePHP Application
# Copyright YEAR NAME
# No version information was available in the source files.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"POT-Creation-Date: 2010-04-07 22:01+0900\n"
"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
"Last-Translator: NAME\n"
"Language-Team: LANGUAGE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"#: /error.php:8
msgid "PC View"
msgstr ""#: /controllers/app_controller.php:104
#: /controllers/users_controller.php:83;210
msgid "Guest"
msgstr ""
(以下略)
コツをつかめばテキストエディタでも編集できそうですが、初心者ですし、今後の対応メッセージ追加にも役立つそうなので、素直にpoeditをインストール。
locale/jpn/LC_MESSAGES/default.poを編集します。
編集し始めてすぐに気付いたのは、「設定1つで済みそう」と共通化していたつもりのメッセージ設定ブレ orz
とほほ・・・
いくつか翻訳したところで保存すると、
default.po
の他に
default.mo
というファイルもできています。 .mo の方は、Poedit用のファイルなのでアップロード不要。
default.po のみをアップロードすると・・・日本語化されました。
言語切換え
使用言語はHTTP_ACCEPT_LANGUAGEの設定で自動切換えしているようですが、誤作動もありえるので、明示します。
Configure::write('Config.language', 'en');
や
Configure::write('Config.language', 'en');
のようにソースに追記。
これは、beforeFIlter()までに設定すればOKのようです。
confファイルで設定してもよいし、「言語切換え機能」などつけたい場合にapp_controllerなどで設定する事もできそうです。