Rails 3在生产模型中的翻译

时间:2011-10-28 01:45:47

标签: ruby-on-rails ruby ruby-on-rails-3 localization internationalization

我正在尝试将应用翻译成日语,一切顺利,直到我投入生产。

由于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 个答案:

答案 0 :(得分:5)

在编译时评估您的I18n.t()调用,因为您定义的是类变量,而不是实例变量。您需要将您的调用发送到I18n.t,它们将在运行时进行评估。

但是如果要翻译ActiveRecord字段名称,请使用human_attribute_name并通过YML提供翻译。您无需手动提供翻译,Rails会自动为您处理。

相应的文档位于http://guides.rubyonrails.org/i18n.html第5.1章。

答案 1 :(得分:2)

请勿在模型中使用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添加错误(密钥取决于验证类型)。换句话说,rails内部将发出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"

答案 2 :(得分:0)

不要认为你通过在课堂上缓存名字来提高绩效。把它变成一种方法。

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 - 会让它更难做到,因此上面的建议。)