2017-09-28 198 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