57 votes

définir la langue dans une vue django

arrière-plan: La vue est appelée lorsqu'un service de paiement ping de retour d'un paiement de résultats derrière les coulisses - après quoi j'ai besoin d'envoyer un e-mail dans la bonne langue pour confirmer le paiement et ainsi de suite. Je peux obtenir le code de la langue en arrière dans la demande du serveur de paiement et que vous souhaitez utiliser avec Django i18n systèmes afin de déterminer la langue à envoyer mon e-mail dans.

J'ai donc besoin de définir la langue de mon django application à partir d'un point de vue. Et puis faire de mon modèle de rendu et d'e-mails en une seule fois.

paramètre request.session['django_language'] = lang seulement des effets de la prochaine voir quand je me suis mise à l'essai.

Est-il un autre moyen de le faire?

Cheers,

Guy

90voto

stefanw Points 5951

Pour citer des parties de l’environnement intermédiaire de Django ( 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()
 

Le translation.activate(language) est le bit important.

14voto

webjunkie Points 2101

Assurez-vous également d'ajouter deactivate dans process_response, sinon vous aurez des problèmes avec différents threads.

 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
 

3voto

Helgi Borg Points 35

Parfois, vous souhaitez appliquer une langue donnée pour une vue donnée, tout en laissant les paramètres de langue du navigateur choisir la langue pour les autres vues. Je n'ai pas compris comment changer la langue dans le code d'affichage, mais vous pouvez le faire en implémentant un simple middleware.

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
 

Dans settings.py:

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

Pas une solution élégante mais ça marche.

2voto

DenisKolodin Points 413

request.LANGUAGE_CODE si LocaleMiddleware est activé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X