存储多语言字符串的最佳实践

Posted

技术标签:

【中文标题】存储多语言字符串的最佳实践【英文标题】:Best practise for storing multilingual strings 【发布时间】:2012-04-10 22:58:21 【问题描述】:

我需要在 Postgres 表中为不同语言(2-4 种语言)存储不同版本的不太长的字符串。

最好的方法是什么?数组或 JSON 或类似的东西?

【问题讨论】:

【参考方案1】:

首先确保database locale 可以处理不同的语言。使用 UTF-8 服务器编码。可以选择将LC_COLLATE = 'C' 设置为中立,或者使用您的第一语言的排序规则来获得默认排序顺序。首先阅读手册中的Collation Support 章节。

我强烈建议您使用最新版本的 PostgreSQL(撰写本文时为 9.1),因为它具有出色的排序规则支持。

至于表格结构:保持简单。听起来要处理的语言数量很少,数量固定。然后,您可以为每种语言设置一列:

CREATE TABLE txt (
  txt_id serial PRIMARY KEY
 ,txt    text NOT NULL -- master language NOT NULL?
 ,txt_fr text -- others can be NULL?
 ,txt_es text
 ,txt_de text
);

这非常有效,即使对于多种语言也是如此。 NULL storage is very cheap. 如果您要处理不同数量的语言,单独的表可能是更好的解决方案。此解决方案假定您有一种“主语言”,其中始终存在字符串:

CREATE TABLE txt (
  txt_id serial PRIMARY KEY
 ,txt    text NOT NULL -- master language NOT NULL?
);

CREATE TABLE lang (
  lang_abbr text PRIMARY KEY -- de, es, fr, ...
 ,lang      text NOT NULL
 ,note      text
);

或者,如果(两个字母)缩写就足够了,只需创建一个enum type 来识别语言。

CREATE TABLE txt_trans (
  txt_id    int REFERENCES txt(txt_id) ON UPDATE CASCADE ON DELETE CASCADE
 ,lang_abbr text REFERENCES lang(lang_abbr) ON UPDATE CASCADE
 ,txt       text NOT NULL -- master language NOT NULL?
 ,CONSTRAINT txt_trans_pkey PRIMARY KEY (txt_id, lang_abbr)
);

特殊处理主语言并将所有语言变体保留在同一个表中可能会使您的应用程序中的处理更简单。但这真的取决于您的要求。

【讨论】:

您如何看待使用 JSON 数据类型存储附加值(由语言环境代码键入)? @JeremyBaker:数据类型json 是一个很好的解决方案,可以解决大量可能变化的属性。对于满是众所周知的属性的牌(就像在这个例子中)来说,这并不算多。这取决于完整的图片。当被问到这个问题时,Postgres 9.2 有非常基本的 json 支持。自那以后情况有了很大改善,尤其是通过添加jsonb ... 我希望你做的一件事是谈到使用 JSONB 字段存储多种语言的可能性"en_US": "hello", "fr": "bonjour" 第二种情况看起来不错,但是如果有很多“txt”我们该怎么办:目录、产品、标签等等...... 我将所有语言突变存储在 JSONB 列中,就像在 Soviut 答案中一样,例如"en": "hello". "de": "Hallo", "cs": Ahoj,但遇到了查询此列的问题。我有一个案例,我需要找到任何语言的前缀匹配并有效地完成它。到目前为止,我只得到了这样的东西....WHERE title '$.* ? (@ like_regex "^:query.*")

以上是关于存储多语言字符串的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

NetCore 国际化最佳实践

Spring数据国际化最佳实践

gRPC最佳入门教程,Golang/Python/PHP多语言讲解

Vue 工程化最佳实践

使用strings.xml 在数据库上存储多语言值的最佳方法?

多语言 REST 资源 - URL 命名建议