2010-12-27 26 views
7

Desde una señal de guardado en Django, deseo enviar un correo electrónico. El idioma del correo electrónico se debe establecer en función del contenido que se está guardando (tiene un indicador de idioma). ¿Cómo puedo pasar ese idioma a Djangos render_to_string helper? Solo puedo encontrar configuraciones de idioma para RequestContexts, y no hay ninguna solicitud o usuario disponible aquí.¿Cómo configurar el idioma en render_to_string helper?

Sinceramente Björn

+0

yo sólo encontré algo similar cuando se ejecuta un script de gestión ... solución fue añadir can_import_settings y translation.activate plazo (settings.LANGUAGE_CODE) después de eso. – benjaoming

+1

'translation.activate' también funcionó para mí (http: // stackoverflow.com/a/9283987 /) – dusan

Respuesta

1

Parece que puedo utilizar translation.activate (some_lang) antes de cada mensaje que envíe. No estoy seguro si esto es eficiente o no.

Veo que es posible enviar una instancia de contexto a render_to_string. Si puedo ubicar la configuración de idioma en ese contexto de alguna manera, sería bueno.

1

puede pasar un dictionnary personalizada para render_to_string

render_to_string(template_name, dictionary=None, context_instance=None) 

la variable de contexto por defecto para las lenguas (visto en django/middleware/context_processors.py) son:

context_extras['LANGUAGES'] = settings.LANGUAGES 
context_extras['LANGUAGE_CODE'] = translation.get_language() 
context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi() 

así que tal ajuste de la LANGUAGE_CODE es suficiente:

render_to_string('email-confirmation.html', {'LANGUAGE_CODE':'en'}) 

su plantilla debe verse como e esto:

{% load i18n %} 
{% trans "Welcome to our new webapp" %} 

Por supuesto que voy a tratar con archivos .po, pero usted debe ser consciente de que (si no echa this)

Espero que esto ayude.

10

respuesta basada en Django docs:

from django.template.loader import render_to_string 
from django.utils import translation 

(...) 

cur_language = translation.get_language() 
try: 
    translation.activate(some_language) 
    text = render_to_string('email-confirmation.html') 
finally: 
    translation.activate(cur_language) 

Y citando a la documentación (el énfasis es mío):

que es posible cargar un catálogo de traducción, activarlo y traducir el texto a idioma de su elección, , pero recuerde volver a cambiar al original idioma, ya que la activación de un catálogo de traducción se realiza por subproceso base y dicho cambio afectará el código que se ejecuta en el mismo hilo.

+0

Esto funcionó perfectamente para mí, al intentar establecer LANGUAGE_CODE, etc. en un nuevo objeto Context (como se sugiere en otras respuestas) no funcionó. –

1

De the documentation yo encontramos este manera más agradable:

para ayudar a escribir código más conciso, también hay un django.utils.translation.override gestor de contexto() que almacena el idioma actual en entrar y lo restaura a la salida. Con él, el ejemplo anterior se convierte en:

from django.utils import translation 

def welcome_translated(language): 
    with translation.override(language): 
     return translation.ugettext('welcome') 
Cuestiones relacionadas