2009-04-13 3 views
2

CakePHPの翻訳動作を徐々に適用する方法を習得していますが、基本を把握していると思いますが、既存のデータを使って既存のプロジェクトに取り掛かります。 Cakeが私のために新しいレコードを挿入するのはすばらしいことですが、手動でいくつかの既存のデータのためにいくつかの翻訳を挿入する必要があります。私の最初の質問:事実の後にCakePHPの翻訳動作を適用する

私のi18nテーブルでen_usのレコードを持っていなければならないのですか?これはデフォルトの言語で、コアテーブルで使用されている言語ですか?例えば、categories.name = 'Entertainment'の場合、 "Entertainment"の英語翻訳を指定するためにi18nに "duplicate"レコードを作成する必要がありますか?経験的な証拠は、はいと言うようですが、それは余分な仕事のように思えます。だから誰かが私に何かを見逃していると言うことができることを願っています。

第2に、データベースへの翻訳レコードを取得する「簡単な」方法はありますか?プロジェクトの進行中に言語が追加されると、古いデータのi18nレコードを作成して作成するのは本当に苦労します。

ありがとうございました。

答えて

0

私は2番目の質問に対する回答はありませんが、最初の質問に対する回答は「はい」と思われます。ソースコードを掘り下げた後、生成されたクエリのwhere句は、検索されるフィールド名が現在のロケールのロケール値を持つものに結果を制限するように見えます。それはかなり限定的です。

​​(これに非常に似ています)があります。

+0

そして、2番目の回答は「いいえ」と思われます。 –

3

は、私は、これは古いですけど、それは未回答だと、私はこれを考え出すいくつかのトラブルになったことから、ここで私の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.選択した翻訳のすべてのレコードを編集します。

0

多くの列で翻訳動作を使用すると、サイトが大幅に遅くなります。 私はそれをスピードアップするために見つけることができる最も簡単な方法は、このインデックスを追加することでした。 このインデックスはcakephp/app/Config/Schema/i18n.sqlでコメントアウトされていますが、理由はわかりません。

ALTER TABLE rabotvins_i18n 
ADD UNIQUE INDEX I18N_LOCALE_FIELD(locale, model, foreign_key, field); 
関連する問題