Rails 3 перевода внутри моделей в производстве - PullRequest
1 голос
/ 28 октября 2011

Я пытаюсь перевести приложение на японский, и все шло гладко, пока я не запустил его.

Поскольку cache_classes теперь имеет значение true, любой перевод в модели возвращается к языку по умолчанию.

Я знаю, что я, вероятно, должен ориентироваться на переводы непосредственно в файле yml, но я не уверен, как бы я это сделал для следующего упрощенного кода:

class TimeseriesForecast < ActiveRecord::Base

  @@field_names = {
   :location_name => I18n.t('forecast_timeseries.location_name'),
   :local_date_time => I18n.t('forecast_timeseries.local_date_time'),
   :zulu_date_time => I18n.t('forecast_timeseries.zulu_date_time'),
   :temp_mean => I18n.t('forecast_timeseries.temp_mean')
  }

end

Большое спасибо

Ответы [ 3 ]

5 голосов
/ 22 ноября 2011

Ваш I18n.t() вызов оценивается во время компиляции, поскольку вы определяете переменные класса, а не переменные экземпляра. Вам нужно позвонить на I18n.t, где они будут оцениваться во время выполнения.

Но если вы хотите перевести имена полей ActiveRecord, используйте human_attribute_name и предоставьте свои переводы через YML. Вам не нужно предоставлять переводы вручную, Rails обрабатывает все это автоматически.

Соответствующая документация на http://guides.rubyonrails.org/i18n.html Глава 5.1.

2 голосов
/ 28 августа 2014

Не используйте I18n.t или метод перевода в ваших моделях. Вы можете сделать это вместо:

В вашей модели

Используйте что-то подобное, чтобы добавить интернационализированные ошибки в атрибут name вашей модели (см. Документацию: ActiveModel / Errors / method-i-add ):

self.errors.add(:name, :your_error_key) 
  # The error key could be something like :wrong_name

ПРИМЕЧАНИЕ. Иногда вам даже не нужно добавлять ошибки с помощью метода errors.add. Например, если вы добавите проверки в вашу модель с помощью чего-то вроде этого:

validates :name, presence: true

Rails добавит ошибку с ключом :blank (ключ зависит от типа проверки). Другими словами, рельсы внутри будут выдавать self.errors.add(:name, :blank)

В вашем регионе

Тогда в вашем locale.jp.yml можно использовать любой из этих (только один):

activerecord.errors.models.[model_name].attributes.[attribute_name]
activerecord.errors.models.[model_name]
activerecord.errors.messages
errors.attributes.[attribute_name]
errors.messages

В вашем случае замените [model_name] на timeseries_forecast и [attribute_name] на your_error_key

Например:

en:
  errors:
    messages:
      your_error_key: "Your error message in english"
0 голосов
/ 28 октября 2011

Не думайте, что вы улучшаете производительность, кэшируя имена в классе.Вместо этого сделайте его методом.

class TimeseriesForecast < ActiveRecord::Base
  def self.field_names
    { :location_name => I18n.t('forecast_timeseries.location_name'),
      :local_date_time => I18n.t('forecast_timeseries.local_date_time'),
      :zulu_date_time => I18n.t('forecast_timeseries.zulu_date_time'),
      :temp_mean => I18n.t('forecast_timeseries.temp_mean') }
  end
end

# usage
TimeseriesForecast.field_names

А еще лучше, верните только фактические поля и выполните перевод в представлении, если вы хотите строго придерживаться MVC (некоторые методы Rails - например, collection_select- хотя сделать это будет сложнее, отсюда и предложение выше).

...