I've been seeing some really weird behavior on a multilingual Django site I'm finishing up. Most of the text would be fine, but form labels and help_text would display in the wrong language. They would all be in Japanese, no matter what language you viewed, for example, or all Spanish. When I restarted Apache, the language would change (now they would be all Portguese). At first I thought it might be a problem with some middleware code I'm using to grok the language by inserting the 2-letter ISO language codes in the URL, but that turned out to be working correctly. Then I thought there might be a problem with the translation files, but they looked okay.
Turns out it was really simple. I spent some time on the Django internationalization page and discovered that you're supposed to use ugettext_lazy in your models and forms code instead of ugettext. Of course! Basically, the idea is that with the regular ugettext the translation is performed when the code is read, whereas with ugettext_lazy the translation happens when the text in the code is display. I don't fully understand what's going on underneath that Django hood, but I changed my code and the problem went away.:
from django.utils.translation import ugettext_lazy as _ class MyThing(models.Model): name = models.CharField(help_text=_('This is the help text'))
<!-- SUMMARY_END -->