smart | Webentwicklung
Alles rund um HTML5, PHP, WordPress & Co.

Ruby on Rails: Tipps für I18n Übersetzungen

1. Oktober 2012
Stephan
Tipps I18n-Übersetzungen in Ruby on Rails

Mehrsprachige Anwendungen lassen sich in Ruby on Rails dank der sehr einfach zu nutzenden I18n-API sehr leicht umsetzen.

In diesem Artikel möchte ich euch zeigen, wie ihr beispielsweise Standard-Fehlermeldungen (default error messages), Modelnamen sowie dessen Attributsnamen, Labels usw. einfach übersetzen könnt.

Das „schwierigste“ war hierbei für mich nämlich das Herausfinden der jeweiligen Keys für die Übersetzungen. Damit ihr also nicht so lange suchen müsst wie ich, im Folgenden nun eine Auflistung der wichtigsten Übersetzungs-Keys.

Fehlermeldungen

Wenn ihr ein Model validiert und es kommt zu einem Fehler, wird für dieses Model eine Fehlermeldung gesetzt.

Beispiel:

class Exercise < ActiveRecord::Base
    validates :name,
              :presence => true

    validates :description,
              :presence => true
end

In diesem Beispiel muss eine Aufgabe einen Name sowie eine Beschreibung haben. Wird beim Erstellen der Aufgabe z.B. kein Name angegeben, so wird eine Fehlermeldung für das Model hinterlegt bzw. im error-Attribut der Modelinstanz gesetzt.

Dabei schaut Rails in folgender Reihenfolge nach einer entsprechenden Übersetzung:

  • activerecord.errors.models.[model_name].attributes.[attribute_name]
  • activerecord.errors.models.[model_name]
  • activerecord.errors.messages
  • errors.attributes.[attribute_name]
  • errors.messages

Wollen wir also eine globale Übersetzung für alle presence-Fehler, so können wir in unsere Übersetzungsdatei (YAML-Datei) Folgendes schreiben:

de:
    activerecord:
        errors:
            messages:
                blank: 'Pflichtfeld - darf nicht leer sein'

Wollten wir nun aber für unser Attribut name unseres Exercise-Models eine individuelle Fehlermeldung, so müssen wir unsere Übersetzungen wie folgt anpassen:

de:
    activerecord:
        errors:
            messages:
                blank: 'Pflichtfeld - darf nicht leer sein'
            models:
                exercise:
                    attributes:
                        name:
                            blank: 'darf niemals leer sein, da Pflichtfeld'

In diesem Fall wird für einen fehlenden Namen also nicht unsere Standard-Fehlermeldung ausgegeben, sondern unsere individuell hinterlegte Fehlermeldung.

Alle Übersetzungs-Keys für die ActiveRecord-Validierungen findet ihr übersichtlich in einer Tabelle aufbereitet im Rails-Guide.

Modelnamen

Einen übersetzten Modelnamen könnt ihr so ausgeben lassen:

#Modelname.model_name.human
Exercise.model_name.human

In eure Übersetzung müsst dazu Folgendes aunehmen:

de:
    activerecord:
        models:
            exercise: 'Aufgabe'

Model-Attributsnamen

Die Ausgabe erfolgt analog zur Ausgabe eines Modelnames:

#Modelname.human_attribute_name.human
Exercise.human_attribute_name(:name)

Die Übersetzung sieht dann wie folgt aus:

de:
    activerecord:
        attributes:
            exercise:
                name: 'Name'
                description: 'Beschreibung'

Speichern (Save) & Aktualisieren (Update) – Submit-Bezeichnung

Wer mit Rails schon öfters gearbeitet hat, weiß, dass die Bezeichnung des Submit-Buttons beim Erstellen und Aktualisieren eines Models unterschiedlich bezeichnet ist.

Beispiel:

<%= form_for(@exercise) do |f| %>
    <% if @exercise.errors.any? %>
        <div class="formErrorBox">
            <div>
                <% if locale === 'en' %>
                    <%= pluralize(@exercise.errors.count, 'error') %>
                <% else %>
                    <%= @exercise.errors.count.to_s + ' ' + (t ('views.general.form.error')) %>
                <% end %>
            </div>
            <ul>
                <% @exercise.errors.full_messages.each do |error_message| %>
                    <li><%= error_message %></li>
                <% end %>
            </ul>
        </div>
    <% end %>
    <fieldset>
        <legend><%= t 'views.general.form.legend.data', :model_name => @model_name %></legend>
        <%= f.label :name %>
        <%= f.text_field :name, :size => nil %>
        <%= f.label :description %>
        <%= f.text_area :description, :cols => nil, :rows => nil %>
    </fieldset>
    <fieldset>
        <legend><%= t 'views.general.form.legend.submit' %></legend>
        <%= f.submit %>
    </fieldset>
<% end %>

Wie ihr sehen könnt, ist beim Aufruf für den Submit-Button kein value angegeben. Vielmehr müsst ihr in eure Übersetzungen einfach folgende Zeilen einfügen:

de:
    helpers:
        submit:
            create: '%{model} erstellen'
            update: '%{model} aktualisieren'

Jetzt wird automatisch die jeweilige Übersetzung genutzt, wenn ein neues Model angelegt bzw. ein bestehendes bearbeitet wird.

Angemerkt sei noch, dass ihr hier auch noch wieder direkt für einzelne Models unterschiedliche Submit-Bezeichnungen festlegen könnt:

de:
    helpers:
        submit:
            exercise:
                create: 'Aufgabe erstellen'
                update: 'Aufgabe aktualisieren'

Labels

Anstatt bei Form-Labels immer eine Übersetzung direkt anzugeben:

<%= f.label :name, 'Name:' %>

reicht auch das Folgende:

<%= f.label :name %>

Dementsprechend müssen wir nur noch unsere Übersetzung anpassen:

de:
    helpers:
        label:
            exercise:
                name: 'Name:'

Fazit

Kennt man erst einmal die benötigten Keys und dessen Reihenfolge in der Abarbeitung, dann ist das Übesetzen von Rails-Anwendungen eine einfache Sache.

Wie findet ihr die I18n-API von Rails? Hattet ihr schon mal größere Probleme damit?

Kommentare  
1 Kommentar vorhanden
1 Kevin schrieb am 29. März 2015 um 16:27 Uhr

Hi Stephan,

danke für den Tipp! Er war sehr hilfreich. 🙂

Gruss

0 Trackbacks/Pingbacks vorhanden
Du bist herzlich eingeladen auch ein Kommentar zu hinterlassen!
Kommentar schreiben

Vielen Dank für dein Kommentar!