Перевод I18n с i18n-active_record: та же форма для того же ключа

Я работаю над приложением в Rails 4, используя i18n-active_record 0.1.0, чтобы мои переводы хранились в базе данных, а не в файле .yml. Это работает нормально.

Однако одна вещь, с которой я борюсь, заключается в том, что каждая запись перевода - это одна запись для каждой локали, т.е.

#1. { locale: "en", key: "hello", value: "hello")
#2. { locale: "se", key: "hello", value: "hej")

что делает их обновление утомительным. Вместо этого я хотел бы иметь его как один, т.е.:

{ key: "hello", value_en: "hello", value_se: "hej" }

или аналогичный для обновления всех экземпляров одного ключа в одной форме. Я не могу найти ничего об этом, что меня озадачивает.

Есть ли способ легко это сделать? Любые типы хаков также будут в порядке.


person Christoffer    schedule 05.08.2016    source источник


Ответы (2)


Вы можете создать объект ActiveRecord для таблицы перевода, а затем создать функции чтения и записи для этой модели.

Функция чтения будет извлекать все связанные записи, а затем объединять их в один хэш.

Функция записи будет принимать ваш единственный входной хэш и разделять их на несколько записей для записи/обновления.

person Joshua    schedule 12.08.2016
comment
Я понимаю это в теории, но как заставить это работать с драгоценным камнем и сделать это на практике - это совершенно другое. - person Christoffer; 13.08.2016

В итоге я создал свою собственную функцию перевода с помощью Globalize. Он явно не полагается на I18n, так что это параллельная система, но она работает, хотя и некрасиво и не является заменой I18n, но имеет важную функциональность, позволяющую легко добавлять локаль и обрабатывать все переводы в одной форме.

  • Модель перевода с ключом: строка
  • В модели перевода:

    переводит :value globalize_accessors :locales => I18n.available_locales, :attributes => [:value]

В помощнике приложения:

  def t2(key_str)
    key_stringified = key_str.to_s.gsub(":", "")
    t = Transl8er.find_by_key(key_stringified)
    if t.blank? 
      # Translation missing
      if t.is_a? String
        return_string = "Translation missing for #{key_str}"
      else
        return_string = key_str 
      end
    else
      begin
        return_string = t.value.strip
      rescue
        return_string = t.value
      end
    end
    return_string
  end
person Christoffer    schedule 16.08.2016