Я использовал помощь Нимира, чтобы найти это решение. Подобно Globalize Versioning, вы можете добавить Paper Trail поддержку для Active Record 's Translation
класс, однако есть несколько подводных камней для этого метода в настоящее время.
Прежде всего, необходимо включить драгоценные камни в вашем Gemfile:
gem "i18n-active_record"
gem "paper_trail"
Затем вы должны убедиться, что ваша модель Translation
класс наследует от I18N Active Record :: Перевод и вызов и вызывает has_paper_trail
:
class Translation < I18n::Backend::ActiveRecord::Translation
has_paper_trail
end
Этого действительно должно быть достаточно, однако метод store_translations
в I18n Active Record
не обновляет существующие записи. Вместо этого каждый раз, когда добавляется запись, все записи с заданным ключом удаляются и создается новая запись. Это вызывает путаницу для Paper Trail, поскольку она полагается на идентификатор.
Чтобы обойти эту проблему, я создал свой собственный 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)
в магазин новый перевод и обеспечить нам вести учет старой и кто сделал изменения.
Спасибо, но мне кажется, что глобализация только сохраняет переведенный текст для моделей, а не для статического содержимого сайта (материал, который по умолчанию хранится в файлах YAML). – Godwin
@Godwin, так что вы пытаетесь перевести представления? а не сайт, прямо! – Nimir
извините, все еще опираясь на основы для Rails. Да. – Godwin