2012-03-07 59 views
2

到函數內部Django視圖,我創建這樣一個主題:傳遞一個懶惰的翻譯字符串包括可變在Django

subject = _(u"%(user)s has posted a comment") % { 'user': user } 

然後我通過這個主題的功能,它可以處理電子郵件通知:

send_notifications(request, subject, url) 

在send_notifications中,我遍歷所有訂閱併發送電子郵件。然而,每個用戶可以有不同的語言,所以我通過Django的激活動態激活用戶的語言:

def send_notifications(request, subject, url): 
    from django.utils.translation import activate 
    for s in Subscription.objects.filter(url=url): 
     activate(s.user.userprofile.lang) 
     send_mail(subject, render_to_string('notification_email.txt', locals()), settings.SERVER_EMAIL, [s.user.email]) 

模板獲取每個用戶的正確的語言呈現。但是,該主題作爲評估和翻譯的字符串傳遞給send_notifications,因此不會被翻譯。

我玩懶惰的翻譯和lambda函數作爲參數,但沒有成功。任何幫助表示讚賞:)

回答

1

而是經過翻譯後的主題的,只是通過它非翻譯:

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,notification_template)的原始選擇。

上面的示例代碼幾乎不是「受過教育的猜測」,您應該仔細檢查它,並確保在粘貼之前瞭解所有內容。

+0

謝謝jpic。這是一個非常好的答案 - 只是投了!然而,問題是:send_notification不知道主題中使用的用戶變量 - 這是一個非常通用的通知函數。所以我無法訪問主題模板中的「用戶」對象:-P – 2012-03-07 20:22:34

+0

哦,非常酷的除了你的原始答案!謝謝!我沒有得到關於這個變化的通知,並且偶然偶然發現了它。 – 2012-05-15 22:40:20

1

好的,我自己找到了解決方案。如果有人運行到類似的問題:

from django.utils.translation import ugettext as _ 

# create subject as raw string in Django view 
raw_subject = r"%(username)s has posted a comment" 

# for the sake of generic variables, create a dictionary to pass to function 
extra_context = { 'user': user } 

# call function with raw string and dictionary as params 
send_notifications(request, raw_subject, url, extra_context) 

# translate the raw string inside send_notifications into the temporarily activated language 
translated_subject = _(raw_subject) % extra_context 

似乎是工作根據需要:)因爲我們正在與幾個不同的通知工作,我試圖避免爲每一種額外的模板。但是,使用extra_context調用模板也是一個可行的解決方案。