用于翻译的MySQL结构

时间:2011-05-10 11:57:51

标签: mysql database multilingual

根据此方法,第一个表中的默认语言已翻译。如果用户不需要翻译,他就不会挣扎。只需连接主表,就是所有......

产品表(InnoDB):

 Obj_id(PK)             name                    desc
 ---------      -------------------     ------------------
     1          Million Dollar Baby    Short description is...
     2          Music Album            Another explanation...

翻译表(InnoDB)

 trans_id (PK)    Obj_id (FK)   lang      field              trans
--------------   -----------   ------    --------    ---------------------
      22              1          TR        name       Milyonluk Bebek
      23              1          BA        name       Djevojka od milijun...
      24              1          TR        desc       Kisa açiklama burada
      25              1          BA        desc       Kratki opis je ovdje
      26              2          BA        name       Glazba albuma

但是当管理员想要更改默认语言时会出现问题。我有两种方法可以解决这个问题:

  1. 管理员必须在项目开始时决定default_lang,如果他以后仍想更改default_lang,程序会说:Go to hell

  2. 与第一个解决方案一样,admin必须首先决定default_lang,但系统将能够将新的default_lang数据从转换表传输到主表(我实际上并没有这样做)。

    < / LI>

    我认为我的解决方案不够好。

    你是否更好地了解DEFAULT_LANG问题,无论是否改变结构(如果可能的话,不要改变结构 - 我喜欢它)?

4 个答案:

答案 0 :(得分:4)

我想知道每种语言的表格会更好。这样你就可以换掉正在使用的表格。

TRANSLATIONS_TR
TRANSLATIONS_EN
TRANSLATIONS_FR
TRANSLATIONS_BR

然后在您的用户显示例程中,您决定在显示翻译文本时要查询的表。

答案 1 :(得分:1)

我认为我的方法是(我正在自己构建这个过程):

可能(1)产品有(N)名称(取决于语言,假设您只有一列描述语言,例如'es','en')

[ Product ]—(1)—————(N)-[ProductName]
|    id   |             | name      |
                        | language  |

在N:M关系中,也许是更好的产品语言:

[ Product ]-(N)—————————(M)-[Language]
|   id    |        |        |iso_code|
             (translation)  | name   |


[   Product   ]<————[ProdTranslation]———>[language]
|    id       |     | name          |    |iso_code|
|default name?|                          | name   |--- (name of language: "English")

另一个选择可能是将产品的每个翻译都视为“类型”产品(子类)。逻辑模型如下:

[   Product   ]
|    id       |-(1)————(1)-[ EnglishProduct ]
|default name?|            | name (in eng.) |
|             |
|             |-(1)——(1)-[FrenchProduct]
|             |          | name(in fr.)|

当在关系数据库中实现它时,你可以a)有3个表(在这个例子中,更多用于更多语言)或b)将它们全部放在一个表中。这取决于您将拥有多少种语言,名称/描述的大小,性能等。

[ Product ]
| id      |
| name_en |
| name_fr |
| name_de |

查询数据库的代码将知道要使用的语言,然后从右列查询名称。

答案 2 :(得分:0)

你看过gettext吗?

http://www.gnu.org/software/gettext/

答案 3 :(得分:0)

gettext解决了一个与多语言数据库不同的问题:gettext用于UI,而数据库用于内容。

您可以使用gettext或等效的工具,例如错误消息,按钮标签或页面标题,其中有一小部分不经常更改的项目。

多语言数据库适用于大量内容,可能会或可能不会经常更改,例如,数十万本书籍和电影的标题,或者招标说明。