繁体   English   中英

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

[英]How to structure a database for simple multilanguage website (PHP MySQL)?

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

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

然后为语言创建表格

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

您应该做的是使用语言环境,并为内容提供默认值。 因为虽然您可能会认为您总是会创建一个内容的两个版本,但是在一个不太完美的世界中,这并不总是会发生。

因此,您首先要创建模型以反映这种关系。 为简单起见,我仅将其称为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则用于键=>值转换。 (不过,这不适用于长内容翻译)。

当您知道要使用的语言环境时,只需执行查询以选择联接即可。

美丽

但是,所有这些功能的好处在于,如果您还没有为特定语言版本创建内容,那么您仍然可以默认并滚动到原始文章/内容所使用的基本语言。

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

如果仅要使用两种语言,并且特定于语言的字段数量不多,则将所有内容保存在一个数据库中是可行的方法。

但是从长远来看,最好将其分为两个数据库,其中一个数据库保存不依赖于语言的数据,另一个数据库进行翻译。 这将使您将来可以轻松添加更多语言

“新闻”数据库:

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

“翻译”数据库:

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

但是,在某些情况下这可能也会变慢。 不知道该网站获得了多少流量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM