私はSymfony2フレームワークでDoctrineを使ってレコードのローカリゼーションを管理しようとしています。Symfony2 + Doctrine2:レコードを適切にローカライズするには?
要件は、レコード
を達成するために、あらゆる種類の開発者にやさしい再利用可能なパターンを翻訳する
- 能力です私は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
は、すべての変換されたデータを単一のテーブルに保存するということです。これは、パフォーマンスと危機シナリオの両方の観点から正しいとは感じません。各テーブルのローカライズされたデータを集約するのではなく、独自のテーブルにまとめるほうがはるかに組織化されています。今のところ、私はピーターの答えを受け入れました。より良い答えが出たら、私は切り替えを検討します。乾杯!
お返事ありがとうございます。私の全ポイントは、すべてのロケールでレコード*を利用できないようにすることです。 Doctrineが気にしない限り、私のアプリはそれを扱う心配がありません。しかし、これを実現させることが可能であれば、具体的な解決策には立っていません。長い目で見れば、ロケールが追加されたときはいつでもエンティティを追加する必要があります。 – Maurice
最初のアプローチは、既存のエンティティ内の追加のプロパティに基づいています。フィルタリングは、 "findAllProductsByLocale()"のようなメソッドを実装するリポジトリ実装に基づいて簡単に行うことができます。このプロパティはフォームで公開する必要はなく、代わりにフォームを処理するコントローラによって挿入することができます。 Symfony 2はロケールに基づいたURLをサポートしているので、ロケール文字列はフレームワークによって簡単に取り戻されます。だから、このアプローチは簡単です。 – Peter
もう1つの方法は、Doctrine Extensionを使って、重複した挿入に関するデフォルトの振る舞いを、デフォルトと曖昧さのないロケールの両方に変更します。これにより、拡張子は更新できなくなります。これはSymonfy - Coreをハックするようなものです。 – Peter