ASP.Net / MySQL:コンテンツを複数の言語に翻訳する
-
08-07-2019 - |
質問
MySQLデータベースをバックエンドに使用するASP.Net Webサイトがあります。ウェブサイトは英語のeコマースシステムであり、約5つの他の言語(フランス語、スペイン語など)に翻訳する可能性を検討しています。人間の翻訳者に翻訳を実行してもらいます-自動化されたサービスを見てきましたが、これらは十分ではありません。
サイトの静的テキスト(見出し、ボタンなど)は、.Netに組み込まれたローカリゼーション機能(resxファイルなど)を介して複数の言語で簡単に提供できます。
多言語コンテンツをデータベースに保存および取得する最適な方法についてはよくわかりません。たとえば、これらのフィールドを含む製品テーブルがあります...
- productId(int)
- categoryId(int)
- タイトル(varchar)
- summary(varchar)
- 説明(テキスト)
- 機能(テキスト)
タイトル、概要、説明、および機能のテキストは、すべての異なる言語で利用できる必要があります。
ここに、私が思いついた2つのオプションを示します...
各言語の追加フィールドを作成 たとえば、すべての言語に対してtitleEn、titleFr、titleEsなどを使用し、すべてのテキスト列に対してこれを繰り返すことができます。次に、選択した言語に応じて適切なフィールドを使用するようにコードを調整します。これは少しハック感があり、非常に大きなテーブルにつながる可能性があります。また、将来さらに言語を追加する場合は、さらに列を追加するのに時間がかかります。
ルックアップテーブルを使用する 次の形式で新しいテーブルを作成できます...
textId | languageId | content
-------------------------------
10 | EN | Car
10 | FR | Voiture
10 | ES | Coche
11 | EN | Bike
11 | FR | Vélo
次に、製品テーブルにテキストを保存するのではなく、タイトル、概要、説明、機能の適切なtextIdを参照するように製品テーブルを調整します。これははるかにエレガントに思えますが、複雑なSQLステートメントを使用せずにデータベースからページにこのデータを取得する簡単な方法は考えられません。もちろん、将来新しい言語を追加することは、前のオプションと比較して非常に簡単です。
これを達成するための最良の方法についての提案に非常に感謝します! 「ベストプラクティス」はありますか?そこにガイダンス?誰もこれをやったことがありますか?
解決
あなたの場合、2つのテーブルを使用することをお勧めします:
Product
-------------------------------
ProductID | Price | Stock
-------------------------------
10 | 10 | 15
ProductLoc
-----------------------------------------------
ProductID | Lang | Name | Description
-----------------------------------------------
10 | EN | Bike | Excellent Bike
10 | ES | Bicicleta | Excelente bici
このように使用できます:
SELECT * FROM
Product LEFT JOIN ProductLoc ON Product.ProductID = ProductLoc.ProductID
AND ProductLoc.Lang = @CurrentLang
(ProductLocテーブルに現在の言語のレコードがない場合に備えて、左結合)
他のヒント
既存のテーブルに新しい列を追加することはお勧めできません。機能に新しい言語を追加するのは本当に難しいでしょう。ルックアップテーブルの方がはるかに優れていますが、翻訳されたレコードの数が多いため、パフォーマンスに問題がある可能性があると思います。
最善の解決策は共有テーブルを持つことだと思います:
products: id, categoryid,
およびすべての言語の同じテーブル
products_en, products_de: product_id (fk), title, price, description, ...
共有されたものから選択し、あなたの言語でテーブルに参加します。利点は、価格、カテゴリなどもローカライズできることです...