2014-01-11 4 views
7

私はSymfony2フレームワークでDoctrineを使ってレコードのローカリゼーションを管理しようとしています。Symfony2 + Doctrine2:レコードを適切にローカライズするには?

要件は、レコード

  • 1つのロケールでレコードを追加する機能のみ
  • だから、この
  • を達成するために、あらゆる種類の開発者にやさしい再利用可能なパターンを翻訳する

    • 能力です私はDoctrineExtensionsライブラリを実装して、Translatable拡張子を使用しています。どこでも私が読むのは、翻訳を処理するための好ましい方法とみなされます。私はこれがローカリゼーションと同じではないことを認識していますが、これは私が得ようとしているものの中で最も近いようです。

      言い換えれば、翻訳可能な製品を含む製品テーブルがあるとします。私のデフォルト言語は英語です。私はデフォルトの英語ロケールで商品を挿入した後、後でイタリア語を話すために翻訳を追加することができます。 翻訳可能な拡張機能ではできなかったことは、イタリア語ロケールでのみ商品を追加することです。これを行うと、翻訳可能な拡張機能はデフォルト言語(英語)で、イタリア語のコンテンツでも製品を追加します。そして、それはまた、イタリア語の翻訳を加えるようになる。

      私の製品エンティティは次のようになります。

      <?php 
      namespace Acme\DemoBundle\Entity; 
      
      use Gedmo\Mapping\Annotation as Gedmo; 
      use Doctrine\ORM\Mapping as ORM; 
      
      /** 
      * @ORM\Entity 
      * @ORM\Table(name="acmedemobundle_product") 
      */ 
      class Product 
      { 
          /** 
          * @ORM\Column(type="integer") 
          * @ORM\Id 
          * @ORM\GeneratedValue(strategy="AUTO") 
          */ 
          private $id; 
      
          /** 
          * @ORM\Column() 
          * @Gedmo\Translatable 
          */ 
          protected $name; 
          ... 
      } 
      

      デフォルト以外の言語のみにレコードを追加する方法はあります(簡体字)?または私は間違った場所で探していますか?

      -

      symfonyの&教義を使用する前に、私は、要求されたロケールを使用して一緒に結合された2つの表にローカライズされたデータを管理するために使用されました。

      たとえば、productsテーブルは

      • ID
      • CATEGORY_ID

      ようなすべてのロケールindepentデータを含み、products_i18nテーブルは

      • PRODUCT_IDのようなすべてのローカライズされたデータを含んでいました
      • ロケール
      • 説明
      • スラグ

      この方法で、関係、および1つの以上のローカライズされた機能拡張のために使用することができる唯一の主なレコードがあります。ローカライズされた拡張子のないレコードは存在しないとみなされます。

      おそらく、それを達成する方法がありますか?

      -

      正直に言うと、これまでのところ、私はこの特定のテーマに全く多くの有用な情報を見つけていません。私はこの問題を最初に遭遇したとは思いません。

      この件に関するお手伝いをさせていただきます。

      ============== UPDATE

      私は上記の私の例に示すように一緒に2つのテーブルを結びつけるカスタムソリューションで行くことにしました。主な理由は(私は機能が必要)だけでTranslatableは、すべての変換されたデータを単一のテーブルに保存するということです。これは、パフォーマンスと危機シナリオの両方の観点から正しいとは感じません。各テーブルのローカライズされたデータを集約するのではなく、独自のテーブルにまとめるほうがはるかに組織化されています。

      今のところ、私はピーターの答えを受け入れました。より良い答えが出たら、私は切り替えを検討します。乾杯!

    答えて

    0

    この質問は多少の誤解の原因と思われます。ロケールに基づいて特定の地域でのみ商品を利用できるようにする場合は、ロケールに基づいてのみ翻訳が利用可能であることを尋ねることはありません。
    doctrine拡張機能は、あなたの製品のデフォルト翻訳を提供することを主張しています。そうしないと、アプリケーションが要求を正しく処理できなくなります。
    この製品はすべての地域またはロケールゾーンで使用できるため、翻訳されたコンテンツ(名前など)に情報を提供する方法は?
    翻訳された名前のデフォルト設定がない場合、デフォルトゾーン内に表示される製品は名前を解決できません。名前がnullであるため、エンティティは不完全です。のみ、特定のロケールゾーンに製品を追加するには
    、あなたはその後、あなたのフィルタリングエンティティのposssibiltyを与える

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $localeZone; 
    

    として、お使いの製品にプロパティを追加する必要があります。 エンティティプロダクトをMappedEntityとしてセットアップし、ローカルエンティティ用に複数のSubを使用することもできます。これにより、イタリア製品のイタリア製品への保存が変更されます。私は個人的にこの思考が好きではありませんが、それは行動やデータ構造の違いではなく、その中の財産の価値に基づいた目的を区別しているからです。

    +0

    お返事ありがとうございます。私の全ポイントは、すべてのロケールでレコード*を利用できないようにすることです。 Doctrineが気にしない限り、私のアプリはそれを扱う心配がありません。しかし、これを実現させることが可能であれば、具体的な解決策には立っていません。長い目で見れば、ロケールが追加されたときはいつでもエンティティを追加する必要があります。 – Maurice

    +0

    最初のアプローチは、既存のエンティティ内の追加のプロパティに基づいています。フィルタリングは、 "findAllProductsByLocale()"のようなメソッドを実装するリポジトリ実装に基づいて簡単に行うことができます。このプロパティはフォームで公開する必要はなく、代わりにフォームを処理するコントローラによって挿入することができます。 Symfony 2はロケールに基づいたURLをサポートしているので、ロケール文字列はフレームワークによって簡単に取り戻されます。だから、このアプローチは簡単です。 – Peter

    +0

    もう1つの方法は、Doctrine Extensionを使って、重複した挿入に関するデフォルトの振る舞いを、デフォルトと曖昧さのないロケールの両方に変更します。これにより、拡張子は更新できなくなります。これはSymonfy - Coreをハックするようなものです。 – Peter

    1
    +0

    私の質問で述べたように。翻訳可能なものは私のために働いていないものです。私が間違って使っていると思っているのでなければ、別のことをやっていなければならないと思っていることを詳しく教えてください。 – Maurice

    関連する問題