多语言社交网站 - 数据库驱动?

时间:2010-08-26 14:44:27

标签: php database multilingual

要存储多语言内容,如果它们存储在数据库或文件中,会有很多内容吗?什么是解决这个问题的基本方法,我们有页面内容,参考表,页面标题栏,元数据等。那么每个表格都会为每种语言添加额外的列吗?因此,如果有50种语言(数字将继续增长,因为这是一个全社会网站,所以最终的目标是拥有尽可能多的语言),然后每桌50个额外的列?或者有更好的方法吗?

动态系统和用户内容+静态内容混合在一起。

可扩展性和性能非常重要。用PHP和MySQL开发。

用户可以在页脚的任何页面上更改语言。语言可以基于会话,也可以基于偏好。不确定什么是更好的路线?

5 个答案:

答案 0 :(得分:3)

如果你有一个变量,今天基本上未知的语言数量,那么肯定不应该是记录中的多个列。基本上,此表上的搜索键应该是消息ID加上语言ID,或者屏幕ID加上消息ID加上语言ID。然后,每条消息的每种语言都有一个单独的记录。

如果您尝试将所有语言塞入一条记录中,您的维护将成为一场噩梦。每次你向应用程序添加另一种语言时,你都必须通过每个程序添加“else if if language =='Tagalog'then text = column62”或者其他什么。将它作为搜索键的一部分,然后你只需阅读“messageId ='Foobar'和language = current_language”,然后传递当前语言。如果您使用的是新语言,则除了将新语言添加到某些地方的有效语言代码列表外,不需要进行任何更改。

答案 1 :(得分:2)

所以真正的问题是:

等等等等。我应该将数据保存在平面文件还是数据库中?

简短的回答是您觉得更容易使用的。根据您的结构,基于文件的方法可能比数据库方法更快。 OTOH,弄错了,性能影响将是巨大的。数据库方法从一开始就强制执行更一致的结构。因此,如果您在进行中进行补充,那么从长远来看,数据库方法可能会得到回报。

  

最终的目标是拥有尽可能多的语言),然后每个表增加50个列?

没有。

如果每次添加新语言(或新内容)时都需要更改数据库架构(或文件结构),那么您的架构是错误的。如果您不了解如何正确建模数据,那么我强烈建议您使用数据库方法。

您还应该学习如何规范化数据 - 即使您最终选择使用非关系数据库来保存数据。

答案 2 :(得分:0)

您可能会觉得这很有用:

本文介绍了如何为多语言网站设计数据库以及使用的php函数。

答案 3 :(得分:0)

绝对从一个定义良好的模型开始,因此您的设计并不关心数据是来自文件,数据库甚至是memCache还是类似的东西。可能最好每页执行一次调用以获取包含该单个页面的所有字段的对象,而不是多次调用。您可以引用该单个返回的对象来获取每个本地化字段。在幕后,您可以编写存储库访问和测试代码。就个人而言,我可能会在文件上使用数据库方法 - 您不必担心并发文件访问,并且可能更容易部署更改 - 再次您不必担心文件被读取锁定部署新文件 - 只是一个数据库更新。

请参阅此php ioc链接,这可能会对您有所帮助,因为这样您就可以从代码中抽象出用于保存数据的存储库类型。这样,如果你采用一种方法,之后你想要改变它 - 你将不必做那么多的返工。

答案 4 :(得分:0)

没有理由需要为所有“内容”坚持使用一个数据源。有动态内容将定期添加或更新,然后有相对静态的内容很少被修改。然后是外围内容,如系统消息和菜单文本,与主要内容 - 用户实际在这里看到的内容。您很少需要搜索或索引外围设备内容,而您可能希望能够对主要内容运行查询。

在大多数情况下,应将动态内容和主要内容放在数据库中。静态外围设备内容可以放在数据库中,也可以不放入。如果网站由专业的Web开发人员维护,那么将它放在数据库中是没有意义的,他们可能会发现使用命令行工具直接编辑.pot.po文件会更方便。

在SO上搜索标签i18n和l10n,了解有关实施国际化/本地化的更多信息。至于如何设计数据库模式,这是一个值得自己提出问题的主题。我会按照symcbean的建议搜索规范化问题,并查阅一些关于数据库设计的教程。