0

我正在尝试建立一种方法来提供翻译,只要找不到翻译,它就可以回退到提供原始文本。

我有一些“标准”表,其中包含原始语言中的各种内容(帖子、菜单等),然后是一个“主”翻译表,其中包含由语言键标识的翻译值、内容类型参考和翻译项目的ID。

例如:

table_posts

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

表翻译

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

在搜索 id 或没有 where 子句时,我设法让它工作,但每当我需要基于 slug 进行搜索时,我都会卡住。我想要的是,如果 slug 是“关于我们”但翻译表中没有条目,它应该搜索原始语言的相应内容,反之亦然。

到目前为止,我设法使用 IFNULLs(或 COALESCEs)来提供找到的内容,但我无法找到一种可靠的方法来放入 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 =....

我一辈子都不能告诉它搜索翻译的 slug,如果在翻译表中找不到,则获取原始 slug 并使用它来获取翻译内容(如果有,则获取原始内容)。

我希望我清楚它应该如何工作......我现在担心的是我从错误的角度看待问题,并且有更简单的方法来解决这个问题。我尝试查看第三方代码,例如 Joomla 的“JoomFish”扩展,以了解它是如何工作的,但这是循环和内部循环的三重奏,我无法真正理解它。

有没有更好的方法来解决这个问题?一般是怎么做的?我是否需要重构整个数据库架构,比如为每种语言使用一个表?

编辑:

我正在使用 WHERE 子句在具有该 slug 的翻译表中搜索指定的记录;如果没有找到它,则意味着我们正在寻找原始语言的网站,或者我们正在寻找另一种语言但缺少翻译(该作品的)。总而言之,我的意图是:

我有仅由蛞蝓制作的 URL。那么当蛞蝓是另一种语言时,我该如何搜索内容呢?

4

2 回答 2

0

我认为这COALESCE是执行任务的最简单方法,但是您可以使用 aJOIN来避免子查询并仅使用WHEREon slug来提高性能。

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 回答
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 =....

无论如何,这是一种不方便的翻译方式......更常见的方式是每个表都有翻译,这样你只需要一个选择来获取数据。通常你有一个表category和一个包含诸如category_descriptionorcategory_text等​​翻译的表。在这里你每行存储所有翻译(名称、描述、slug、关键字、标签等)。

当您设置了某些语言时,还应在应用程序的管理部分确保没有没有翻译的条目 - 您应该设置主要语言,然后在存储类别记录时检查是否有其他语言的翻译如果不是,我会从主要语言复制翻译(应该始终设置)。

于 2012-11-28T10:40:47.763 回答