Rails 5.1 Consulting und Schulung vom Autor:
www.wintermeyer-consulting.de/rails/

10.1. Einführung

Falls Sie in der glücklichen Lage sind, nur englische Webseiten zu erstellen, dann können Sie dieses Kapitel komplett überspringen. Für Sie ist per Default alles korrekt eingestellt. Aber wenn Sie eine Webseite erstellen wollen, die nur deutsch ist, dann müssen Sie in dieses Kapitel eintauchen. Es reicht nicht, nur die Views zu übersetzen. Denn sobald Sie auch nur Scaffolding benutzen, müssen Sie sich schon um die englischen und damit noch nicht übersetzten Validierungsfehler kümmern.
Die I18n Klasse ist innerhalb der Rails-Applikation für alle Übersetzungbelange zuständig. Sie stellt dafür zwei wichtige Methoden zur Verfügung:
  • I18n.translate oder I18n.t
    Übernimmt das Einfügen von vorher definierten Textbausteinen. Diese können Variablen enthalten.
  • I18n.localize oder I18n.l
    Übernimmt das Anpassen von Zeit- und Datumsangaben an das lokale Format.
Mit I18n.locale wird die im aktuellen Aufruf gewünschte Sprache definiert. In der Konfigurationsdatei config/application.rb wird mit dem Eintrag config.i18n.default_locale der Defaultwert für I18n.locale gesetzt. Wenn Sie dort nichts ändern, ist dieser Wert auf :en für Englisch eingestellt.
Für Sonderfälle wie das Anzeigen von Zahlen, Währungen und Uhrzeiten gibt es spezielle Helper. So ist sichergestellt, dass auf einer deutschen Webseite die Zahl 1000,23 als "1.000,23" und auf einer englischen Webseite als "1,000.23" dargestellt werden kann. Als Beispiel dafür hier die Deutsche und die Englisch (US) Variante für diesen Betrag als Geldbetrag mit Währung in der Console:
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.5)
1.9.3-p194 :001 > helper.number_to_currency('1000.23', :locale => :de)
 => "1.000,23 €" 
1.9.3-p194 :002 > helper.number_to_currency('1000.23', :locale => :en)
 => "$1,000.23" 
1.9.3-p194 :003 > exit
MacBook:webshop xyz$

Anmerkung

Um das helper.number_to_currency-Beispiel auf die Schnelle auszuprobieren, müssen Sie vorher die Zeile gem 'rails-i18n' in die Datei Gemfile einfügen und danach bundle ausführen. Damit bekommen Sie alle benötigten Sprachdateien installiert.

I18n.t

Mit I18n.t können Sie vorher definierte Übersetzungen abrufen. Die Übersetzungen werden per Default im YAML-Format im Verzeichnis config/locales/ abgespeichert. Die Verwendung von YAML als Format ist allerdings nicht technisch zwingend notwendig.
In config/locales/ findet sich eine Beispieldatei config/locales/en.yml mit folgendem Inhalt:
en:
  hello: "Hello world"
In der Rails-Console können wir ausprobieren, wie I18n.t funktioniert:
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p194 :001 > I18n.t :hello
 => "Hello world" 
1.9.3p194 :002 > I18n.locale
 => :en 
1.9.3p194 :003 > exit
MacBook:webshop xyz$
Erstellen wir einmal eine config/locales/de.yml mit folgendem Inhalt:
de:
  hello: "Hallo Welt"
Jetzt noch mal in die Console:
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p194 :001 > I18n.locale
 => :en 
1.9.3p194 :002 > I18n.t :hello
 => "Hello world" 
1.9.3p194 :003 > I18n.locale = :de
 => :de 
1.9.3p194 :004 > I18n.t :hello
 => "Hallo Welt" 
1.9.3p194 :005 > exit
MacBook:webshop xyz$ 
I18n.t sucht per Default den Eintrag in der in I18n.locale definierten Sprache. Dabei ist es egal, ob Sie mit I18n.t oder I18n.translate arbeiten. Es ist auch egal, ob Sie nach einem Symbol oder einem String suchen:
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p194 :001 > I18n.t :hello
 => "Hello world" 
1.9.3p194 :002 > I18n.t 'hello'
 => "Hello world" 
1.9.3p194 :003 > I18n.translate 'hello'
 => "Hello world" 
