I18n - Internationalisierung mit Rails

26.07.2010 23:07 Gregor Panek Ruby on Rails 0

Die Benutzung von Ruby on Rails für die Realisierung einer Deutschsprachigen Webseite führt zu dem Problem das man gezwungen ist, Datum und Uhrzeit für unseren Raum anzupassen. Bevor man jedoch zu komplexer String Manipulation greift, sollte man sich die Internationalisierungs API I18n anschauen, die das Umwandeln von Datum, Uhrzeit und Fehlermeldungen deutlich vereinfacht.

Internationalisierung mit I18n

Seit Ruby on Rails in der Version 2.2 erschienen ist, ist die Internationalisierungs API im Core von Rails verfügbar. In vorherigeren Versionen musste noch das I18n Gem seperat installiert werden. Beim Entwickeln mit Rails wird einem viel Arbeit abgenommen. Dazu zählt auch die Datums und Zeitformatierung. Diese ist jedoch für den Englischsprachigen Raum eingestellt.

Diese Default Einstellung kann man mittels der Internationalisierungs API leicht verändert werden. Welche Sprache man verwenden möchte hängt vom Benutzer und natürlich der Webseite ab. Dank der API kann man auch einzelnen Seiten der Webanwendung eine andere Sprache zuweise als den anderen Bereichen. Dabei wird die Wertzuweisung für die zu verwendete Sprachdatei an die URL drangehängt. Mit diesen Methoden lassen sich ganz Simpel zweisprachige Webseiten umsetzen.

Sprachdatei und Konfiguration

Um die Internationalisierungs API zu verwenden sind mehrere Schritte notwendig, die einmalig durchgeführt werden müssen.

Default Wert ändern

Es gibt zwei Möglichkeiten den zu Benutzten Default Wert für die Rails Anwendung zu ändern. In config/environment.rb

config.i18n.default_locale = :de

oder unter config/initializers/ erstellt ihr die Datei locale.rb und fügt folgendes ein:

I18n.default_locale = :de

Dadurch wurde der Default Wert für die Sprachdatei für die Deutsche Sprache eingestellt.

Sprachdatei

Der vorher festgelegte neue Default Wert muss letztendlich auch gefunden werden. Dazu muss die Sprachdatei :de vorhanden sein. Sprachdateien werden im Pfad config/locales/ angelegt. Dort ist schon die YAML Datei en.yml vorhanden. Bereits übersetzte Sprachdateien können heruntergeladen werden oder selbst erstellt werden. Hier die bereits Übersetzte Sprachdatei von Clemens Kofler:

"de":
   date:
     formats:
       default: "%d.%m.%Y"
       short: "%e. %b"
       long: "%e. %B %Y"
       only_day: "%e"

     day_names: [Sonntag, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag]
     abbr_day_names: [So, Mo, Di, Mi, Do, Fr, Sa]
     month_names: [~, Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember]
     abbr_month_names: [~, Jan, Feb, Mär, Apr, Mai, Jun, Jul, Aug, Sep, Okt, Nov, Dez]
     order: [ :day, :month, :year ]

   time:
     formats:
       default: "%A, %e. %B %Y, %H:%M Uhr"
       time: "%H:%M"
       short: "%e. %B, %H:%M Uhr"
       long: "%A, %e. %B %Y, %H:%M Uhr"
       only_second: "%S"

     am: ""
     pm: ""

   datetime:
     distance_in_words:
       half_a_minute: 'eine halbe Minute'
       less_than_x_seconds:
         zero: 'weniger als 1 Sekunde'
         one: '1 Sekunde'
         other: '{{count}} Sekunden'
       x_seconds:
         one: '1 Sekunde'
         other: '{{count}} Sekunden'
       less_than_x_minutes:
         zero: 'weniger als 1 Minute'
         one: 'eine Minute'
         other: '{{count}} Minuten'
       x_minutes:
         one: '1 Minute'
         other: '{{count}} Minuten'
       about_x_hours:
         one: 'etwa 1 Stunde'
         other: '{{count}} Stunden'
       x_days:
         one: '1 Tag'
         other: '{{count}} Tage'
       about_x_months:
         one: 'etwa 1 Monat'
         other: '{{count}} Monate'
       x_months:
         one: '1 Monat'
         other: '{{count}} Monate'
       about_x_years:
         one: 'etwa 1 Jahr'
         other: '{{count}} Jahre'
       over_x_years:
         one: 'mehr als 1 Jahr'
         other: '{{count}} Jahre'

   number:
     format:
       precision: 2
       separator: ','
       delimiter: '.'
     currency:
       format:
         unit: '€'
         format: '%n%u'

   active_record:
     error:
       header_message: ["Konnte das {{object_name}} Objekt nicht speichern: 1 Fehler.", "Konnte das {{object_name}} Objekt nicht speichern: {{count}} Fehler."]
       message: "Bitte überprüfen Sie die folgenden Felder:"
     error_messages:
       inclusion: "ist kein gültiger Wert"
       exclusion: "ist nicht verfügbar"
       invalid: "ist nicht gültig"
       confirmation: "stimmt nicht mit der Bestätigung überein"
       accepted: "muss akzeptiert werden"
       empty: "muss ausgefüllt werden"
       blank: "muss ausgefüllt werden"
       too_long: "ist zu lang (nicht mehr als {{count}} Zeichen)"
       too_short: "ist zu kurz (nicht weniger als {{count}} Zeichen)"
       wrong_length: "hat die falsche Länge (muss genau {{count}} Zeichen haben)"
       taken: "ist bereits vergeben"
       not_a_number: "ist keine Zahl"
       greater_than: "muss größer als {{count}} sein"
       greater_than_or_equal_to: "muss größer oder gleich {{count}} sein"
       equal_to: "muss genau {{count}} sein"
       less_than: "muss kleiner als {{count}} sein"
       less_than_or_equal_to: "muss kleiner oder gleich {{count}} sein"
       odd: "muss ungerade sein"
       even: "muss gerade sein"

Das waren auch schon alle Einstellungen die zu tätigen sind. Jetzt sind alle Datums und Uhrzeit Einstellungen auf Deutsch. Das tolle an der Internationalisierungs API ist, das auch alle Fehlermeldungen die bei Formularen auftreten, auch ins Deutsche Übersetzt worden sind. Mit der API kann man auch noch andere Formatierungen vornehmen, einen guten Einstieg dafür findet man auf der Seite von Rails Guides .

Eigene Implementierung für Sonderfälle

Die in der de.yml Datei übersetzten Formate lassen sich natürlich auch für Sonderfälle anpassen. Auf meiner Webseite wollte ich für die Anzeige des Archives das Datum im Format "Monat Jahr". Um das umzusetzen ändert man die YAML Datei ab:

...
time:
     formats:
       default: "%A, %e. %B %Y, %H:%M Uhr"
       time: "%H:%M"
       archiv: "%B %Y"
 ...

Für meine Formatierung hab ich einfach nur archiv mit den entsprechenden Werten für Monat und Jahr hinzugefügt. Jetzt kann man das einfach in seiner View anwenden:

I18n.l(Datum,:format => :archiv)

Zurück

0 Kommentare zu I18n - Internationalisierung mit Rails

Kommentar abgeben