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.
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$
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$
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.