2011-05-10 68 views
5

根据这种方法,默认语言是已经在第一个表中翻译了。如果用户不需要翻译,他不会与他们斗争。只需连接主表,这一切......用于翻译的MySQL结构

产品表(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数据从转换表传输到主表(我不这么做)。

我觉得我的解决方案不够好。

对于DEFAULT_LANG问题,如果有或者没有改变结构(如果可能的话,不要改变结构 - 我喜欢它),你有更好的想法吗?

+6

+ 1将'Go to hell'消息发给Admin。 – 2011-05-10 12:02:09

回答

0

你看过gettext吗?

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

+0

是的,但我不喜欢它。它对我来说有几个问题。谢谢你的建议.. – dino 2011-05-10 12:02:33

+1

你有哪些问题? – programmersbook 2011-05-10 12:47:23

+0

@progrsm ...管理员想要在将来更改默认语言时出现问题..所以我必须将NEW DEFAULT_LANG从TRANSLATION表传输到PRODUCT(PRIMARY)TABLE。 – dino 2011-05-10 12:49:21

4

我不知道是否有每种语言的表会更好。这样你就可以切换正在使用的表格。

TRANSLATIONS_TR 
TRANSLATIONS_EN 
TRANSLATIONS_FR 
TRANSLATIONS_BR 

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

0

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

你会使用gettext或同等的灯具,如错误消息,按钮标签或页面标题,其中有一小部分不经常更改的项目列表。

多语言数据库适用于大量的内容,可能会或可能不会频繁更改,例如成百上千的书籍和电影的标题或投标说明。

+0

gettext的问题对我来说(我以前用它来进行Wordpress翻译)是同义词。例如,我在我的软件中使用'Class'两个不同的地方(其中一个用于'分类',另一个用于'学校课程')。这适用于英语,但是当我想翻译它时,这是其他语言的问题。也许gettext解决了这个问题。 – dino 2011-05-11 09:59:45

1

我的做法,我认为这将是(我在建设这个我自己的过程):

也许(1)产品具有(N)名称(取决于语言,假设你只有一列描述语言,如“上课”,“恩”)

[ 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") 

另一种选择可能是考虑机生产线的每个翻译ct是“产品类型”(一个子类)。逻辑模型如下:

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

当在关系数据库中实现这一点,那么你既可以一)有3个表(在这个例子中,多用更多的语言)或b)把它们都放在一个表。这取决于你需要多少语言都有,尺寸的名称/描述,性能等

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

使用查询数据库会知道的语言的代码,然后从右边栏查询名称。