多言語サイト向けに翻訳ファイルを使って翻訳を行う

CakePHPには、翻訳をビヘイビアを使用する方法と翻訳ファイルを使用する方法の2つがあるそうです。(他にもあるのかな?)
今回は、翻訳ファイルを使用して言語の切り替えを行い、その言語設定をCookieに保存して次回訪問時もその言語で開くようにしてみようと思います。

翻訳ファイルの原本を作成する

PO/MOファイルというものを使用するようです。
まず、POTファイルつくります。コマンドラインから..../app/Consoleにcd(移動)します。(以下、....はアプリケーションのディレクトリに置き換えて下さい。)

/cake/to/path/Console> cake i18n
Welcome to CakePHP v2.6.1 Console
---------------------------------------------------------------
App : app
Path: /path/to/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

POTファイルを作成するため、"E"

Current paths: None
What is the path you would like to extract?
[Q]uit [D]one
[/path/to/app/] > D

抽出元パス(翻訳対象のソースがあるパス)を指定します。指定したディレクトリ配下のソースファイルを全てナメてくれて翻訳部分を抽出してくれるのでアプリ作成後でも対応できます。__('翻訳対象')と記述した部分です。

Current paths: ..../app/Locale/jpn/LC_MESSAGES
What is the path you would like to extract?
[Q]uit [D]one
[D] > D

抽出元がこれでよければ"D"

Would you like to extract the messages from the CakePHP core? (y/n)
[n] > y

"y"にするとcoreファイルからの翻訳が、POT内に書き込まれます。必要なければ"n"のまま。
→CakePHPのライブラリーから出力されるものも翻訳を行いたい場合は、"y"

What is the path you would like to output?
[Q]uit
[/path/to/app/Locale] > /path/to/app/Locale/jpn/LC_MESSAGES

POTファイルの出力先のディレクトリを指定します。
最終的にmoファイルが..../app/Locale/jpn/LC_MESSAGESにあればいいのでどこでもいいですが、わかりやすく同じ場所に出力しておきます。

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

default.potに全ての翻訳データをマージするかを決めます。
ここで、抽出が始まって指定したディレクトリにファイルが出力されます。

翻訳を設定する

POファイルを作成

まず、作成された.potファイルから.poファイルを作成します。ここでも使用したPoeditを使用します。
「ファイル」→「POTファイルを元に新しいカタログを作成します」からdefault.potを指定するとdefault.poが作成されます。このとき、「カタログの設定」というダイアログがでてくるので、「複数形」を以下のように変更を行って下さい。
こうしないと、「invalid nplurals value」と文法エラーで怒られます。

#変更前
nplurals=INTEGER; plural=EXPRESSION;
#変更後
nplurals=2; plural=(n > 1);

POファイル(テキスト)で翻訳を行う

テキストエディタでPOファイルを開き翻訳を行います。msgid:翻訳元 / msgstr:翻訳後

# コメント(ソースファイルのパスなど)
msgid "Hello World"
msgstr "こんにちは、世界さん"

このように記述すると日本語環境では

<?php echo __("Hello World"); ?>

こんにちは、世界さん

と出力されます。
あとは、翻訳したいものを羅列していけばよいです。msgid はファイル内で一意にしなければなりません。

MOファイル(バイナリ)へコンパイル

実際にCakePHPアプリケーションが使用する翻訳データはコンパイルされたMOファイルです。Poeditで.poファイルを開き、「保存」を押すと、編集した.poファイルの内容を元に.moファイルが作成されて完了です。

日本語の場合は"jpn"となり、app/Locale/jpn/LC_MESSAGESに配置
言語ごとの名称は以下を参照
/lib/Cake/I18n/L10n.php

バリデーションエラーメッセージの翻訳

バリデーションエラーメッセージを翻訳する場合は、各モデルで$validationDomainにドメイン名を定義します。ドメイン名とは、moファイル名のこと。
$validate内のメッセージの設定箇所('message' => 'メッセージ')は変更の必要はありません。

public $validationDomain = 'default';

参考:Translating model validation errors

翻訳有無の選択

Cakeアプリケーションは、ブラウザからの情報を元に自動で判断し翻訳を行うか否かを決定します。以下をコントローラ内で記述すると明示的に言語を指定することができます。

// 英語のまま
Configure::write( 'Config.language', 'eng');
// 日本語へ翻訳
Configure::write( 'Config.language', 'jpn');

続く

  • このエントリーをはてなブックマークに追加

関連記事

入力文字列の長さ(文字数)をバリデーション

CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt

Syslogログエンジン

2.4から「Syslog」ログクラスが追加され、簡単にSyslogを使用できるようになりました。 CakePHP側の設定はbootstrap.php内のCakeLogコンフィグのengineを'Sy

SQLクエリーをログに出力する

SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処

バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.

CakeEmailでメール送信(@gmail)

CakePHP 2になって追加されたクラスCakeEmailがシンプルに使えます。これを使用してメール送信を行う処理を実装してみました。 CakeEmailクラスの読み込み /app/Config

コントローラ内でバリデーション処理を呼び出す

CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。

ハッシュ関数の選択とハッシュ化処理

CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ

CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」

「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し

Formヘルパーのinputタグのdiv/labelなどの設定

Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま

CakePHP 2.x インストール

現在まで私が商用・非商用にリリースしているCakePHPアプリケーションは全て1.3.xベースで作成しています。 まだまだロードマップ的には大丈夫そうですが、お客さん向けに納品しているアプリケーショ

Comment

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