我在一年多前开发了一个网站。内容是两种语言,现在我需要构建一个数据库驱动的更新/数据插入系统,以便他们插入一些新闻,事件等。 是创建这样的表的最佳方法:
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
然后为语言创建一个表
答案 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)我认为那些也可能与语言有关吗?