Categories
Uncategorized

Django Localization und Internation

Django bringt Support für localization und internationalization bereits ab Werk mit und bietet auch Dokumentation für die entsprechenden Module. Beim durcharbeiten ist alleredings der Eindruck entanden, dass wenige, notwendige Schritte nicht offensichtlich dargelegt sind. So ist z.B. aus der Hauptseite der Dokumentation lediglich folgende Seite verlinkt. Eigentlich will man aber Internationalization und Localization ansehen.

Um die gesammelten Erfahrungen kurz festzuhalten:

1. Um localization zu verwenden, muss die entsprechende middleware konfiguriert werden. Die Reihenfolge, in der MIDDLEWARE Klassen geladen werden, ist entscheidend. Zusammen mit SessionMiddleware, CommonMiddleware, AuthenticationMiddleware, MessageMiddleware und CsrfViewMiddleware sollte folgendes entstehen:

MIDDLEWARE_CLASSES = (
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.locale.LocaleMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
)

2. In settings.py lassen sich die Verfügbaren Sprachen festlegen. Sollte diese Einstellung fehlen, werden dem Benutzer alle Sprachen und Lokalisierungen von Django angeboten.

LANGUAGES = (
   ('de', 'German'),
   ('en', 'English'),
)

3. User Interface (Ergänzung)

In dem erwähnten Artikel wird bereits beschrieben, dass es einen default View für i18n gibt, der folgendermaßen in der urls.py verwendet wird:

urls.py
from django.conf.urls.defaults import *
urlpatterns += patterns('',
  (r'^i18n/', include('django.conf.urls.i18n')),
)

In der gleichen Sektion wird auch ein Snippet geliefert, mit dem der Benutzer Seine Sprache umschalten kann. Mit einer kleinen Änderung behält die Auswahl die gegenwärtige Einstellung des Benutzers:

<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}" {% if language.code == LANGUAGE_CODE %}selected{% endif %}>{{ language.name_local }} ({{ language.code }})</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>