QVINTVS · SCRIBET

Rails I18n: ActiveModel-Übersetzung mit Namespaces

Um ActiveRecord-Models in Namespaces wie z.B. Blog::Post zu übersetzen, ist ein wenig Recherche erforderlich. Die Rails-Dokumentation gibt dazu leider genausowenig her wie die offiziellen Railsguides.

Man nehme folgendes, vereinfachtes Model:

ss Blog::Post < ActiveRecord::Base
  validates :title, :presence => true
end

Ich habe gestern den ganzen Tag versucht, dieses Model zu lokalisieren, leider verweigerte mir I18n stur die Zusammenarbeit. Folgender YAML-Code gibt eine Deprecation-Warning:

  #...
  activerecord:
    models:
      blog:
        post: Eintrag
    attributes:
      blog:
        post:
          title: Titel

[DEPRECATION WARNING] Nested I18n namespace lookup under “activerecord.attributes.blog” is no longer supported

Stimmt auch ganz offensichtlich.

irb(main):001:0> I18n.locale = :de
=> :de
irb(main):002:0> Blog::Post.model_name.human
=> "Post"
irb(main):003:0> Blog::Post.human_attribute_name "title"
=> "Title"

Leider führt folgendes YAML-Code zum selben Ergebnis:

  #...
  activerecord:
    models:
      post: Eintrag
    attributes:
      post:
        title: Titel
irb(main):001:0> I18n.locale = :de
=> :de
irb(main):002:0> Blog::Post.model_name.human
=> "Post"
irb(main):003:0> Blog::Post.human_attribute_name "title"
=> "Title"

Nach einiger Sucherei habe ich heute endlich die richtige Schlagwortkombination gefunden, die mich nach Stackoverflow verbachte. Demnach ist die einzig richtige und funktionierende Art und Weise, Übersetzungen für Models in Namespaces zu erstellen, Model und Namespace durch einen Slash / zu trennen (hehe, da ist wohl ein Bug in CodeRay):

  #...
  activerecord:
    models:
      blog/post: Eintrag
    attributes:
      blog/post:
        title: Titel
irb(main):001:0> I18n.locale = :de
=> :de
irb(main):002:0> Blog::Post.model_name.human
=> "Eintrag"
irb(main):003:0> Blog::Post.human_attribute_name "title"
=> "Titel"
irb(main):004:0> 

Jaaa, so ist es richtig.

Valete.