本地化数据库记录的最佳方法

时间:2012-06-12 10:31:25

标签: ruby-on-rails activerecord localization internationalization translation

例如,我有项目模型和5个可用的区域设置。用户应该能够创建本地化到这5个区域设置的项目吗? 添加此类功能的最佳方法是什么,是否有一些导轨方式? 我知道我应该将所有这些翻译存储在数据库中,但每个字段的text_entext_pttext_estext_frtext_it等内容让我感到害怕。 你能给我一个建议吗?谢谢!

UPD。好像我找到了工作的好工具https://github.com/svenfuchs/globalize3:)

3 个答案:

答案 0 :(得分: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

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

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

希望它有所帮助!

答案 1 :(得分: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

答案 2 :(得分:0)

我会创建另一个表。主表只保留文本的键。第二个表将使用字段键和本地化键保持本地化文本。当然,文本键+本地化键应该是唯一的。

您可以选择一种语言作为主要语言。因此,例如英语文本对另一个人来说是关键。

希望有所帮助......