web-dev-qa-db-fra.com

Quand dois-je utiliser ugettext_lazy?

J'ai une question sur l'utilisation d'ugettext et ugettext_lazy pour les traductions. J'ai appris que dans les modèles, je devrais utiliser ugettext_lazy, dans les vues ugettext. Mais y a-t-il d'autres endroits où je devrais utiliser ugettext_lazy aussi? Qu'en est-il des définitions de formulaire? Existe-t-il des différences de performances entre eux?

Edit: Et encore une chose. Parfois, au lieu de ugettext_lazy, ugettext_noop est utilisé. Comme le dit la documentation, ugettext_noop les chaînes ne sont marquées que pour la traduction et traduites au plus tard avant d'être affichées pour l'utilisateur, mais je suis un peu confus ici, n'est-ce pas similaire à ce que ugettext_lazy faire? Il m'est encore difficile de décider lequel utiliser dans mes modèles et formulaires.

125
Dzejkob

ugettext() vs ugettext_lazy()

Dans les définitions comme les formulaires ou les modèles, vous devez utiliser ugettext_lazy Car le code de ces définitions n'est exécuté qu'une seule fois (principalement au démarrage de Django); ugettext_lazy Traduit les chaînes de façon paresseuse, ce qui signifie, par exemple. chaque fois que vous accédez au nom d'un attribut sur un modèle, la chaîne sera de nouveau traduite, ce qui est tout à fait logique car vous pourriez regarder ce modèle dans différentes langues depuis Django a été démarré!

Dans les vues et les appels de fonctions similaires, vous pouvez utiliser ugettext sans problème, car chaque fois que la vue est appelée ugettext sera nouvellement exécutée, vous obtiendrez donc toujours la bonne traduction adaptée à la demande!

Concernant ugettext_noop()

Comme Bryce l'a souligné dans sa réponse, cette fonction marque une chaîne comme extractible pour la traduction mais retourne la chaîne non traduite. Ceci est utile pour utiliser la chaîne à deux endroits - traduit et non traduit. Voir l'exemple suivant:

import logging
from Django.http import HttpResponse
from Django.utils.translation import ugettext as _, ugettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))
176
Bernhard Vallant

Une excellente utilisation de _noop, est lorsque vous souhaitez enregistrer un message en anglais pour les développeurs, mais présenter la chaîne traduite à un visualiseur. Un exemple de ceci est à http://blog.bessas.me/posts/using-gettext-in-Django/

16
Bryce

La version paresseuse renvoie un objet proxy au lieu d'une chaîne et dans certaines situations, cela ne fonctionnerait pas comme prévu. Par exemple:

def get(self, request, format=None):
   search_str = request.GET.get('search', '')
   data = self.search(search_str)
   lst = []
   lst.append({'name': ugettext_lazy('Client'), 'result': data})
   return HttpResponse(json.dumps(lst), content_type='application/json')

échouerait car la toute dernière ligne essaierait de sérialiser lst l'objet en JSON et au lieu d'une chaîne pour "client" il aurait un objet proxy. L'objet proxy n'est pas sérialisable dans json.

5
Alex Protyagov