4

Cakephp.org にはドキュメントがなく、Google でドキュメントを見つけることができません。ドキュメントをリンクするか、ドキュメントを提供してください。

4

2 に答える 2

13

翻訳動作は、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 リレーションシップをオンザフライで作成するため、手動で作成した他のリレーションシップで問題が発生する可能性がありますが、注意すればうまく機能します。

于 2008-09-19T09:11:39.687 に答える