El cambio de Django, para un bloque de código, cambia el idioma para que las traducciones se realicen en un solo idioma.

Tengo un proyecto de django que utiliza un proceso de trabajo que envía correos electrónicos a los usuarios. Los procesos de trabajo escuchan a un servidor de rabbitmq y obtienen todos los detalles sobre el correo electrónico para enviar, las variables de la plantilla, la dirección de correo electrónico para enviar, etc. El cuerpo del correo electrónico se crea con las plantillas django y render_to_string .

Sin embargo quiero internacionalizar esto. Algunos de nuestros usuarios van a utilizar el sitio web en inglés, otros en otros idiomas. Deben recibir correos electrónicos en su idioma. He intentado i18n el proceso de trabajo del correo electrónico (utilizando django.utils.translations.ugettext / ugettext_lazy), de modo que el asunto y el cuerpo del correo electrónico tengan _ (…) o {% blocktrans%} resp.

Sin embargo, como el correo electrónico se procesa y se envía en un proceso de trabajo en segundo plano diferente, el proceso normal de detección del idioma django no parece aplicarse. No hay sesión de usuario, ni cookies ni encabezados http para que los vea. Al enviar el mensaje al servidor rabbitmq, puedo almacenar el código de idioma

Pero, ¿cómo le digo a django / gettext que use ese idioma en un punto?

Por ejemplo, mi función que envía un correo electrónico podría tener este aspecto:

def send_email(details): lang = details['lang'] name = details['name'] email_address = details['email_address'] switch_gettext_to_this_language_what_goes_here(lang): # ????? email_subject = _("Welcome to $SITE") 

¿Qué debo poner para cambiar django translations / gettext a un código de idioma específico para que el _() use ese código de idioma?

La forma más sencilla de cambiar de idioma es:

 from django.utils.translation import activate activate('en') # do smthg activate('pl') # do something in other language 

Tenga cuidado con esto, ya que está cambiando el contexto para el rest de la ejecución de este proceso / subproceso.

Como @SteveMayne señaló en el comentario (pero vale la pena una respuesta), ahora puede usar el administrador de contexto translation.override (funciona con Django 1.6, no verificó con versiones anteriores):

 from django.utils import translation print(_("Hello")) # Will print to Hello if default = 'en' # Make a block where the language will be Danish with translation.override('dk'): print(_("Hello")) # print "Hej" 

Básicamente usa lo mismo que @bitrut answer pero está integrado en Django, por lo que hace menos dependencias …

Puedes forzar el lenguaje de una manera agradable usando el administrador de contexto:

 class force_lang: def __init__(self, new_lang): self.new_lang = new_lang self.old_lang = translation.get_language() def __enter__(self): translation.activate(self.new_lang) def __exit__(self, type, value, tb): translation.activate(self.old_lang) 

A continuación, puede utilizar with statement:

 with force_lang('en'): ... 

Es muy sencillo usar django-i18next ( https://pypi.python.org/pypi/django-i18next ).

Cargue los templatetags.

 {% load i18n i18next %} 

El siguiente código obliga a la configuración regional holandesa para lo que se coloque dentro del bloque overridelocale .

 {% overridelocale 'nl' %} 

{% trans "Log in" %}

{% endoverridelocale %}

El siguiente código obliga a la configuración regional rusa para lo que se coloque dentro del bloque overridelocale .

 {% overridelocale 'ru' %} 

{% trans "Log in" %}

{% endoverridelocale %}

El siguiente código obliga a la configuración regional en inglés para lo que se coloque dentro del bloque overridelocale .

 {% overridelocale 'en' %} 

{% trans "Log in" %}

{% endoverridelocale %}

Resulta que los documentos de Django explican cómo :

Si bien Django proporciona un amplio conjunto de herramientas i18n para usar en vistas y plantillas, no restringe el uso al código específico de Django. Los mecanismos de traducción de Django se pueden usar para traducir textos arbitrarios a cualquier idioma que sea compatible con Django (siempre que exista un catálogo de traducción apropiado, por supuesto). Puede cargar un catálogo de traducción, activarlo y traducir el texto al idioma de su elección, pero recuerde volver a cambiar al idioma original, ya que la activación de un catálogo de traducción se realiza por subproceso y ese cambio afectará al código que se ejecuta en el mismo hilo. .