2

例如,我有项目模型和 5 个可用的语言环境。用户应该能够创建本地化到这 5 个语言环境的项目吗?添加这种功能的最佳方法是什么,有什么方法可以解决这个问题吗?我知道我应该将所有这些翻译存储在数据库中,但是对于每个字段,像text_en, text_pt, text_es, text_fr,之类的东西都让我害怕。text_it你能给我一个建议吗?谢谢!

UPD。似乎我为这项工作找到了不错的工具https://github.com/svenfuchs/globalize3 :)

4

3 回答 3

1

Globalize3 相当不错,是的,但它可能会给更大的项目带来一些麻烦。

主要是因为它为您要翻译的每种数据类型创建一个表。我见过一个包含超过 35 个(!)翻译表的项目,这极大地复杂化了维护。想象一下这个项目的翻译管理系统。您也可以避免一些复杂性。

使用序列化的想法非常好,我会推荐它与 postgres 和jsonb(或hstore)。它仍然允许您进行一些全文搜索:

MyModel.where("name @> ?", {fr: "NomFrancais"}.to_json)

运算符的@>意思是“它包含”。搜索使用的是全文优化,所以成本不是那么高。您可以在这里获取更多信息:

http://www.postgresql.org/docs/9.4/static/datatype-json.html

否则我做了一个gem,它仍然不成熟,但它允许将所有i18n的数据库放在同一个表中:https ://github.com/anykeyh/rails_db_localize

这里的优点是您可以轻松构建翻译界面,并且它完全覆盖您的项目(当您想要翻译字段时无需更新架构)。

在我看来,翻译总是很痛苦,永远不要低估:)

希望能帮助到你!

于 2015-09-07T19:36:12.520 回答
0

您可能希望对依赖于语言环境的数据使用序列化属性,并将标题(或任何内容)定义为哈希:

class Project
  serialize :title, Hash
...

p.title[:pt] = "title in pt"

问题是您将无法对文本值进行 SQL 搜索。如果要按名称搜索项目,只需将依赖于语言环境的属性提取到另一个表中:

class Project
  has_many :titles
end

class Title
  belongs_to :project
  belongs_to :locale # or just put there a string attribute
end
于 2012-06-12T10:46:18.203 回答
0

我会创建另一个表。主表将仅保留文本键。第二个表将保留带有字段键和本地化键的本地化文本。当然文本键+本地化键应该是唯一的。

您将选择一种语言作为主要语言。因此,例如英文文本将是另一个的关键。

希望能帮助到你..

于 2012-06-12T10:52:47.173 回答