Einfache Lokalisierung einer Ruby On Rails-Anwendung
Ruby On Rails bietet ja nun seit Version 2.2 ganz hervorragende Möglichkeiten, eine Anwendung zu lokalisieren. Aber wie wählt man nun am Besten die darzustellende Sprache aus? Als praxistauglich hat sich da in etwa folgendes Vorgehen erwiesen:
1) Der Benutzer sollte die Sprache manuell setzen können. Wenn er das macht, dann geht diese Auswahl immer vor und wird in der Session gespeichert.
2) Ansonsten sagt uns der Browser die Sprache über das Feld “HTTP_ACCEPT_LANGUAGE”.
3) Falls alles schief geht gibt es eine Defaultsprache.
Das Setzen der aktuellen Sprache sollte natürlich jeweils im “ApplicationController” passieren, dieser könnte dann so aussehen:
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.
class ApplicationController < ActionController::Base
layout 'application'
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
session :off, :if => lambda {|req| req.user_agent =~ /(Google|Slurp)/i}
before_filter :set_locale
# Scrub sensitive parameters from your log
filter_parameter_logging :password
def set_locale
locale = nil
logger.debug "* session has '#{session[:locale]}'"
if params.has_key?('locale'):
locale = params[:locale]
session[:locale] = locale
else
if session[:locale]
locale = session[:locale]
else
locale = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
if locale != ""
session[:locale] = locale
end
end
end
I18n.locale = locale
logger.debug "* Locale set to '#{I18n.locale}'"
end
end
Nicht vergessen in der “environment.rb” die Defaultsprache zu setzen:
config.i18n.default_locale = :de
Um den Benutzer die Möglichkeit zur Auswahl zu geben, kann z.B. folgender Code in euer Applikationslayout eingefügt werden. Das Setzen der Sprache erfolgt also immer über den Parameter “locale”:
lang: <%= I18n.locale == "en" ? "en" : link_to("en", { :locale => "en" }) %>
<%= I18n.locale == "de" ? "de" : link_to("de", { :locale => "de" }) %>
Somit habt ihr eure Anwendung schon einmal grundlegend für Mehrsprachigkeit ausgerüstet. Neben den eigentlichen Übersetzungen (Tipp: hier gibt’s schon vorgefertigte Übersetzungen für Datumsangaben und vieles andere) fehlt jetzt eigentlich nur noch, diese Seiten auch vernünftig suchmaschinentauglich zu machen. Der Parameter “locale” in der URL tut’s zwar schon irgendwie, optimal ist das aber nicht. Aber dazu vielleicht ein anderes mal mehr.


