如何为简单的多语言网站(PHP MySQL)构建数据库?

时间:2011-03-30 22:56:19

标签: php mysql database data-structures multilingual

我在一年多前开发了一个网站。内容是两种语言,现在我需要构建一个数据库驱动的更新/数据插入系统,以便他们插入一些新闻,事件等。 是创建这样的表的最佳方法:

news_id         int(10) unsigned PK
lang_id         int(2)
status          tinyint(1)
title           varchar(255)
title_en        varchar(255)
title_es        varchar(255)
content         text
content_en      text
content_es      text
date_inserted   datetime
date_modified   datetime
type            varchar(45)
atach           text

然后为语言创建一个表

2 个答案:

答案 0 :(得分:3)

您应该只关心任何一个特定请求的一种语言。虽然您只能选择页面请求所需的语言,但以这种方式组织内容仍然不是最佳做法。

您应该使用区域设置并为内容提供默认值。因为虽然您可能认为您将始终创建一个内容的两个版本,但在一个不完美的世界中,这并不总是会发生。

因此,您首先要创建模型以反映这种关系。为简单起见,我将其称为content。但是你当然可以把你的内容变成任何东西。

`content` (The Table)
id
status
title
content
dataCreated
dateModified
owner

`contentTranslations` (The Table)
id
contentId (FK)
locale
title
content
dateCreated
dateModified

现在,您只需要一种方法来了解用户希望使用的区域设置。我更喜欢使用Zend_Locale来管理我的所有语言环境,而Zend_Translate则用于 key =>值转换。 (但这不适合长内容翻译。)

当您知道要使用的区域设置时,您只需执行查询以通过连接进行选择。

美女

然而,所有这一切的美妙之处在于,如果您尚未为特定语言版本创建内容,那么您仍然可以默认并滚动到您编写原始文章/内容的基本语言。

SELECT c.id, c.status, c.title, c.content
FROM content as c
LEFT JOIN contentTranslations as t
ON c.id = t.contentId
WHERE c.id = 21231 AND t.locale = X

答案 1 :(得分:1)

如果您只使用两种语言并且语言特定字段的数量不高,那么将所有内容保存在一个数据库中即可。

但从长远来看,将它分成两个数据库可能会更好,其中一个数据库包含不依赖于语言的数据,另一个数据库用于翻译。这将允许您以后轻松添加更多语言

“新闻”数据库:

news_id         int(10) 
status          tinyint(1)
date_inserted   datetime
date_modified   datetime
type            varchar(45)
atach           text

“TRANSLATIONS”数据库:

translation_id  int(10) 
news_id         int(10) 
lang_id         int(2)
title           varchar(255)
content         text

但是,在某些情况下这也可能很慢。不确定该网站有多少流量。

顺便说一句:既然我可以看到类型是varchar(45)我认为那些也可能与语言有关吗?