web-dev-qa-db-fra.com

Django: Comment obtenir le code de langue dans le modèle?

Existe-t-il une variable globale pour obtenir le code de la langue dans le modèle Django ou au moins le passer par la vue? Quelque chose comme: {{ LANG }} devrait produire "en" par exemple .. Je ne suis vraiment pas à l'aise quand les gens utilisent request.LANGUAGE_CODE.

Une explication détaillée serait appréciée =)

38
holms

S'il n'existait pas déjà, vous devrez écrire un processeur de contexte de modèle . Voici comment procéder.

Mettez ça quelque part:

def lang_context_processor(request):
    return {'LANG': request.LANGUAGE_CODE}

Et puis, ajoutez-y une référence TEMPLATE_CONTEXT_PROCESSORS paramètre. Quelque chose comme ça:

from Django.conf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    'myproject.myapp.templatecontext.lang_context_processor',
)

(Je recommande d'ajouter au paramètre global car cela signifie que vous ne cassez pas les choses accidentellement lorsqu'un nouveau processeur de contexte est ajouté aux paramètres par défaut.)

Cependant, il existe, car le processeur de contexte de modèle intégré Django.template.context_processors.i18n . Vous pouvez y accéder en tant que LANGUAGE_CODE.

Par pur intérêt, voici la définition de cette fonction:

def i18n(request):
    from Django.utils import translation
    return {
        'LANGUAGES': settings.LANGUAGES,
        'LANGUAGE_CODE': translation.get_language(),
        'LANGUAGE_BIDI': translation.get_language_bidi(),
    }

Assurez-vous que vous utilisez un RequestContext pour le rendu de votre modèle, pas un simple Context, sinon cela ne fonctionnera pas.

19
Chris Morgan

C'est un vieux sujet. Mais certains pourraient le trouver utile.

{% load i18n %}
...
{% get_current_language as LANGUAGE_CODE %}

Django référence et exemple .

109
Rafael

Testé avec Django==1.11.2.

Activez I18N Et utilisez le processeur de contexte de modèle i18n.

# setings.py

USE_I18N = True
# ...
TEMPLATES = [
    {
        'BACKEND': 'Django.template.backends.Django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ...
                'Django.template.context_processors.i18n',
                # ...
            ],
        },
    },
]

Et puis c'est simple dans le modèle.

# template.html

{% load i18n %}
{{ LANGUAGE_CODE }}


Mais utilisez render(), pas render_to_response() , dans votre fonction d'affichage pour que la variable LANGUAGE_CODE Soit accessible dans le modèle:

render_to_response ()

Cette fonction a précédé l'introduction de render () et fonctionne de la même manière, sauf qu'elle ne rend pas la demande disponible dans la réponse. Il n'est pas recommandé et sera probablement obsolète à l'avenir.

9
Dušan Maďar