Cakephp.org にはドキュメントがなく、Google でドキュメントを見つけることができません。ドキュメントをリンクするか、ドキュメントを提供してください。
2 に答える
翻訳動作は、CakePHP の非常に便利な機能の 1 つですが、文書化が不十分です。私はそれを数回実装し、次の行に沿って多言語 Web サイトで妥当な成功を収めました。
まず、翻訳動作はサイトのデータベース コンテンツのみを国際化します。さらに静的なコンテンツがある場合は、Cake の__('string')
ラッパー関数を参照してくださいgettext
(これに関する有用な情報がここにあります) 。
次のデータベース テーブルで翻訳したいコンテンツがあると仮定します。
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);
これにより、pol ロケールのタイトルおよび本文フィールドの i18n テーブルにエントリが作成されます。Finds は、ユーザーのブラウザーに設定されている現在のロケールに基づいて検索し、次のような配列を返します。
[Content]
[id]
[titleTranslation]
[bodyTranslation]
優れたp28n コンポーネントを使用して、gettext および translate 動作と非常にうまく連携する言語切り替えソリューションを実装しています。
これは完璧なシステムではありません。HABTM リレーションシップをオンザフライで作成するため、手動で作成した他のリレーションシップで問題が発生する可能性がありますが、注意すればうまく機能します。