【问题标题】:Versioning for Rails i18n translationsRails i18n 翻译的版本控制
【发布时间】:2014-02-11 18:13:48
【问题描述】:

我正在为使用 Rails 4.0 构建的新网站构建基于志愿者的翻译引擎。由于它是基于志愿者的,因此用户总是有可能输入其他人不同意的翻译,意外删除翻译等。在这种情况下,我想让用户选择恢复到以前的翻译.

我进行了一些搜索,但除了编写自己的 I18n 后端之外,还没有找到解决方案。有没有更简单的方法来存储以前版本的翻译?

我目前正在使用 Sven Fuchs' Active Record 作为后端,但是由于以后可能出现的性能问题,我正在认真考虑切换。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 versioning rails-i18n


    【解决方案1】:

    我们在使用 Globalize(github 页面:https://github.com/globalize/globalize)方面获得了非常成功的经验,至于版本控制部分我们没有尝试过,但 Globalize 确实在单独的 gem github 中对此提供了支持页面:(https://github.com/globalize/globalize-versioning)

    在经历了数十次 gem 的痛苦经历后,我发现按上次更新日期比较 gem 以及新版本、错误修复和支持的频率是决定哪一个会让你的生活更轻松、哪一个不会的主要因素。

    更新:

    您可以使用 Globalize 动态翻译视图 (check tutorial),但我遇到了一个名为 iye 的 github 项目。我认为它最适合您的需求(github 页面:https://github.com/firmafon/iye

    【讨论】:

    • 谢谢,但在我看来,Globalize 只存储模型的翻译文本,而不是静态站点内容(默认存储在 YAML 文件中的内容)。
    • @Godwin 所以你想翻译观点?不是网站内容,对!
    • 很抱歉还在学习 Rails 的基础知识。是的意见。
    • @Godwin 我也不是 Rails 的专业人士 :),请查看我的更新答案
    • 非常感谢@Nimir,非常感谢您的帮助。在查看了 Globalize Versioning 的工作原理后,我找到了解决方案。
    【解决方案2】:

    我使用 Nimir 的帮助找到了这个解决方案。与 Globalize Versioning 一样,您可以为 Active RecordTranslation 类添加 Paper Trail 支持,但是目前此方法存在一些缺陷。

    首先,您需要在 Gemfile 中包含 gem:

    gem "i18n-active_record"
    gem "paper_trail"
    

    然后您需要确保您的 Translation 模型类继承自 I18n Active Record::Translation 并调用和调用 has_paper_trail:

    class Translation < I18n::Backend::ActiveRecord::Translation
        has_paper_trail
    end
    

    这应该足够了,但是I18n Active Record 中的store_translations 方法不会更新现有记录。相反,每次添加记录时,都会删除具有给定键的所有记录并创建新记录。这会导致 Paper Trail 的混乱,因为它依赖于一个 id。

    为了解决这个问题,我创建了自己的store_translation 方法,如果记录存在,它将更新记录:

    def store_translations(locale, data, options = {})
        escape = options.fetch(:escape, true)
        I18n.backend.flatten_translations(locale, data, escape, false).each do |key, value|
            t = Translation.find_or_create_by!(locale: locale.to_s, key: key.to_s)
            t.value = value
            t.save
        end
        I18n.backend.reload!
    end
    

    请注意,我还包括 I18n.backend.reload!,这是因为我正在运行 Memoize 来缓存翻译,但似乎需要告诉它在更新记录时重新缓存。

    现在我可以简单地调用:

    store_translations(lang, {key => key}, :escape => false)
    

    将新翻译存储到商店,并确保我们保留旧翻译和更改者的记录。

    【讨论】:

      猜你喜欢
      • 2015-04-20
      • 1970-01-01
      • 2011-02-02
      • 2015-03-25
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      相关资源
      最近更新 更多