2010-04-17 6 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.