例如,我有项目模型和 5 个可用的语言环境。用户应该能够创建本地化到这 5 个语言环境的项目吗?添加这种功能的最佳方法是什么,有什么方法可以解决这个问题吗?我知道我应该将所有这些翻译存储在数据库中,但是对于每个字段,像text_en
, text_pt
, text_es
, text_fr
,之类的东西都让我害怕。text_it
你能给我一个建议吗?谢谢!
UPD。似乎我为这项工作找到了不错的工具https://github.com/svenfuchs/globalize3 :)
例如,我有项目模型和 5 个可用的语言环境。用户应该能够创建本地化到这 5 个语言环境的项目吗?添加这种功能的最佳方法是什么,有什么方法可以解决这个问题吗?我知道我应该将所有这些翻译存储在数据库中,但是对于每个字段,像text_en
, text_pt
, text_es
, text_fr
,之类的东西都让我害怕。text_it
你能给我一个建议吗?谢谢!
UPD。似乎我为这项工作找到了不错的工具https://github.com/svenfuchs/globalize3 :)
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
这里的优点是您可以轻松构建翻译界面,并且它完全覆盖您的项目(当您想要翻译字段时无需更新架构)。
在我看来,翻译总是很痛苦,永远不要低估:)
希望能帮助到你!
您可能希望对依赖于语言环境的数据使用序列化属性,并将标题(或任何内容)定义为哈希:
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
我会创建另一个表。主表将仅保留文本键。第二个表将保留带有字段键和本地化键的本地化文本。当然文本键+本地化键应该是唯一的。
您将选择一种语言作为主要语言。因此,例如英文文本将是另一个的关键。
希望能帮助到你..