0

翻訳を提供する方法を構築しようとしています。翻訳が見つからない場合はいつでも元のテキストを提供するためにフォールバックできます。

元の言語でさまざまな種類のコンテンツ (投稿、メニューなど) を保持する「標準」テーブルと、言語キー、コンテンツ タイプ参照によって識別される翻訳された値を保持する「マスター」翻訳テーブルがあります。翻訳されたアイテムのID。

例えば:

table_posts

id |     title      |    slug
-------------------------------
 8 | test contenuto | test-contenuto

table_translation

 id |      title    |  slug        | item_id | item_type | language
 ----------------------------------------------------
 1  | test content  | test-content |    8    |    1      |    2

id を検索するとき、または where 句を使用せずに機能させることができましたが、スラッグに基づいて検索する必要があるときはいつでも立ち往生しています。私が望むのは、スラッグが「私たちについて」であるが、翻訳テーブルにエントリがない場合、元の言語でそれぞれのコンテンツを検索する必要があるか、またはその逆であるということです。

これまでのところ、見つかったコンテンツを提供するために IFNULL (または COALESCE) を使用することができましたが、WHERE 条件を設定するための信頼できる方法を見つけることができません。

このクエリ。たとえば、次のように動作します。

SELECT c.id,
  COALESCE(
    (SELECT t.slug FROM translations t WHERE t.id_item = c.id
    AND t.item_type = 1 AND t.language= 2), c.slug
   ) slug, 
  COALESCE( 
    (SELECT t.testo FROM translations t WHERE t.id_item = c.id
    AND t.item_type = 1 AND t.language= 2), c.testo
   ) testo,
    FROM content c
   WHERE c.type= 2 AND c.status = 1 AND c.trash = 0

代わりに、このようなクエリの場合、私は本当に解決できません。

  SELECT cat.id,
  COALESCE (
     (SELECT t.name FROM translations t WHERE t.id_item = cat.id
      AND t.item_type = 2 AND t.language = 2), cat.name
     ) name
  FROM product_categories cat 
  WHERE cat.slug =....

私の人生では、翻訳されたスラッグを検索するように指示することはできません。翻訳テーブルに見つからない場合は、元のスラッグを取得し、それを使用して翻訳されたコンテンツを取得します(存在する場合は元を取得します)。

それがどのように機能するかを明確にしたことを願っています...私の心配は、問題を間違った角度から取ったことであり、これを解決するためのはるかに簡単な方法があります。Joomla の「JoomFish」拡張機能などのサードパーティ コードを調べて、それがどのように機能するかを確認しようとしましたが、それはループと内部ループの 3 つの要素であり、実際には理解できません。

これを解決するより良い方法はありますか?通常はどのように行われますか?各言語のテーブルを使用するなど、DB スキーマ全体をリファクタリングする必要がありますか?

編集:

WHERE 句を使用して、そのスラッグを持つ変換テーブルで指定されたレコードを検索しています。見つからない場合は、サイトを元の言語で探しているか、別の言語で探しているが (その部分の) 翻訳が見つからないことを意味します。全体として、私の意図は次のとおりです。

ナメクジのみで作成された URL があります。では、スラッグが別の言語である場合、コンテンツを検索するにはどうすればよいでしょうか?

4

2 に答える 2

0

私は試してみIF()ます。

このクエリはどうですか:

SELECT cat.id,
    (SELECT t.name 
        FROM translations t 
        WHERE t.id_item = cat.id
            AND t.item_type = 2 
            AND t.language = 2
    ) translation,
    IF(translation, translation, cat.name) as name
FROM product_categories cat 
WHERE cat.slug =....

とにかく、これは翻訳を行うにはちょっと不便な方法です...より一般的な方法は、テーブルごとに翻訳を行うことです。そのようにして、データを取得するために選択する必要があるのは1つだけです。通常、テーブルとやなどcategoryの翻訳を含むテーブルがあります。ここでは、すべての翻訳 (名前、説明、スラッグ、キーワード、タグなど) を 1 行ごとに保存します。category_descriptioncategory_text

また、アプリケーションの管理部分では、いくつかの言語が設定されている場合に、翻訳なしでエントリが存在しないようにする必要があります - メイン言語を設定し、カテゴリのレコードを保存するときに、他の言語の翻訳があるかどうかを確認する必要がありますそうでない場合は、メイン言語から翻訳をコピーします(常に設定する必要があります)。

于 2012-11-28T10:40:47.763 に答える
0

COALESCEタスクを実行する最も簡単な方法だと思いますが、 a を使用してサブクエリJOINを回避し、 on slugのみを使用してパフォーマンスを向上させることができます。WHERE

SELECT cat.id, COALESCE(t.name, cat.name) name
FROM product_categories cat
LEFT OUTER JOIN translations t 
ON t.id_item = cat.id AND t.item_type = 2 AND t.language = 2
WHERE cat.slug =....
于 2012-11-28T11:47:18.677 に答える