【问题标题】:Database model for a multilanguage translation module多语言翻译模块的数据库模型
【发布时间】:2018-06-25 00:28:32
【问题描述】:

我需要为后端模块设计一个数据库模型,用户可以将页面内容翻译成多种语言。将被翻译的内容是基本的单词、短语、链接名称、标题、字段名称、字段值。它们也应该分组,以便我可以按组名找到它们。例如,如果页面上有一个以不同颜色作为选项的选择字段,那么我应该能够按组名选择所有这些字段。

这就是我目前所拥有的:

lang
+----+---------+
| id |  name   |
+----+---------+
|  1 | english |
|  2 | german  |
+----+---------+

lang_entity
+----+------------+-------------+-------+-------+
| id |   module   |    group    | name  | order |
+----+------------+-------------+-------+-------+
|  1 | general    |             | hello |     0 |
|  2 | accounting | colorSelect | one   |     1 |
|  3 | accounting | colorSelect | two   |     2 |
|  4 | accounting | colorSelect | three |     3 |
+----+------------+-------------+-------+-------+

lang_entity_translation
+----+---------+----------------+-------------+
| id | lang_id | lang_entity_id | translation |
+----+---------+----------------+-------------+
|  1 |       1 |              1 | Hello       |
|  2 |       2 |              1 | Guten tag   |
|  3 |       1 |              2 | One         |
|  4 |       2 |              2 | Ein         |
|  5 |       1 |              3 | Two         |
|  6 |       2 |              3 | Zwei        |
|  7 |       1 |              4 | Three       |
|  8 |       2 |              4 | Drei        |
+----+---------+----------------+-------------+

所以 lang 表包含不同的语言。

表 lang_entity 具有可以翻译成不同语言的实体。 模块行只是在后端翻译模块中按页面模块对它们进行分组。这也使我有可能为不同的模块拥有具有相同名称的实体。 选择需要如上所述的组,并且可能需要使用多个值的其他一些地方。这也让我可以选择允许用户在一个组中添加和订购实体。

而表 lang_entity_translation 保存每种语言中每个实体的翻译。

所以我的问题是这种设计有明显的缺陷吗?你会推荐一些不同的东西吗?

还有一个额外的问题:我真的不喜欢 lang_entity 表名,您对包含所有已翻译单词/短语的表名有更好的想法吗? :)

编辑:相似,但不重复。链接的问题是关于翻译动态产品并为每种翻译类型提供单独的表格。我说的是翻译整个页面内容,包括单个表格中的组。

【问题讨论】:

标签: php mysql database oracle postgresql


【解决方案1】:

我不明白lang_entityorder 列,但我可能不需要。

设置看起来很合理,但请确保将外键约束从 lang_entity_translation 添加到 languagelang_entity

至于命名,我将表命名为phrasetranslatable

【讨论】:

  • 这是一个不好的例子,因为我有 0,1,2,3 一个接一个。但关键是每个组都有自己的顺序,所以它让用户可以编辑它或者在中间添加一些东西。例如 colorSelect 组值将进入下拉选择字段,并且 order 确定它们在该字段中的顺序。如果一个元素不在一个组中,它的值要么是 emtpy,要么是 0,就像第一个一样。
  • 关于命名我喜欢你建议的可翻译这个词而不是 lang_entity。但是,您会将 lang_entity_translation 命名为 translation 还是 translatable_translation?我倾向于将它们命名为可翻译和翻译。
【解决方案2】:

我们也有类似的情况。这是7年前。 对于不同的语言,我们有不同的专栏。就像我们的名字一样 Name_Eng,Name_Ger,Name_Spa 。我们有 7-10 种语言。

我们为所有语言的名称提供了共同的 id。

基于从 UI 中选择的语言,我们将语言代码传递给后端 在存储过程中,它被附加到列名称 例如,如果选择英语,我们将传递“Eng”,并将列名形成为 Name_Eng 并获取数据。我们使用的是动态查询。

【讨论】:

  • 我不认为这是一个聪明的设计。您在可以避免的地方强制执行动态 SQL。每次添加/删除新语言时都必须更改表结构。
  • 我认为如果您有一组可以保证永远不会改变的语言,这是一个可以接受的解决方案。但对我来说,用户将能够添加/删除语言,所以它不起作用。
猜你喜欢
  • 2011-10-19
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2018-02-25
  • 2019-07-16
相关资源
最近更新 更多