【问题标题】:How to create a translatable successful notice?如何制作可翻译的成功通知?
【发布时间】:2011-08-17 19:00:30
【问题描述】:

我正在尝试创建可翻译的成功通知。成功调用创建和更新操作将调用此通知。

这是我目前所拥有的:

#config/locales/en.yml
activerecord:
  models:
    place: "Place"
  successful:
    messages:
      created: "%{model} was successfully created."
      updated: "%{model} was successfully updated."

#app/controllers/places_controller.rb
def create
  ...
  format.html { redirect_to(@place, :notice => "#{t 'activerecord.successful.messages.created'}") }

问题在于这显示了消息:“%{model} 已成功创建。”。如何让它说:“地点已成功创建。”?

【问题讨论】:

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


    【解决方案1】:

    你需要使用 i18n 的插值函数(见http://guides.rubyonrails.org/i18n.html#interpolation)做类似的事情

    t('activerecord.successful.messages.created', :model => @my_newly_saved_object.class.model_name.human) 
    

    其中model_name 返回所创建对象的类的名称(参见http://api.rubyonrails.org/classes/ActiveModel/Name.html)。在此对象上调用 human 会返回模型名称的 i18n 翻译(来自范围 activerecord.models.{model_name})

    【讨论】:

    • 这种方法恕我直言过于冗长,你不需要所有这些,你将在控制器中调用t 助手(在你的情况下为places_controller),在你已经知道您要保存的型号只需写 model: :place 并获得相同的结果,更容易阅读
    【解决方案2】:

    你可以简单地写:

    format.html do
      redirect_to(
        @place, 
        notice: t('activerecord.successful.messages.created', model: :place
      )
    end    
    

    (请注意,您将其写入places_controller.rb 文件,因此您知道将保存place,不需要@place.class.model_name.human 冗长的东西。)

    这将告诉 i18n 使用哪个 model 的翻译,现在您只需要本地化模型名称,这非常简单,只需在 activerecord 之一中添加 model 部分即可,因此您的语言环境 yaml 文件将如下所示:

    activerecord:
        successful:
          messages:
            created: 
              enqueued: "La creazione del %{model} è stata messa in coda con successo"
        error_header_message: 
          one: Un errore ha proibito il salvataggio di questo %{model}
          other: "%{count} errori hanno proibito il salvataggio di questo %{model}"
        models: 
          article: articolo
        attributes:
          article: 
            user_id: Autore
            title: Titolo
            published: Pubblicato
            text: Testo
    

    同样,正如您在示例中看到的,您还可以指定在表单、错误验证和其他地方有用的属性名称。

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多