Internasjonalisering av AR meldinger i Rails

Kan noen anbefale en plugin eller teknikk for å oversette standardmeldingene i ActiveRecord validering til norsk?
F.eks: Jeg vil få “Passordet er for kort” i stedet for “Password is too short”.

Og jeg vil helst slippe å hardkode feilmeldingen i Ruby koden.

Jeg vet det finnes flere plugins, gettext hacks osv. Hva foretrekker dere?

Vist 219 ganger. Følges av 1 person.

Kommentarer

Det er jo egentlig to temaer dette, selv om det finnes plugins (tror jeg) som løser begge under ett:

  • Oversetting av kolonnenavn i databasen til norske navn
  • Oversetting av feilmeldingene (“is not in the list” blir til “er ikke i lista” og så videre)

For det første punktet bør/må du nok nesten angi dette i modellen. Om man tråler seg gjennom Rails-sourcen ser man at det er human_attribute_name-metoden som kalles ved generering av feilmeldinger/bruk av label osv. Det jeg har gjort på prosjektet jeg jobber på nå er å lage en klassemetode i ActiveRecord::Base der jeg kan mappe kolonnenavn til norske navn, slik:


    # Define localized attribute names
    def define_attribute_names(attribute_name_hash)
      attribute_name_hash.each do |key, value|
        localized_attributes[key.to_s] = value
      end
    end
    
    # Overrides the default AR implementation -
    # to look up in the default map
    def localized_human_attribute_name(attribute_name)
      localized_attributes[attribute_name.to_s] | | attribute_name.humanize
    end
    
    def localized_attributes
      @localized_attributes | |= HashWithIndifferentAccess.new
    end

Da kan du i en ActiveRecord-modell skrive noe a-la:


class Person < ActiveRecord::Base
  define_attribute_names(
     :first_name => "Fornavn", 
     :last_name => "Etternavn")
end

og Person-klassen vil da svare med “Fornavn” om man ber om Person.localized_attribute_name(:first_name). Dette kan man videre utnytte ved å redefinere/alias_method_chaine ActiveRecord::Base.human_attribute_name:


def human_attribute_name(a)
  localized_attribute_name
end

Når det gjelder det andre spørsmålet, som handler om feilmeldingene, er ActiveRecord::Errors sin klassevariabel @@default_error_messages det du leter etter. Ved å plukke på dette hashet kan du endre meldingene som vises.

Rent praktisk har vi løst dette ved å

  • Monkeypatche ActiveRecord::Errors til å ha et annet hash for feilmeldinger
  • Lage en modul CustomValidations som legger inn define_attribute_names med venner, og som kan inkluderes enten rett i ActiveRecord::Base eller i enkeltklasser du trenger den i.

Men, som sagt, jeg tror det finnes noen plugins som gjør dette, som kanskje gir litt mindre jobb og enklere vedlikehold…

localization_simplified har funket her greit for meg for oversetting av feilmeldingene i @@default_error_messages. Der ligger det også en norsk fil klar til bruk.

Når det gjelder oversetting av database kollonnenavn så ser det ut som denne har en lignende approach til det Marius beskriver. Har ikke brukt denne.

Det som også er verdt å se på er parametere til "error_messages_for":http://api.rubyonrails.com/classes/ActionView/Helpers/ActiveRecordHelper.html#M001673 metoden. Litt mer om dette her.

Jeg foretrekker min egen plugin, locaized frontend =)

Og ikke glem at Rails 2.2 får innebygd støtte for i18n:

http://rails-i18n.org/2008/7/31/welcome-to-the-future-of-i18n-in-ruby-on-rails

Alle strenger som blir brukt av Rails blir automatisk oversatt:

http://github.com/karmi/rails_i18n_demo_app/tree/master/lib/locale/cz.rb

Nye bilder