【问题标题】:Best way to localize database records本地化数据库记录的最佳方法
【发布时间】:2012-06-12 10:31:25
【问题描述】:

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

UPD。似乎我找到了适合这项工作的好工具https://github.com/svenfuchs/globalize3 :)

【问题讨论】:

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


    【解决方案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

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

    在我看来,翻译总是很痛苦,绝对不能低估:)

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

        【解决方案3】:

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

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

        希望对你有帮助..

        【讨论】:

        • 选择某种语言的短语作为其他翻译的关键有两个问题:1)你不能轻易改进你的关键语言措辞,因为它会迫使你更新所有其他翻译, 2)在两种上下文中使用的关键语言中的同一个句子可能需要在其他一些语言中进行不同的翻译——这是不可能实现的。一个更好的主意是恕我直言,使用一些与语言无关的符号,并将其翻译成其他语言,而不偏爱任何一种。
        • 如果您使用关系,您可以使用级联更新功能。因此,如果您改进关键语言,您也会更改翻译表中的关键。但这只是第二个想法。如果适合他/她的情况,开发人员可以决定是否使用。
        猜你喜欢
        • 2011-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 2011-06-04
        相关资源
        最近更新 更多