我正在为使用Rails 4.0构建的新站点构建基于志愿者的翻译引擎。由于它是基于志愿者的,因此用户可能总是输入其他人不同意的翻译,意外删除翻译等。在这种情况下,我想让用户选择恢复到之前的翻译
我做了一些搜索,但除了编写我自己的I18n后端之外还没有找到解决方案。是否有更简单的方法来存储以前版本的翻译?
我目前正在使用Sven Fuchs' Active Record作为后端,但是我正在认真考虑切换,因为可能会在以后发生性能问题。
答案 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 Trail的Translation
类添加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)
到商店新的翻译并确保我们记录旧的翻译和谁做出改变。