は、私は、これは古いですけど、それは未回答だと、私はこれを考え出すいくつかのトラブルになったことから、ここで私の2セントです:
範囲、CakePHPの1.3。
最初に、アプリケーションのすべてのフィールド - >レコード - >モデルのi18nレコードが必要です。もちろん、Translateビヘイビアを持つモデルのみで、指定されたフィールドのみが必要です。したがって、実際のモデルフィールドとi18nテーブルの両方のコンテンツ
また、findメソッドで何かを返すために指定した言語には、既存の翻訳が必要です。これは私には混乱してしまいました。なぜなら、翻訳された振る舞いを、すでに開発されたプロジェクトに、たくさんのデータとともに追加したからです。基本的に私がしたことは、翻訳動作を持つすべてのモデルのすべてのフィールドのすべての翻訳を作成するためにsyncメソッドを作成することでした。将来私は新しい言語を追加する必要があります、私は再びそれを実行する必要があります。ここ
そのためのコードは次のとおりです。
$locales = array('spa', 'eng', 'por');
$models = array('Event', 'News', 'Promotion', 'Shop', 'ShopCategory');
foreach ($models as $model)
{
$this->loadModel($model);
$records = $this->{$model}->find('all', array(
'fields' => array("*"),
'contain' => FALSE
));
$fields = $this->{$model}->actsAs['Translate'];
foreach ($records as $record)
{
foreach ($fields as $field)
{
foreach ($locales as $locale)
{
$content = mysql_real_escape_string($record[$model][$field]);
$this->{$model}->query("INSERT INTO `i18n` (`locale`, `model`, `foreign_key`, `field`, `content`) VALUES('{$locale}', '{$model}', '{$record[$model]['id']}', '{$field}', '{$content}');");
}
}
}
}
ヒント:ロケール、モデル、FOREIGN_KEYとフィールドのキーと国際化テーブルに一意のインデックスを作成します。
元のデータがすべての言語で複製されたので、私は指定した言語で新しいレコードを作成できる必要があります。問題は、英語で新しいレコードを作成すると、スペイン語で更新できるはずですが、スペイン語のレコードがないため、CMSのレコードが表示されず、編集できません。 私がこれを解決したのは、新しいレコードを作成するときに各言語のi18nレコードを作成することですが、レコードを編集するときは現在の言語でのみ編集します。
私は翻訳の行動のため、この修正に使用: http://bin.cakephp.org/view/1939852942
をしかし、この変形例にほとんどの例では、フォームでフォーム入力を作成する必要があること言った: はの$ this - >フォーム - >入力( '名前をエコー.eng '); echo $ this-> Form-> input( 'name.spa'); echo $ this-> Form-> input( 'description.eng'); echo $ this-> Form-> input( 'description.spa');
私は、これは迷惑を見つけるので、私は基本的に、このデータ構造に翻訳可能なフィールドを変換するapp_controllerにヘルパー関数を作った:
function _expandLocalizations($data)
{
foreach ($data as $modelName => $modelData)
{
if (!isset($modelData[$this->{$modelName}->primaryKey]))
{
foreach ($this->{$modelName}->actsAs['Translate'] as $field)
{
$translations = array();
foreach ($this->languages as $language)
{
$translations[$language] = $this->data[$modelName][$field];
}
$data[$modelName][$field] = $translations;
}
}
}
return $data;
}
、すべてではメソッドを追加します。
if (!empty($this->data))
{
$this->News->set($this->data);
if ($this->News->validates())
{
$this->News->create();
$data = $this->_expandLocalizations($this->data);
$saved = $this->News->save($data);
if ($saved)
{
この方法で私は従来のフォームを使用できます。新しい言語を追加すると、ビューを変更する必要はありません。 私はバリデーションのために提出されたデータが必要であるが、保存のために変更されたデータが必要なので、tradicional baked addメソッドを変更する必要があります。
は最後に、私は、サイト/管理者の中に言語を変更するため、この手順に従っ:http://nuts-and-bolts-of-cakephp.com/2008/11/28/cakephp-url-based-language-switching-for-i18n-and-l10n-internationalization-and-localization/
だから、基本的にそれはそれです。 1. DBに既に存在するすべてのデータの翻訳を作成します。各データはすべての言語にコピーされます。 2.作成時に新しいレコードのすべての翻訳を作成し、すべて同じ値を使用します。 3.選択した翻訳のすべてのレコードを編集します。
そして、2番目の回答は「いいえ」と思われます。 –