/ / Django: Umschalten der Sprache der vom Admin-Panel gesendeten Nachricht - Django, Übersetzung

Django: wechsle die Sprache der Nachricht vom Admin-Panel - Django, Übersetzung

Ich habe ein Modell, Order, das eine Aktion in der hatAdmin-Fenster, in dem ein Administrator Informationen über die Bestellung an bestimmte Personen senden kann, die in dieser Bestellung aufgeführt sind. Jede Person hat eine Sprache eingestellt und dies ist die Sprache, in der die Nachricht gesendet werden soll.

Eine kurze Version dessen, was ich verwende:

from django.utils.translation import ugettext as _
from django.core.mail import EmailMessage

lang = method_that_gets_customer_language()

body = _("Dear mister X, here is the information you requestedn")
body += some_order_information

subject = _("Order information")

email = EmailMessage(subject, body, "customer@example.org", ["admin@example.org"])
email.send()

Die Kundeninformationen zu der von ihm verwendeten Sprache sind in verfügbar lang. Die Standardsprache ist en-us, die Übersetzungen sind in Französisch (fr) und Deutsch (de).

Gibt es eine Möglichkeit, die Übersetzung für die in angegebene Sprache zu verwenden lang zum body und subject dann wieder zu en-us wechseln? Zum Beispiel: lang ist "de". Der Betreff und der Hauptteil sollten die in den Übersetzungsdateien "de" angegebenen Zeichenfolgen erhalten.

bearbeiten:

Eine Lösung gefunden.

from django.utils import translation
from django.utils.translation import ugettext as _


body = "Some text in English"
translation.activate("de")
print "%s" % _(body)
translation.activate("en")

Was braucht es dafür? body Variable, übersetzt sie in Deutsch, druckt sie und gibt dann die Sprache auf Englisch zurück.

Etwas wie

body = _("Some text in English")
translation.activate("de")
print "%s" % body

druckt den Text jedoch in Englisch.

Antworten:

2 für die Antwort № 1

Wenn Sie Python 2.6 (oder Python 2.5 nach dem Importieren) verwenden with_statement von __future__) Sie können den folgenden Kontext-Manager zur Vereinfachung verwenden.

from contextlib import contextmanager
from django.utils import translation

@contextmanager
def language(lang):
if lang and translation.check_for_language(lang):
old_lang = translation.get_language()
translation.activate(lang)

try:
yield
finally:
if lang:
translation.activate(old_lang)

Anwendungsbeispiel:

message = _("English text")
with language("fr"):
print unicode(message)

Dies hat den Vorteil, sicher zu sein, falls etwas eine Ausnahme auslöst, und die alte Sprache des Threads anstelle des Django-Standards wiederherzustellen.


0 für die Antwort № 2

Nicht sicher, ob die Aktivierung / Deaktivierung der Übersetzung der richtige Weg ist, um dieses Problem zu lösen

Wenn ich mit diesem Problem konfrontiert würde, würde ich versuchen, ein Modell zum Speichern von Feldern für Betreff / Text / Sprache / Typ zu erstellen. Einige Codeentwürfe:

class ClientMessageTemplate(models.Model):
language = model.CharField(choices=AVAIALBLE_LANGUAGES,...)
subject = models.CharField(...)
body = models.CharField(...)
type = models.CharField(choices=AVAILABLE_MESSAGE_TYPES)

Dann können Sie problemlos ClientMessageTemplate abrufen, je nach Typ und Sprache des Clients.

Vorteil dieser Lösung ist, dass Sie alle Daten über die Admin-Schnittstelle pflegen können und nicht jedes Mal, wenn sich etwas ändert, die Nachrichtendateien neu kompilieren müssen.