我有一个网站,应该在不同的语言上翻译相同的内容。所以它应该具有相同字符串的不同翻译的数据库条目。 它不仅仅是一个小型网站,因此存在许多不同的复杂数据结构。
我有一个想法如何实现这一点。但我真的不喜欢它。
我想介绍一个额外的翻译表,计划在不同的语言中存储字符串字段。
例如对于表Project,它包含三个字符串字段(name,shortDescr,fullDescr),我将在下一个方式使用Translation表:
alt text http://a.imageshack.us/img576/7948/2deldbtop.png
我将name,shortDescr,fullDescr字段从字符串更改为整数(包含link(ID)到translationTxtID)。不同的translationTxtID和lang字段将为每个字符串标记和语言定义唯一字符串。 所以这个解决方案会起作用,但我正在寻找更优雅的解决方案。你能建议我解决这个问题吗?
答案 0 :(得分:4)
你能建议我解决这个问题吗?
是
不要使用整数键。的确,不要自己发明。只需使用gettext
即可。几乎每个操作系统都可以使用它。它是您不需要编写的快速,经过验证的软件。
执行标准gettext
模块为i18n做的事情。 (见http://en.wikipedia.org/wiki/GNU_gettext)
使用文本键。
选择一个区域设置(即“C”区域设置或您编写软件的区域设置)。
将所有消息作为默认语言环境中的字符串放入“Project”表中。
将所有翻译放入“翻译”表中,并使用原始字符串和I18N语言环境将其翻译为。是的,翻译表由一个很大的长字符串键控。这在实践中很有效,因为(1)你没有那么多的字符串,(2)你不经常查找它们,(3)你应该使用gettext,而不是自己编写。
当您向用户显示任何数据时,您尝试使用SELECT来获取翻译。如果你找到翻译,那很好。
如果你没有找到翻译,那么他们使用的键是默认字符串,这比没有好。在某处记录异常,并显示原始字符串。
答案 1 :(得分:0)
为什么表中没有多个条目,每个条目一个? PK可以是ID和LangID的组合。对于上面的例子:
Project
ID, int
LangId, int
Name, varchar
shortDesc, varchar
Fulldesc, varchar
date, date
然后你需要在代码中设置一个语言变量,并在你的查询中将它作为查询中的一个选项(我在这里使用SQL作为参考):
SELECT (columns)
FROM Project
WHERE ID = @id
and LangId = @langid
您通过该特定会话的所有查询保持langid。
答案 2 :(得分:0)
我为包含字符串的每个父表使用本地化表。因此,如果您有一个表“Project”,您还可以使用表“Project_Locale”。 Project_Locale与Project +具有相同的PK +添加了“Culture”字段。所有可本地化的字符串字段都在Project_Locale中,其他所有字符串都在Project中。
答案 3 :(得分:0)
我的选择是
Project
-------
ProjectID (PK)
Date
ProjectLoc
----------
ProjectID (FK)
Lang
Name
ShortDesc
FullDesc
然后你可以运行像
这样的简单查询SELECT Project.ProjectID, Date, Name, ShortDesc, FullDesc
FROM Project
LEFT JOIN ProjectLoc ON Project.ProjectID = ProjectLoc.ProjectID
WHERE ProjectLoc.Lang = %CurrentLang%
优点:优雅而简单的 缺点:大量表格
答案 4 :(得分:0)
在.net中,我们使用的是由rick strahl设计的sql Localization数据库。
请参阅 Data Driven ASP.NET Localization Resource Provider and Editor