Request-unabhängige Locale-Einstellungen

Manchmal ist es nötig, in einem Request/View verschiedene Locale-Einstellungen zu nutzen. Der häufigste Fall dürfte der Versand von E-Mails an verschiedene User sein, die jeweils die Nachricht in ihrer Sprache erhalten sollen.

Man könnte einfacherweise für diese E-Mail für jede Sprache ein eigenes Template anlegen, aber wozu gibt es die gettext-Unterstütung. :)

Djangos I18N-Kern bringt eine Funktion django.utils.translation.activate mit, mit der man zur Laufzeit die Locale-Einstellung ändern kann.

Als Beispiel dient ein einfaches Template mit einem Translation-String.

{% spaceless %}
    {% load i18n %}
    {% trans "Thanks for using our site!" %}
{% endspaceless %}

Und eine Dummy-Funktion. Dabei wird über die Sprachen iteriert (normalerweise würde die jeweilige Spracheinstellung im Userprofil gespeichert sein) und das email.txt Template mit der jeweiligen Sprache im Terminal ausgegeben:

from django.template.loader import render_to_string
from django.utils.translation import get_language, activate

current_language = get_language()
languages_to_render = ('en-us', 'de-de', 'pt-br', 'fr')

for lang in languages_to_render:
    activate(lang)
    print render_to_string('email.txt')

activate(current_language)

Ausgabe:

Thanks for using our site!
Vielen Dank, dass Sie unsere Seite benutzen!
Obrigado por usar nosso site!
Merci d'utiliser notre site !

Einfach oder? Beachten sollte man noch, dass man den originalen Locale-Wert vor dem ändern speichert (django.utils.translation.get_language liefert den aktuellen Wert) und am Ende wieder aktiviert. Sonst würde in diesem Fall der Rest des Views mit der französischen Locale weiterlaufen.



↑ to the elevators

© 2001—2012 Martin Mahner. This is an I ♥ Django Project.

Admin | Generated: Thu, 9 Feb 2012 07:59:00 +0100