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.
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!
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))
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/
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.