Traductions lazy disparaissent des fichiers de traduction

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je tombe sur un comportement des traductions qui me laisse perplexe. J’utilise Python 3.8 et Django 3.

Dans le code de mon fichier views.py, j’ai une clé de traduction à traduire. La clé s’appelle users.views.login.success.

Le code qui concerne cette clé est très simple :

from django.utils.translation import ugettext as _
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.views import LoginView as BaseLoginView

class LoginView(SuccessMessageMixin, BaseLoginView):
    template_name = 'users/login.html'
    success_url = '/'
    success_message = _('users.views.login.success')

Lorsque je lance python manage.py makemessages, j’ai bien la clé qui apparaît dans mon fichier de langue. Par contre, lorsque j’affiche ce message sur mon site, il n’est pas traduit, ou plutôt, il est toujours en anglais (la langue par défaut du projet, en plus de laquelle je gère le français).

Donc je me suis dit, il faut peut-être marquer cette chaîne comme lazy.

J’ai donc remplacé le code par le suivant :

from django.utils.translation import ugettext_lazy as _lazy
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.views import LoginView as BaseLoginView

class LoginView(SuccessMessageMixin, BaseLoginView):
    template_name = 'users/login.html'
    success_url = '/'
    success_message = _lazy('users.views.login.success')

Et ô miracle, mon texte s’affiche bien en français !

Mais mais mais, lorsque je fais à nouveau un python manage.py makemessages, la chaîne de traduction est enlevée par la commande ! Le résultat est le suivant :

#~ msgid "users.views.login.success"
#~ msgstr "Vous êtes maintenant connecté !"

Je ne comprends pas pourquoi la chaîne est retirée de mon fichier de traductions, ce comportement me semble très bizarre…

Quelqu’un saurait-il voir ce qui cloche ?

Merci à tous pour votre aide.

Salut @entwanne,

Eh bien dis-donc merci beaucoup, le problème venait a priori de là… Je ne l’ai pas réglé exactement comme ça, car j’utilisais déjà l’alias _ pour ugettext dans le même fichier.

Mais du coup, j’ai supprimé l’alias pour ugettext_lazy et l’ai utilisé directement, et tout fonctionne bien maintenant… Merci encore.

As-tu une idée de pourquoi cet alias provoque ce comportement, pour ma culture ?

L’extracteur de chaînes à traduire de Django ne connaît pas les imports, et récupère les chaînes uniquement quand elles sont en paramètre de certains noms de fonctions. _ est un nom extrait, ainsi que tous les noms non-aliasés des méthodes de traduction de Django, mais _lazy, non.

Ce comportement peut se changer, si c’est nécessaire, mais il faut connaître le fonctionnement des paramètres de la commande d’extraction de traductions de gettext (xgettext), que Django utilise (ce n’est cela dit pas très complexe à apprendre).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte