Rails i18n翻译的版本控制

时间:2014-02-11 18:13:48

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

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

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

我目前正在使用Sven Fuchs' Active Record作为后端,但是我正在认真考虑切换,因为可能会在以后发生性能问题。

2 个答案:

答案 0 :(得分:1)

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

在经历了数十次痛苦的宝石体验之后,我发现在上次更新日期和新发布的频率之间比较宝石,错误修复和支持是决定哪一个会让您的生活更轻松,哪个不会更容易的主要因素。

<强>更新

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

答案 1 :(得分:0)

我使用Nimir的帮助来找到这个解决方案。与全球化版本控制一样,您可以为Paper TrailTranslation类添加Active Record支持,但目前此方法存在一些缺陷。

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

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

这应该足够了,但store_translations中的I18n Active Record方法不会更新现有记录。相反,每次添加记录时,将删除具有给定键的所有记录并创建新记录。这会导致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)

到商店新的翻译并确保我们记录旧的翻译和谁做出改变。