Domanda Django: cambia la lingua del messaggio inviato dal pannello di amministrazione


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 una lingua impostata e questa è la lingua in cui il messaggio dovrebbe essere inviato.

Una versione breve di ciò 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, 'customer@example.org', ['admin@example.org'])
email.send()

Le informazioni del cliente sulla lingua che utilizza sono disponibili in lang. La lingua predefinita è en-us, le traduzioni sono in francese (fr) e tedesco (de).

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

modificare:

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

Ciò che questo prende il body variabile, lo traduce in tedesco, lo stampa e restituisce la lingua all'inglese.

Qualcosa di simile a

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

stampa il testo in inglese però.


11
2018-04-17 13:39


origine


risposte:


Se stai usando Python 2.6 (o Python 2.5 dopo l'importazione with_statement a partire dal __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 generi un'eccezione, oltre a ripristinare il vecchio linguaggio del thread al posto del default di Django.


2
2018-06-13 00:22



Non sono sicuro che l'attivazione / disattivazione della traduzione sia il modo corretto per risolvere il problema (?)

Se dovessi affrontare questo problema, proverei a creare un modello per memorizzare i campi soggetto / corpo / lingua / tipo. Qualche bozza 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 puoi recuperare facilmente ClientMessageTemplate in base al tipo e alla 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.


0
2018-06-09 16:38