2010-04-17 11 views
12

Ho un modello, Ordine, che ha un'azione nel pannello di amministrazione che consente ad un amministratore di inviare informazioni sull'ordine a determinate persone elencate nell'ordine. Ogni persona ha impostato la lingua e che è la lingua si suppone che il messaggio da inviare inDjango: cambia lingua del messaggio inviato dal pannello di amministrazione

Una versione breve di quello che sto usando:.

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() 

Le informazioni sui clienti circa il linguaggio che usa è disponibile in lang. La lingua predefinita è en-us, le traduzioni sono in francese (fr) e tedesco (de).

C'è un modo per utilizzare la traduzione per la lingua specificata in lang per body e subject quindi tornare a en-us? Ad esempio: lang è "de". L'oggetto e il corpo dovrebbero ottenere le stringhe specificate nei file di traduzione "de".

edit:

trovato una soluzione.

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') 

Quello che ci vuole la variabile body, lo traduce in tedesco, lo stampa poi ritorna la lingua inglese.

Qualcosa di simile

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

stampa il testo in inglese però.

+0

Modifica: Oooops, mi dispiace. C'è sicuramente qualcosa di sbagliato nella mia testa oggi. –

+2

translation.deactivate() potrebbe essere migliore di translation.activate ('en'). –

+0

Grazie. Non ho notato quella funzione. – yoshi

risposta

0
Non

sicuro se attivare/disattivare traduzione è modo corretto per risolvere il problema (?)

Se mi stavano affrontando questo problema avrei cercato di costruire qualche modello per la memorizzazione di campi soggetti/corpo/lingua/tipo. Qualche progetto di codice:

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

Quindi è possibile prelevare facilmente ClientMessageTemplate avete bisogno della base del tipo e la lingua del cliente.

Il vantaggio di questa soluzione è che è possibile mantenere tutti i dati gestibili tramite l'interfaccia di amministrazione e non è necessario ricompilare i file dei messaggi ogni volta che qualcosa è cambiato.

2

Se si utilizza Python 2.6 (o Python 2.5 dopo l'importazione di with_statement da __future__) è possibile utilizzare il seguente gestore di contesto per comodità.

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) 

Esempio di utilizzo:

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

Questo ha il vantaggio di essere al sicuro nel caso in cui qualcosa genera un'eccezione, così come il ripristino vecchio linguaggio del thread invece di quello predefinito Django.

Problemi correlati