【问题标题】:How to properly translate Paperclip error messages?如何正确翻译回形针错误消息?
【发布时间】:2012-08-15 01:53:30
【问题描述】:

我正在使用 Ruby on Rails 3.2.2 和 Paperclip 插件。由于我想翻译回形针错误消息,我使用以下代码:

class Article < ActiveRecord::Base
  validates_attachment_size :picture,
    :less_than => 4.megabytes,
    :message   => I18n.t('trl_too_big_file_size', :scope => 'activerecord.errors.messages')
end

我的.yml 文件是:

# <APP_PATH>/config/locales/en.yml (english language)
activerecord:
  errors:
    messages:
      trl_too_big_file_size: is too big

# <APP_PATH>/config/locales/it.yml (italian language)
activerecord:
  errors:
    messages:
      trl_too_big_file_size: è troppo grande

我的ApplicationController 是:

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    # I am using code from http://guides.rubyonrails.org/i18n.html#setting-and-passing-the-locale.
    I18n.locale = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
  end
  # BTW: My `I18n.default_locale` is `:en` (english).
end

但是,当我提交与回形针附件相关的表单时,我的应用程序会生成一个翻译文本 - 也就是说,它会生成(并输出)一个 没有正确翻译字符串,因为它总是引用默认的区域设置语言错误字符串en.activerecord.errors.messages.trl_too_big_file_size,即使I18n.locale:it。我做了一些研究(例如,12),但我仍然无法弄清楚如何正确翻译模型文件中与 Paperclip gem 相关的错误消息(参见上面的代码)。这似乎是 Parperclip gem 的一个错误(也因为似乎我不是唯一一个遇到这个问题的人)......

我该如何解决这个问题?


P.S.:我认为这个问题与ApplicationController-Paperclip gem的一些“文件加载顺序过程”有关......但我不知道如何解决这个问题。

【问题讨论】:

  • 你解决了吗?我尝试在答案中使用这两种解决方案,但第一个根本不起作用(显然 ActiveRecord I18n 在 Paperclip 中仍然不被真正支持)并且 lambda 翻译了消息(即“必须最多为 %{max] 千字节” ),但模型和属性名称没有翻译,尽管我在 YAML 文件中有它们。

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


【解决方案1】:

除了在消息参数中使用 lambda,您不能简单地在 YAML 文件中使用适当的键吗?具体来说,不会是这样的:

class Article < ActiveRecord::Base
  validates_attachment_size :picture,
    :less_than => 4.megabytes
end

意大利语言环境 YAML 文件中的条目看起来像

it:
  activerecord:
    errors:
      models:
        article:
          attributes:
            picture:
              less_than: è troppo grande

在英文本地 YAML 文件中有类似的条目

en:
  activerecord:
    errors:
      models:
        article:
          attributes:
            picture:
              less_than: is too big

假设您的语言环境设置正确,并且其他 ActiveRecord 本地化消息正确显示,那么我希望这可以正常工作,因为 Paperclip 的验证器通过 I18n.t 方法使用底层 ActiveRecord 消息包。

【讨论】:

    【解决方案2】:

    您可能需要为消息使用 lambda?

    https://github.com/thoughtbot/paperclip/pull/411

    class Article < ActiveRecord::Base
      validates_attachment_size :picture,
        :less_than => 4.megabytes,
        :message => lambda { 
          I18n.t('trl_too_big_file_size', :scope => 'activerecord.errors.messages') 
        }
    end
    

    【讨论】:

    • 我不明白为什么,但有时您的代码(通过使用lambda 函数)似乎有效,有时似乎无效。如何确保翻译按预期工作?
    • @Backo:您的版本不起作用,因为您的 I18n.t 调用在加载类时被评估,然后您将拥有默认的语言环境; lambda 版本在需要消息时执行 lambda,因此 I18n.t 在需要消息时执行,并且应该正确设置语言环境。如果 lambda 版本有时不起作用,那么您有时可能没有正确设置语言环境。
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多