I'm internationalizing a Django project, which means putting gettext_lazy calls around all the strings. However you have to make sure to use them in a unicode cotext, not a byte string (or
str), otherwise you don't get the translated string back, you get
As the Django docs say:
If you ever see output that looks like "hello <django.utils.functional...>", you have tried to insert the result of ugettext_lazy() into a bytestring. That's a bug in your code.
I was bitten by this a few times, so I made this Django Middleware that will raise an exception if the string
"<django.utils.functional.__proxy__ object" is in the response. If you add this middleware and then run all your tests (You
class AssertNoGettextLazyInByteStringMiddleware(object): """ Raises an error if a response contains <django..., which occurs when you try to use _/ugettext_lazy in a bytestring. This prevents the text from being translated cf. http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/#lazy-translation """ def process_response(self, request, response): assert '<django.utils.functional.__proxy__ object at 0' not in response.content, "Gettexted lazy string used in bytestring for url %s: content: %s" % (request.path, response.content) return response