Вместо того, чтобы передавать переведенную тему, просто передайте ее без перевода:
subject = '%(user)s has posted a comment'
context = {'user': user}
def send_notifications(request, subject, url, context):
from django.utils.translation import activate
for s in Subscription.objects.filter(url=url):
activate(s.user.userprofile.lang)
send_mail(_(subject) % context, render_to_string('notification_email.txt', locals()), settings.SERVER_EMAIL, [s.user.email])
Если вы не собираетесь персонализировать содержимое для пользователя, то вы можете также ограничить количество визуализаций, потому что этонемного сбивает с толку:
# also do your imports at the top to catch import issues early
from django.utils.translation import activate
from django.utils.translation import ugettext as _
def send_notifications(request, url,
translatable_subject, context,
body_template='notification_template.txt'):
previous_lang = None
for s in Subscription.objects.filter(url=url).order_by('user__userprofile__lang'):
if s.user.userprofile.lang != previous_lang:
activate(s.user.userprofile.lang)
subject = _(translatable_subject) % context
body = render_to_string(body_template, locals())
send_mail(subject, body, settings.SERVER_EMAIL, [s.user.email])
previous_lang = s.user.userprofile.lang
Таким образом, гораздо более очевидно, что вы не собираетесь отображать электронные письма за использование.
Это небольшое переписывание должно заставить вас усомниться в исходном выборепары имен (locals, messages_template).
Приведенный выше пример кода является всего лишь «образованным предположением», и вам следует дважды проверить его и убедиться, что вы все понимаете, прежде чем вставить его.