多语言数据库

时间:2012-12-29 16:52:58

标签: android database database-design localization multilingual

我正在开发支持阿拉伯语和英语的Android应用程序,但我仍然对数据库设计感到困惑:

我遵循的方法是

  • 创建一个包含两个记录(阿拉伯语和英语)的语言表
  • 创建一个包含普通数据的表(不是特定于语言的)
  • 创建包含特定语言内容的翻译表

例如,为了实现(帮助),我创建了以下表格:

Language        (int id, text Code)
Help            (int id)
Help_translation(int id, int Help_id, int Language_id, text Question, text Answer)

我已经阅读了这么多时间的解决方案,但我仍然不知道为什么我们为(帮助)设置一个单独的表,什么都不做!

我的方法有问题吗?

1 个答案:

答案 0 :(得分:0)

从表面上看,语言表将在系统中出现一次。我建议使用基于ISO国家代码(ISO 3166)和ISO语言代码(ISO 639-2)的语言和区域的'll_tt'表示法。因此,英国英语可能为en_gb,美国英语为en_us,沙特阿拉伯阿拉伯语为ar_sa,埃及阿拉伯语为ar_eg。这可能比您目前需要的更强大,但为您提供了未来的方向。

因此,语言表可能包含列:

  • id整数(自动增量)主键。
  • code char(5) - Unique。

您设计中的帮助表仅用于“文档”目的。它记录了应用程序可以使用的有效帮助号码。该表的更完整版本可能包含有关消息的信息:在应用程序中使用它的位置;引入了哪个版本;它变得过时的版本(或者可能不是 - 我们有国际化的消息文件,必须在大约10年的时间内用于发布);与版本相关的日期 - 或日期而不是版本;和“翻译员注意事项”(如果需要任何特殊指导原则,如何翻译信息的准则)。

帮助表的简约版本只包含帮助ID号:

  • id整数(自动增量)。主键。

Help_Translation表存储应用程序将显示的字符串。 id列在此处具有最小值;我会省略它(但如果你愿意,你可以保留它)。 Help_ID列是Help表的外键引用; Language_ID列是Language表的外键引用。对于您选择的应用程序,每个帮助项目似乎都有问题和答案。

因此,Help_Translation表包含以下列:

  • id整数(自动增量,可选,不确定何时使用)。
  • Help_ID整数 - 外键引用帮助(ID)。
  • Language_ID整数 - 外键引用语言(ID)。
  • Question text - 给定Help_ID的适当语言的问题。
  • Answer text - 给定Help_ID的相应语言的问题答案。
  • 主键:Help_IDLanguage_ID

另一种设计只包含一个带有“消息ID”和“语言ID”的翻译表以及翻译后的字符串(消息ID和语言ID上的主键)。将有一个消息表,标识有效的消息ID以及先前类型大纲的支持数据。这可能包括当没有特定语言/领域的消息的翻译版本时要使用的默认消息(未翻译)(或者您可以组成更复杂的方案来处理丢失的消息,以便在请求阿拉伯语但翻译时比方说,利比亚(LY)不完整,它会回到ar_sa,然后再回到en_gb)。然后,您的帮助表可能包含一个帮助ID,以及两个消息ID值,一个用于问题,另一个用于答案。这种方案的优点是所有翻译的消息都在一个表中。

毫无疑问,其他方案可以设计出来。