【问题标题】:Design Database Architecture: DB for use with a couple different languages设计数据库架构:用于几种不同语言的数据库
【发布时间】:2012-06-22 20:11:09
【问题描述】:

我有一个网站,应该将相同的内容翻译成不同的语言。所以它应该有相同字符串的不同翻译的数据库条目。 它不仅仅是一个小网站,所以有很多不同的复杂数据结构。

我有一个想法如何实现这一点。但我不是很喜欢。

我想引入一个额外的翻译表,计划存储不同语言的字符串字段。

例如对于包含三个字符串字段(name、shortDescr、fullDescr)的表 Project,我将按以下方式使用 Translation 表:

alt text http://a.imageshack.us/img576/7948/2deldbtop.png

我会将 name、shortDescr、fullDescr 字段从字符串更改为整数(包含链接(ID)到 translationTxtID)。不同的 translationTxtID 和 lang 字段将为每个字符串标记和语言定义唯一的字符串。 所以这个解决方案会起作用,但我正在寻找更优雅的解决方案。你能建议我解决这个问题吗?

【问题讨论】:

标签: database-design localization translation


【解决方案1】:

你能建议我解决这个问题吗?

是的。

不要使用整数键。确实,不要自己发明。只需使用gettext。您已经在几乎所有操作系统上都可以使用它。它是一款快速且经过验证的软件,您无需编写。

执行标准 gettext 模块为 i18n 所做的工作。 (见http://en.wikipedia.org/wiki/GNU_gettext

  1. 使用文本键。

  2. 选择区域设置(即“C”区域设置,或您编写软件的区域设置)。

  3. 将所有消息作为默认语言环境中的字符串放入“项目”表中。

  4. 将所有翻译与原始字符串和 I18N 语言环境一起放入“翻译”表中以将其翻译成。是的,翻译表由一个大而长的字符串作为键。这在实践中非常有效,因为 (1) 您没有那么多字符串,(2) 您不经常查找它们,以及 (3) 您应该使用 gettext,而不是自己滚动。

  5. 当您向用户提供任何数据时,您会尝试 SELECT 来获取翻译。如果能找到翻译就好了。

    如果您没有找到翻译,那么您使用的密钥是默认字符串,这总比没有好。在某处记录异常,并显示原始字符串。

【讨论】:

  • 谢谢!我认为这是最好的解决方案!
【解决方案2】:

为什么不在表格中有多个条目,每个语言一个? 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

你对那个特定会话的所有查询保持懒散。

【讨论】:

  • 这个问题是如果表有其他不可本地化的字段。然后你最终会重复导致维护头痛的其他数据。
【解决方案3】:

我为每个包含字符串的父表使用本地化表。因此,如果您有一个表“Project”,那么您也将有一个表“Project_Locale”。 Project_Locale 具有与 Project 相同的 PK + 添加“文化”字段。所有可本地化的字符串字段都放在 Project_Locale 中,其他所有内容都放在 Project 中。

【讨论】:

    【解决方案4】:

    我的选择是

    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%
    

    优点:优雅而简单
    缺点:大量表格

    【讨论】:

      【解决方案5】:

      在.net中,我们使用的是rick strahl设计的sql本地化数据库。

      Data Driven ASP.NET Localization Resource Provider and Editor

      【讨论】:

        猜你喜欢
        • 2018-12-03
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        相关资源
        最近更新 更多