2010-04-17 32 views
12

Tengo un modelo, orden, que tiene una acción en el panel de administración que le permite a un administrador enviar información sobre el pedido a ciertas personas enumeradas en esa orden. Cada persona tiene juego de lenguaje y que es el idioma se supone que el mensaje que se enviará enDjango: cambiar el idioma del mensaje enviado desde el panel de administración

Una versión corta de lo que estoy 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() 

La información de los clientes sobre el lenguaje que utiliza está disponible en lang. El idioma predeterminado es en-us, las traducciones están en francés (fr) y alemán (de).

¿Hay alguna manera de utilizar la traducción para el idioma especificado en lang para body y subject y luego volver a encender-es? Por ejemplo: lang es 'de'. El sujeto y el cuerpo deben obtener las cadenas especificadas en los archivos de traducción 'de'.

edit:

encontrado una solución.

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

Lo que esto se necesita la variable body, lo traduce al alemán, lo imprime a continuación, devuelve el idioma a Inglés.

Algo así como

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

imprime el texto en Inglés sin embargo.

+0

Edit: Oooops, lo siento. Definitivamente hay algo mal en mi cabeza hoy. –

+2

translation.deactivate() podría ser mejor que translation.activate ('en'). –

+0

Gracias. No noté esa función. – yoshi

Respuesta

0
No

seguro si la activación/desactivación de la traducción es forma correcta de resolver ese problema (?)

Si estuviera mirando hacia ese problema me gustaría tratar de construir algún modelo para los campos de los sujetos/cuerpo/idioma/tipo de almacenamiento. Algunas proyecto de código:

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

A continuación, puede fácilmente retreive ClientMessageTemplate que necesita la base del tipo y el idioma del cliente.

La ventaja de esta solución es que puede tener todos los datos mantenibles a través de la interfaz de administración y no es necesario volver a compilar los archivos de mensajes cada vez que algo cambia.

2

Si está utilizando Python 2.6 (o Python 2.5 después de importar with_statement desde __future__) puede usar el siguiente administrador de contexto para mayor comodidad.

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) 

Ejemplo de uso:

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

Esto tiene la ventaja de ser seguro en caso de que algo se produce una excepción, así como la restauración de la lengua antigua de la rosca en lugar del predeterminado Django.

Cuestiones relacionadas