Traduire des modèles, des vues et des modèles en plusieurs langues

Django offre un excellent support pour les sites multilingues. Dans ce tutoriel, on montrera comment traduire des modèles en plusieurs langues. On se concentrera sur la traduction de texte qui se trouve quelque part dans votre modèle, vos formulaires, vos vues ou vos modèles. Les sites multilingues ont évidemment aussi un contenu de page (articles, etc.) en plusieurs langues; c'est le sujet d'un autre tutoriel.

8 Juillet 2020 08:05
Thèmes: Plusieurs langues

La première chose à faire est de dire à Django via les paramètres qu'on utilisera plusieurs langues. Disons que vous avez l'anglais comme langue principale et que vous voulez aussi le français et le néerlandais; ajoutez les éléments suivants à vos paramètres (ou vérifiez qu'ils existent):

LANGUAGE_CODE = 'en'

USE_I18N = True

LANGUAGES = [
    ('en', 'English'),
    ('fr', 'Français'),
    ('nl', 'Nederlands'),
]

Vous devez également ajouter LocaleMiddleware. Ajoutez-le à votre paramètre MIDDLEWARE, après SessionMiddleware et CacheMiddleware (si présent) et avant CommonMiddleware:

'django.middleware.locale.LocaleMiddleware',

On utilise maintenant le système i18n pour créer différentes URLs pour différentes langues, en ajoutant la fonction i18n_patterns dans le fichier urls.py de votre projet avant toutes les URLs incluses qu'on veut avoir dans plusieurs langues. Par exemple, dans les didacticiels précédents, on a inclus des URLs pour une application d'authentification; si on veut ces derniers disponibles en plusieurs langues, alors on met ce qui suit dans notre urls.py:

urlpatterns += i18n_patterns(
    path('accounts/', include('allauth.urls')),
    path('accounts/', include('userauth.urls')),
)

Remarque: si vous utilisez également Wagtail, ne placez pas les URLs Wagtail dans la fonction i18n_patterns; on gérera les pages Wagtail traduites d'une autre manière. Consultez le fichier urls.py sur Github.

Vous pouvez vérifier que les préfixes fonctionnent en accédant à une URL dans votre projet avec le préfixe donné. Disons qu'on a une url /accounts/login/, puis allez à /fr/accounts/login/, et cela devrait rendre le modèle. Bien sûr, le modèle est toujours en anglais; Django ne le fera pas pour nous, alors commençons à le faire nous-mêmes. Créez un répertoire nommé locale dans votre répertoire de projet et informez-en Django en ajoutant ce qui suit à vos paramètres:

LOCALE_PATHS = (os.path.join(BASE_DIR, 'locale'),)

On est maintenant prêt à utiliser la commande makemessages de Django. Cette commande utilise l'outil gettext, vous devez donc l'installer sur votre ordinateur. Exécutez ensuite:

django-admin makemessages -l fr

ou quelle que soit la langue que vous souhaitez traduire. Toutes les phrases qui sont marquées pour la traduction dans vos modèles, formulaires, vues, modèles, etc. sont ensuite trouvées et répertoriées dans un fichier texte avec l'extension .po dans le répertoire local. Le fichier .po générera également des phrases pour les applications que vous avez installées, dans notre cas, allauth. Vous pouvez éviter cela en utilisant l'indicateur -i (ignore) pour exclure les fichiers du répertoire env:

django-admin makemessages -l fr -i env

Le marquage des phrases pour traduction se fait de deux manières. Dans vos fichiers .py (modèles, formulaires, vues, etc.), utilisez gettext ou gettext_lazy. Dans vos modèles, utilisez {% trans %} ou {% blocktrans %}. Dans nos tutoriels précédents, on a fait les deux de manière cohérente pour tous les 'textes lisibles par l'homme'.

Vous devez traduire manuellement toutes les phrases du fichier .po. Par exemple, disons qu'à la ligne 11 de notre fichier models.py de notre application userauth, on a la phrase "Date of Birth", puis une entrée dans le fichier .po serait:

#: userauth/models.py:11
msgid "Date of Birth"
msgstr ""

L'ajout de la traduction française changerait cela en:

#: userauth/models.py:11
msgid "Date of Birth"
msgstr "Date de naissance"

Si une phrase est trop longue, Django la divisera de la manière suivante:

#: userauth/templates/userauth/account/email_confirm.html:17
msgid ""
"Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail "
"address for user %(user_display)s."
msgstr ""

Notre traduction msgstr se lirait alors:

msgstr ""
"Veuillez confirmer que <a href=\"mailto:%(email)s\">%(email)s</a> est une adresse "
"e-mail pour l'utilisateur %(user_display)s."

Comme dans cet exemple, copiez tout ce qui n'est pas du texte littéralement, comme les balises html et les noms de variables. Lorsque Django n'est pas sûr, il ajoutera une ligne avec le mot fuzzy, afin que vous puissiez vous juger de la façon de gérer cela. Une fois toutes les traductions terminées, on est prêt à compiler les fichiers .po:

django-admin compilemessages --locale fr

Remarque: lorsque vous utilisez un compte social pour vous connecter, vous devez ajouter les URL de rappel avec les préfixes de langue, sinon le fournisseur de compte social ne pourra pas trouver la page.

Après la connexion, on est redirigés vers la page de profil /accounts/profile/, mais cette URL n'a pas de préfixe, on se retrouvera donc sur cette page dans la langue par défaut, ce qui n'est pas ce qu'on veut. Afin de réparer cela, mettez ce qui suit dans le fichier de paramètres; cela résoudra les URLs via urls.py, y compris le code de langue:

from django.urls import reverse_lazy

LOGIN_URL = reverse_lazy('account_login')
LOGIN_REDIRECT_URL = reverse_lazy('account_profile')

Chaque fois que de nouvelles phrases sont ajoutées à vos fichiers .py ou .html ou que des phrases existantes sont modifiées, réexécutez la commande makemessages, modifiez les fichiers .po et réexécutez la commande compilemessages.

Comme mentionné au début, lisez plus si vous souhaitez également traduire le contenu de vos pages Web.

Commentez cet article (connectez-vous d'abord ou confirmez par nom et email ci-dessous)