2017-09-28 249 views
0

我們使用Django作爲我們的後端REST API服務器。我正在尋找翻譯文本作爲推送通知發送到我們的應用程序。我是翻譯新手。Django翻譯 - 翻譯動態字符串

該文本駐留在配置文件中,並且因用戶而異。

NOTIFICATION_TEXT = { 
    'access_request': '%(user_name)s has requested to access your document %(story_name)s, please review '} 

我看到了谷歌翻譯功能,它完美地翻譯了,如果給出理解user_name和story_name的最後一句是不變的。 我在Django尋找類似的魔術樂隊功能,在發送給REST調用的Accept-language標頭中收到的語言環境中的用戶之前,我可以最終包裝最終消息。但這似乎不可能。

據我所知,我需要預先標記需要用ugettext翻譯的文本,並定義語言和中間件設置。然後使用

django-admin makemessages -l de

產生locale特定的文件,然後在生成的django.po文件針對特定區域手動給翻譯文本Django的參考。

但我堅持如何標記鑑於我的消息是動態的,在一個dic裏面。或者有其他方法嗎?

編輯:

的數據如下

data['msg'] = settings.NOTIFICATION_TEXT['access_request'] % \ 
       dict(
       user_name=get_user_name(sender), 
       story_name=story.story_name 
      ) 

回答

3

訪問你插入動力方面,在這種情況下,之前應用合適的翻譯功能的消息(模塊級,我假設)這將是懶惰者之一:

from django.utils.translation import ugettext_lazy as _ 

NOTIFICATION_TEXT = { 
    'access_request': _('%(user_name)s has requested to access your document %(story_name)s, please review ') 
} 

makemessages -l de然後將創建語言環境的django.po的條目:

msgid "%(user_name)s has requested to access your document %(story_name)s, please review " 
msgstr "" 

翻譯後的字符串必須包含所有的動態佔位符不變:

msgid "%(user_name)s has requested to access your document %(story_name)s, please review " 
msgstr "%(user_name)s hat Zugang zu Ihrem Dokument %(story_name)s beantragt, bitte überprüfen Sie " 

是很重要的(user_namestory_name)範圍內應用到消息後,將翻譯功能,你的架構幾乎已經在這個時候執行:

message = NOTIFICATION_TEXT['access_request'] % {'user_name': 'foo', 'story_name': 'bar'} 
+0

好吧,現在我有'django.po'文件與abo ve'msgid'並插入了'msgstr',但它仍不能翻譯最終文本。在我的'settings.py'文件中,我有'LANGUAGE_CODE ='de'','USE_I18N = True',在中間件中添加了''django.middleware.locale.LocaleMiddleware'',在Sesssion之後和Common之前。不知道他們是否有幫助,但以防萬一。 – garg10may

+0

看起來很對我。您應該添加調試以檢查哪種語言已激活。你可以在django shell中嘗試它並手動激活德語。 ('django.utils.translation.activate( '德')')。順便說一句,你有沒有叫'compilemessages'? – schwobaseggl

+0

現在就運行'compilemessages',然後手動激活'de',從shell進行測試,但沒有得到翻譯後的字符串。你的意思是我的,我必須在應用翻譯功能後應用上下文? – garg10may