2010-04-17 6 views
12

Ich habe ein Modell, Bestellung, die eine Aktion im Admin-Panel hat, dass ein Admin Informationen über die Bestellung an bestimmte Personen gesendet, die diese Reihenfolge gesendet haben. Jede Person hat Sprachset und das ist die Sprache die Nachricht in werden soll gesendetDjango: Sprache der Nachricht von Admin-Panel

eine kurze Version von dem, 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 requested\n") 
body += some_order_information 

subject = _("Order information") 

email = EmailMessage(subject, body, '[email protected]', ['[email protected]']) 
email.send() 

Der Kunde Informationen über die Sprache, die er verwendet, ist verfügbar in 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 Sprache zu verwenden, die in lang für body und subject angegeben ist, und dann zurück zu en-us wechseln? Zum Beispiel: lang ist 'de'. Das Subjekt und der Körper sollten die in den 'de' Übersetzungsdateien angegebenen Zeichenfolgen erhalten.

edit:

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 macht es die body Variable nehmen, übersetzt sie in Deutsch, druckt es dann die Sprache in Englisch zurück.

So etwas wie

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

druckt den Text in Englisch though.

+0

Bearbeiten: Hoppla, tut mir leid. Es ist definitiv etwas falsch mit meinem Kopf heute. –

+2

translation.deactivate() ist möglicherweise besser als translation.activate ('en'). –

+0

Danke. Ich habe diese Funktion nicht bemerkt. – yoshi

Antwort

0

nicht sicher, ob die Aktivierung/Deaktivierung Übersetzung richtige Art und Weise ist das Problem (?)

zu lösen Wenn ich dieses Problem konfrontiert war ich versuchen würde, einige Modelle für die Speicherung von Themen/Körper/Sprache/Typ Felder zu bauen. Einige Code Entwurf:

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 retreive leicht ClientMessageTemplate Sie benötigen Basis auf Art und Kunden Sprache.

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

2

Wenn Sie Python 2.6 (oder Python 2.5 nach dem Import with_statement von __future__) verwenden, können Sie den folgenden Kontextmanager aus praktischen Gründen 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 den Vorteil hat von, falls etwas sicher ist eine Ausnahme auslöst, sowie die Wiederherstellung der alten Sprache Thread anstelle des Django Standard.

Verwandte Themen