"gettext()" vs "gettext_lazy()" in Django

django, django-i18n, gettext, lazy-evaluation, python

Solution

`gettext()` vs. `gettext_lazy()`

In definitions like forms or models you should use `gettext_lazy` because the code of this definitions is only executed once (mostly on django's startup); `gettext_lazy` translates the strings in a lazy fashion, which means, eg. every time you access the name of an attribute on a model the string will be newly translated-which totally makes sense because you might be looking at this model in different languages since django was started!

In views and similar function calls you can use `gettext` without problems, because everytime the view is called `gettext` will be newly executed, so you will always get the right translation fitting the request!

Regarding `gettext_noop()`

As Bryce pointed out in his answer, this function marks a string as extractable for translation but does return the untranslated string. This is useful for using the string in two places – translated and untranslated. See the following example:

import logging
from django.http import HttpResponse
from django.utils.translation import gettext as _, gettext_noop as _noop

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

Problem

I have a question about using ugettext and `gettext_lazy()` for translations. I learned that in models I should use `gettext_lazy()`, while in views ugettext. But are there any other places, where I should use `gettext_lazy()` too? What about form definitions? Are there any performance diffrences between them? Edit: And one more thing. Sometimes, instead of `gettext_lazy()`, `gettext_noop()` is used. As documentation says, `gettext_noop()` strings are only marked for translation and translated at the latest possible momment before displaying them to the user, but I'm little confused here, isn't that similar to what `gettext_lazy()` do? It's still hard for me to decide, which should I use in my models and forms.

Original source