1.9.3p194 :004 > exit
MacBook:webshop xyz$ 
Sie können die gewünschte Sprache auch für einen einzelnen I18n.t Aufruf mit :locale => :de spezifizieren.
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p194 :001 > I18n.locale
 => :en 
1.9.3p194 :002 > I18n.t :hello, :locale => :de
 => "Hallo Welt" 
1.9.3p194 :003 > I18n.t :hello
 => "Hello world" 
1.9.3p194 :004 > exit
MacBook:webshop xyz$
Wenn eine Übersetzung nicht vorhanden ist, bekommen Sie eine "translation missing:"-Fehlermeldung. Dies gilt auch, wenn eine Übersetzung nur in einer Sprache fehlt (dann gehen alle anderen Sprachen, aber bei der fehlenden Übersetzung wird die Fehlermeldung ausgegeben). Sie können für diesen Fall mit :default => 'beliebiger Default-Wert' einen Default definieren:
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p194 :001 > I18n.t 'asdfasdfasdf'
 => "translation missing: en.asdfasdfasdf" 
1.9.3p194 :002 > I18n.t 'asdfasdfasdf', :default => 'asdfasdfasdf'
 => "asdfasdfasdf" 
1.9.3p194 :003 > exit
MacBook:webshop xyz$ 
Sie können in der YAML-Struktur auch mehrere Ebenen angeben. Bitte ergänzen Sie dazu die config/locale/en.yml wie folgt:
en:
  hello: "Hello world"
  example:
    test: "A test"
  aaa:
    bbb:
      test: "An other test"
Die verschiedenen Ebenen können Sie innerhalb des Strings mit Punkten anzeigen oder mit einem :scope bei den Symbols. Sie können auch beide Varianten vermischen.
MacBook:webshop xyz$ rails console
Loading development environment (Rails 3.2.3)
1.9.3p194 :001 > I18n.t 'example.test'
 => "A test" 
1.9.3p194 :002 > I18n.t 'aaa.bbb.test'
 => "An other test" 
1.9.3p194 :003 > I18n.t :test, :scope => [:aaa, :bbb]
 => "An other test" 
1.9.3p194 :004 > I18n.t :test, :scope => 'aaa.bbb'
 => "An other test" 
1.9.3p194 :005 > exit
MacBook:webshop xyz$
Die Struktur, mit der Sie Ihre Übersetzungen in den YAML-Dateien abspeichern, bleibt Ihnen überlassen. Die in Abschnitt 10.2, „Eine einsprachig deutsche Rails-Applikation“ vorgestellte Struktur erleichtert aber einiges und deshalb werden wir dies auch für diese Applikation übernehmen.

I18n.t im View einsetzen

Im View können Sie I18n.t wie folgt verwenden:
<%= t :hello-world %>

<%= I18n.t :hello-world %>

<%= I18n.translate :hello-world %>

<%= I18n.t 'hello-world' %>

<%= I18n.t 'aaa.bbb.test' %>

<%= link_to I18n.t('views.destroy'), book, confirm: I18n.t('views.are_you_sure'), method: :delete %>

Lokalisierte Views (localized views)

In Rails gibt es praktische Möglichkeiten für einen View, mehrere Varianten als "localized views" abzuspeichern, die jeweils andere Sprachen abbilden. Diese Technik ist unabhängig von der möglichen Verwendung von I18n.t in diesen Views. Der Dateiname ergibt sich dabei aus dem Viewnamen, dem Sprachcode (z. B. de für Deutsch) und html.erb für ERB-Seiten. Jeweils durch einen Punkt abgetrennt. So würde die deutschsprachige Variante der index.html.erb-Seite den Dateinamen index.de.html.erb bekommen.
Damit könnte Ihr Views-Verzeichnis beispielsweise so aussehen:
|-app
|---views
|-----products
|-------_form.html.erb
|-------_form.de.html.erb
|-------edit.html.erb
|-------edit.de.html.erb
|-------index.html.erb
|-------index.de.html.erb
|-------new.html.erb
|-------new.de.html.erb
|-------show.html.erb
|-------show.de.html.erb
|-------
|-----page
|-------index.html.erb
|-------index.de.html.erb
Die in config.i18n.default_locale gespeicherte Sprache wird dabei automatisch benutzt, wenn im Dateinamen keine Sprache eincodiert wurde. Dies ist in einem neuen und noch nicht konfigurieren Rails-Projekt Englisch.

Autor

Stefan Wintermeyer