多言語サイト向けに翻訳ファイルを使って翻訳を行う
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にあればいいのでどこでもいいですが、わかりやすく同じ場所に出力しておきます。
[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ファイルが作成されて完了です。
言語ごとの名称は以下を参照
/lib/Cake/I18n/L10n.php
バリデーションエラーメッセージの翻訳
バリデーションエラーメッセージを翻訳する場合は、各モデルで$validationDomainにドメイン名を定義します。ドメイン名とは、moファイル名のこと。
$validate内のメッセージの設定箇所('message' => 'メッセージ')は変更の必要はありません。
public $validationDomain = 'default';
翻訳有無の選択
Cakeアプリケーションは、ブラウザからの情報を元に自動で判断し翻訳を行うか否かを決定します。以下をコントローラ内で記述すると明示的に言語を指定することができます。
// 英語のまま Configure::write( 'Config.language', 'eng'); // 日本語へ翻訳 Configure::write( 'Config.language', 'jpn');
続く
関連記事
-
Js/Cssファイルの読み込みや出力する方法
CakePHPのHTMLヘルパーにはjsファイルやcssファイルを読み込むためのメソッドが用意されています。ファイルを読み込むのに加えて、出力先を複数指定できるようになっています。 また、インライン
-
Formヘルパーのinputタグのdiv/labelなどの設定
Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま
-
hasOne アソシエーション
hasOneアソシエーションはテーブル間で1つのレコードに対して他のテーブルに紐付くレコードが1つの場合にjoinする場合に使用します。 CakePHPのドキュメントにならってUserモデルとP
-
独自のバリデーションルールを作成
CakePHPで組み込みバリデーションルールをつくる方法は、正規表現を定義する方法と独自メソッドを定義する方法の2つがあるようです。 参考 Custom Validation Rules 正規
-
複数ファイルアップロードフォーム
CakePHP 2.0からはHTML5が標準でサポートとなり、複数ファイルアップロードのためのフォーム記述が容易になりました。 View (ビュー) 配列 Array (
-
(メール・URL・電話・郵便・IP) データ バリデーション
今回は、プロフィール情報に使用されるデータに絞ったバリデーションルールです。 バリデーションルール 以下の5つのバリデーションルールがコアに用意されています。 email メールアドレス
-
テーブルからランダムにデータを取り出す(find)
CakePHPでテーブルから特定件数のレコードをランダムに取得するには以下のように指定するとできます。 $this->data = $this->Bulkdata->find( 'all',
-
FullCalendarを使用してカレンダーアプリケーション
カレンダーアプリケーションを作成するため、カレンダー表示できるプラグインを探索して出会ったFullcalendarを試してみました。シンプルに使用できる上に、オプションがかなり豊富です。ダウンロード
-
Jsヘルパーを使用してAjax更新
更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head
-
パス定数と変更方法やURLの取得
CakePHPは基本的にはディレクトリそのまま配置することで構築が可能ではありますが、設定パスを変更することでセキュリティに考慮した構成にすることや運用性をもたせたものにすることが可能になります。
Comment
[…] cakephpマニュアルのこのページに説明が書いてあります。 あと、翻訳ファイルの作成については、ここが参考になりました。 […]
CakePHP ローカライズ/翻訳 - Qiita
[参考サイト](https://t.co/cDlOS93BAF)
上記に全て書いてあるが、自分用にメモ。
# 最初に
テキストを記述するときは必ずこう書いて... https://t.co/dBgAlc9bhi
多言語サイト向けに翻訳ファイルを使って翻訳を行う http://kwski.net/cakephp-2-x/1104/ … むむむpoとかmoとかpotとかある