2

Symfony2 で特定の言語の個人プロジェクト用の Web サイトを開発しました。私はコードを開発する際に安全なアプローチに従うのが好きなので、たとえそれが最もばかげたことであっても、すべてをプログラムするには通常長い時間がかかります。私の現在の計画は、ディレクトリ ビジネス Web サイト (楽器会社としましょう) を実装して、世界中の誰もがアカウントを作成してビジネスを登録できるようにすることです。

私が行ったことは、すべてをゼロから実装したことです。セキュリティ バンドル、Business {name, location, phone, email, information, etc.}、BusinessCategory {name, information etc.} などのいくつかの基本的なエンティティ、およびいくつかのカスタムですが、それらの間の単純な関係。ユーザーは、アカウントを正常に登録してから、ビジネスを登録できます。また、config.yml のロケールと英語のカスタム翻訳を使用して、ウェブサイトに表示されるすべての単語またはフレーズの翻訳を実装しました。たとえば、中国語またはスペイン語です。ユーザーが「英語」または「スペイン語」のリンクをクリックすると、すべてが選択した言語に翻訳され、Web サイトのエイリアスが website.com/en から website.com/es に変更されます。

私の次のステップは次のとおりです。

  • ユーザーが英語またはスペイン語で登録できるようにしたい。現在、mysql データベースにはそのビジネスのエントリが 1 つしかなく、翻訳は Web サイトのテキストに対してのみ存在します。ビジネスの「名前」、住所など、ユーザーが同じフィールドに英語のデータとスペイン語のデータを入力できるようにしたいと考えています。これには、異なるロケールと同じビジネスで 2 つのエントリが必要になる可能性があります。

  • Web サイトを、ユーザーの翻訳に現在存在するラベルの翻訳と一致させたい。これは、「スペイン語」を選択すると、すべてがスペイン語に翻訳され、そのビジネスのスペイン語の行が表示されることを意味します。

  • 言語用に購入したドメインを使用したい 可能であれば、Website.com、Website.es、Website.it など。ブラウザのアドレスバーに website.it と入力すると、すべてイタリア語で自動的に表示されます。

私の主な懸念事項は次のとおりです。

  • 翻訳可能なバンドルを使用すると、ビジネスごとに追加の行が作成されます。それらはどのように接続されますか?つまり、ID 1234 の X ビジネスはスペイン語になり、名前が Y に翻訳された同じビジネスは ID 1235 になります。symfony2 は、これら 2 つのビジネスが別のロケールで同じものであることをどうやって知るのでしょうか?

  • 結合されたテーブルはどうなりますか? User テーブルは、Group テーブルにリンクされている Business テーブルにリンクされています。ビジネス テーブルのみに翻訳可能な拡張機能を使用すると、他のテーブルにどのような影響がありますか?

4

2 に答える 2

4

確かに、私が 2 年前に調べたとき、私はこれを深く調べていませんでした。しかし:

翻訳可能なバンドルを使用すると、ビジネスごとに追加の行が作成されます。それらはどのように接続されますか?

多言語データを同じデータベースに保持するには、いくつかの方法があります。

最初の、最も簡単で最も一般的な方法は、サブテーブルを管理することです。本質的に、 というテーブルがある場合、翻訳されたフィールドを保持companyする別のテーブルを作成して管理しcompany_translationsます。アプリ レベルでは、それに応じてプロパティ呼び出しを伝播します。場合によっては、マスター テーブルにベース ロケールの翻訳が保持されることがあります。ここでの大きな欠点の 1 つは、必要な詳細をすべて取得するための余分な結合です。もう 1 つは、SQL レベルで定義された照合規則の利点が失われることです。company_idlocale

もう 1 つは、その名前のフィールドを使用してロケールの参照を保持し、ベース ロケールを何らかのparent_id. ここでの合理的な理由は、eg tagsandsectorsなど、必要なものはとにかく翻訳する必要があるため、そこにあるすべてのものを放り投げた方がよいということです。しかし、それは確かにあまり一般的ではありません。ここでの大きな欠点は、ここでも、SQL レベルで定義された照合ルールの利点が失われることです。

さらに別の方法として、異なるテーブルのセットにロケールのプレフィックスを付けるか、ロケール固有のスキーマを使用する方法があります。したがって、照合関連の問題を導入しない前者のバリエーションですが、アプリ レベルでのテーブル プレフィックスや検索パスに関する懸念が導入されます。

最後のオプションは、まったく気にせず、ロケールごとに個別のテーブル セット (つまり、新しいアプリ) を作成することです。それらが別個の (独立した) スキーマまたはデータベースにあるかどうかはほとんど問題ではありません。(Fwiw、これは私の好みの方法です。以下を参照してください。)

メモリが機能する場合、Doctrine はこれらのアプローチの最初のものをマスター テーブルのベース ロケールで使用します。

つまり、ID 1234 を持つ X ビジネスはスペイン語になり、名前が Y に翻訳された同じビジネスは ID 1235 になります。symfony2 は、これら 2 つのビジネスが別のロケールで同じものであることをどうやって知るのでしょうか?

上記を参照してください。ただし、米国に住むヒスパニック系人口向けのサイトを構築している場合を除き、これはおそらく心配する必要がないことに注意してください。

ここで心に留めておくべき点は、en_USウェブサイトの逐語的なコピーをes_MXユーザーに提供している場合、マーケティング/コミュニケーションの面で非常に間違ったことをしている可能性が高いということです.2つの集団に同じように伝えていないだけです.仕方。たとえば、「Gringos no son bienvenidas. さらに、適切な翻訳が存在しないときに予期しないロケールを提供するようにフォールバックすると、間違いなく視聴者に不利益をもたらします。

結合されたテーブルはどうなりますか? User テーブルは、Group テーブルにリンクされている Business テーブルにリンクされています。ビジネス テーブルのみに翻訳可能な拡張機能を使用すると、他のテーブルにどのような影響がありますか?

最初のポイントを参照してください。プラス面としては、Doctrine の振る舞いがこれを管理してくれます。マイナス面では、動作を使用して余分な結合を導入しています。

別の方法として、2 セットの独立したテーブルを使用し、Doctrine がセッションのロケールに基づいてデータを取得する場所を構成することをお勧めします。しかし、これは非常に個人的な意見です。

于 2013-05-16T20:07:14.987 に答える