多言語化対応メモ

翻訳テキストを設定する方法で、多言語化(国際化)対応を行なった作業メモです。
データベースに設定する方法もあるそうですが、ただでさえACLでDBに負担かけているので、翻訳テキスト方を採用しました。


参考サイト
CakePHP1.2の簡単国際化: CakePHP のおいしい食べ方
1.2系の多言語対応メモ(1) - Writing Some Code

テンプレート/コントローラなどの記載

言語化対応文言は

__('hogehoge')

あるいは

echo __('hogehoge', true)

で作成済み。

翻訳テキストファイルの作成

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などで設定する事もできそうです。