2011-10-16 44 views
1

我目前正在使用PHP和MySQL构建一个多语言网站,并且想知道关于本地化的最佳方法是关于我的数据模型。每个表格都包含需要翻译的字段(例如,name,description ....)以多种语言。使用mysql/PHP进行本地化

第一个想法是要建立一个字段为每种语言(例如name_enname_dename_fr),使用变量(例如$entry['name_' . LANGUAGE])从PHP检索适当的字段。虽然它可以工作,但这种方法在我看来有许多缺点:
- 您需要尽可能多地发生每个字段(因为您可以使用en-US,en-CA,en-GB ...) )
- 如果您添加或删除的语言,你需要改变
- 如果你有翻译领域,他们仍然不显得很优化的每个条目创建的数据库结构

第二个想法是创建可用于存储数据库中任何表格的任何字段的翻译的翻译表:

 
---------------- 
translation 
---------------- 
id INT 
table_name VARCHAR 
field_name VARCHAR 
value VARCHAR 
language_id VARCHAR 

table_namefield_name将允许标识翻译是关于哪个表和哪个字段,而language_id将指示翻译如果是哪种语言。这个想法是创建模型,根据用户选择的语言,用相应的翻译来替换可翻译字段的值(例如name,description)。

您可以看到这种方法的缺点吗?你有建议吗?

谢谢。

+0

此问题已被提问。建议你通过SO进行搜索。看看http://stackoverflow.com/questions/6242478/ph​​p-translation-frontend-similar-to-rosetta/6244655#6244655这里http://stackoverflow.com/questions/6000541/multi-language-php-application -best-practice/6000874#6000874 – PurplePilot

+0

正如你从给出的答案中可以看到的那样,仍然有讨论的空间。 – Max

回答

4

其主要缺点是您通过将元数据(如表名和字段名称)存储为应用程序数据来销毁关系模型。您的查询会过于丑陋和无效。

另一个缺点是,您仅限于一种数据类型的可翻译数据。你的表结构将定义

value VARCHAR(255) 

这意味着你将存储,要求在VARCHAR(255)总是更小的现场数据。如果你想拥有它更普遍也储存大量的文字,你需要定义它

value TEXT 

这更是雪上加霜。

流行的模型如下。对于每个实体,您都定义了不依赖于语言的字段以及与语言相关的字段,并始终创建2个表。例如:

products 
-------- 
id 
price 
status 
picture 

products_translations 
-------- 
product_id 
language_id 
name VARCHAR(100) 
description TEXT 

这是正确的关系方法。当然,它也有一个缺点,那就是你总是会连接2个表来获取项目,并且数据的添加/更新变得更复杂一些。

+0

这是有道理的。您是否有参考文件支持您的声明,即您的解决方案是“流行”和“适当”的方法? – Max

+1

这是一个“正确”的方法,因为它保持了数据库设计[链接](http://en.wikipedia.org/wiki/Database_normalization)中的规范化原则,并且它“流行”,因为我已经见过并使用它并在多个教程,书籍和博客中提到。这不是“正确”的方法,因为数据库设计没有对错,对每个特定项目都有可行或不可行的方法。如果你知道只有3种语言,并且在未来3年内不会添加新语言,这不是一种“好”的方法。 –

+0

+1。你在这里以你的客观性赢得了我:) – Max

0

不知道这个答案将满足你,但我两种文本之间的辨别:

  1. 静态
  2. 动态

静态文本是由您自己对一般应用的文字规定,用户对其没有影响。东西像表单输入标签和介绍性文字。我为那些使用gettext,所以如果我需要翻译,我可以将它发送给专业翻译人员。

动态文本是由应用程序,这似乎是你在说什么的用户提供的文本。就我个人而言,我也将动态文本识别为2种不同类型。

  1. 普遍适用
  2. 特定

的一般类型的一个例子是HTML选择元素,或一个标记的系统内的选项。它们不是特定于单个内容元素,但可以应用于多个内容元素。 特定文本的示例可以是CMS内的实际内容,如文章或网上商店中的产品说明。

对于第一个我用一种中央查找表的实际,原文为指标,我指的是在我使用该字符串表的外键的哈希值。然后你在中心表中查找哈希以回应它背后的真实文本(当然,你应该在这里使用某种缓存)。

对于后者我用列的经典内容表对于特定于该逻辑内容单元和用于每一种语言的行的每个内容区域。

到目前为止,它工作得很好。