CakePHP で TranslateBehavior を使用するにはどうすればよいですか?
質問
Cakephp.org にはドキュメントがなく、Google でも見つかりません。ドキュメントをリンクするか、ドキュメントを提供してください。
解決
翻訳動作は、CakePHP の非常に便利な機能の 1 つですが、文書化が不十分です。私はこれを数回実装し、次のような方針で多言語 Web サイトでそれなりの成功を収めました。
まず、翻訳動作はサイトのデータベース コンテンツのみを国際化します。さらに静的なコンテンツがある場合は、Cake のコンテンツを参照してください。 __('string')
ラッパー関数と gettext
(これに関して役立つ情報があります ここ)
次の db テーブルを使用して翻訳したいコンテンツがあると仮定します。
CREATE TABLE `contents` (
`id` int(11) unsigned NOT NULL auto_increment,
`title` varchar(255) default NULL,
`body` text,
PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
content.php モデルには次のものが含まれます。
var $actsAs = array('Translate' => array('title' => 'titleTranslation',
'body' => 'bodyTranslation'
));
その定義では。次に、次のように i18n テーブルをデータベースに追加する必要があります。
CREATE TABLE `i18n` (
`id` int(10) NOT NULL auto_increment,
`locale` varchar(6) NOT NULL,
`model` varchar(255) NOT NULL,
`foreign_key` int(10) NOT NULL,
`field` varchar(255) NOT NULL,
`content` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
次に、コントローラーのデータベースにデータを保存するときに、ロケールを希望の言語に設定します (この例はポーランド語です)。
$this->Content->locale = 'pol';
$result = $this->Content->save($this->data);
これにより、i18n テーブルに pol ロケールのタイトルおよび本文フィールドのエントリが作成されます。検索は、ユーザーのブラウザに設定されている現在のロケールに基づいて検索され、次のような配列を返します。
[Content]
[id]
[titleTranslation]
[bodyTranslation]
優れたものを使用しております p28n コンポーネント gettext および翻訳動作とうまく連携する言語切り替えソリューションを実装します。
これは完璧なシステムではありません。HABTM 関係をその場で作成するため、手動で作成した他の関係に問題が発生する可能性がありますが、注意していればうまく機能します。
他のヒント
同じことを検索している人のために、cakephp がドキュメントを更新しました。翻訳動作については、次へ進みます ここ..