例如,我有项目模型和5个可用的区域设置。用户应该能够创建本地化到这5个区域设置的项目吗?
添加此类功能的最佳方法是什么,是否有一些导轨方式?
我知道我应该将所有这些翻译存储在数据库中,但每个字段的text_en
,text_pt
,text_es
,text_fr
,text_it
等内容让我感到害怕。
你能给我一个建议吗?谢谢!
UPD。好像我找到了工作的好工具https://github.com/svenfuchs/globalize3:)
答案 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)
我会创建另一个表。主表只保留文本的键。第二个表将使用字段键和本地化键保持本地化文本。当然,文本键+本地化键应该是唯一的。
您可以选择一种语言作为主要语言。因此,例如英语文本对另一个人来说是关键。
希望有所帮助......