multi language_code idioma espaƱol django internationalization

language_code - establecer el idioma dentro de una vista django



django translation (8)

Antecedentes: la vista se activa cuando un servicio de pago devuelve un resultado de pago tras bambalinas, por lo que debo enviar un correo electrónico en el idioma correcto para confirmar el pago, etc. Puedo recuperar el código de idioma en la solicitud del servidor de pago y me gustaría usarlo junto con los sistemas i18n de Django para determinar en qué idioma enviaré mi correo electrónico.

Así que necesito configurar el idioma de mi aplicación django desde una vista. Y luego hacer mi plantilla de procesamiento y correo electrónico todo de una vez.

configurar request.session[''django_language''] = lang solo afecta a la siguiente vista cuando estoy probando.

¿Hay alguna otra forma de hacerlo?

Aclamaciones,

Chico


A veces desea aplicar un determinado idioma para una vista determinada, pero deje que la configuración de idioma del navegador elija el idioma para el resto de las vistas. No he descubierto cómo cambiar el idioma en el código de vista, pero puede hacerlo implementando un Middleware simple

lang_based_on_url_middleware.py:

from django.utils import translation # Dictionary of urls that should use special language regardless of language set in browser # key = url # val = language code special_cases = { ''/this/is/some/url/'' : ''dk'', ''/his/is/another/special/case'' : ''de'', } class LangBasedOnUrlMiddleware(object): def process_request(self, request): if request.path_info in special_cases: lang = special_cases[request.path_info] translation.activate(lang) request.LANGUAGE_CODE = lang

En settings.py:

MIDDLEWARE_CLASSES = ( ... ''django.middleware.locale.LocaleMiddleware'', ''inner.lang_based_on_url_middleware.LangBasedOnUrlMiddleware'', # remember that the order of LocaleMiddleware and LangBasedOnUrlMiddleware matters ... )

No es una solución elegante pero funciona.


Asegúrese de agregar también desactivar en process_response, de lo contrario tendrá problemas con diferentes subprocesos.

from django.utils import translation class LocaleMiddleware(object): """ This is a very simple middleware that parses a request and decides what translation object to install in the current thread context. This allows pages to be dynamically translated to the language the user desires (if the language is available, of course). """ def process_request(self, request): language = translation.get_language_from_request(request) translation.activate(language) request.LANGUAGE_CODE = translation.get_language() def process_response(self, request, response): translation.deactivate() return response


Con vistas basadas en clase, esto debería funcionar:

class YourView(SomeBuiltInView): def get(self, request, *args, **kwargs): setattr(request, ''LANGUAGE_CODE'', ''YOUR_LANGUAGE_CODE'') return super().get(self, request, *args, **kwargs)

Básicamente, todo lo que hace es hacer que el renderizador de vistas piense que la solicitud provino de YOUR_LANGUAGE_CODE lugar de lo que originalmente era verdadero.


Para citar partes de Django''s Locale Middleware ( django.middleware.locale.LocaleMiddleware ):

from django.utils import translation class LocaleMiddleware(object): """ This is a very simple middleware that parses a request and decides what translation object to install in the current thread context. This allows pages to be dynamically translated to the language the user desires (if the language is available, of course). """ def process_request(self, request): language = translation.get_language_from_request(request) translation.activate(language) request.LANGUAGE_CODE = translation.get_language()

La translation.activate(language) es el bit importante.


Puede considerar almacenar el idioma en el modelo de usuario y usar este middleware personalizado django-user-language-middleware .

Esto permite una fácil traducción de su aplicación Django mirando el idioma seleccionado en el campo de lenguaje de usuario y siempre puede conocer la preferencia de idioma de cualquier usuario.

Uso:

  1. Agregue un campo de idioma a su modelo de usuario:

    class User(auth_base.AbstractBaseUser, auth.PermissionsMixin): # ... language = models.CharField(max_length=10, choices=settings.LANGUAGES, default=settings.LANGUAGE_CODE)

  2. Instala el middleware desde pip:

    pip install django-user-language-middleware

  3. Agréguelo a su lista de clases de middleware en la configuración para escuchar las solicitudes:

    MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10 ... ''user_language_middleware.UserLanguageMiddleware'', ... ]

Espero que esto pueda ayudar a las personas a abordar esta cuestión en el futuro.


Si está utilizando django 1.10 o superior, hay una nueva sintaxis para middleware personalizado:

from django.utils import translation class LocaleMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self, request): language_code = ''en'' #TODO, your logic translation.activate(language_code) response = self.get_response(request) translation.deactivate() return response


Si solo desea obtener las cadenas traducidas para un idioma por cualquier razón, puede usar la función de override como decorador de esta manera:

from django.utils import translation from django.utils.translation import ugettext as _ with translation.override(language): welcome = _(''welcome'')


request.LANGUAGE_CODE si LocaleMiddleware está activado