Django翻译 - 翻译动态字符串

时间:2017-09-28 10:08:04

标签: python django

我们使用Django作为后端REST API服务器。我希望将发送的文本翻译为推送通知到我们的应用程序。我是翻译新手。

文本位于配置文件中,并因每个用户而异。

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

我看到谷歌翻译功能,如果给出最后一句,了解user_name和story_name是不变的,它会完美翻译。 我在Django中寻找类似的魔术带功能,我可以在发送给Accept-language呼叫的REST标头中收到的语言环境中的用户之前将最终消息包装起来。但这似乎不可能。

据我所知,我需要预先标记需要用ugettext翻译的文本,并定义语言和中间件设置。然后使用

生成locale个特定文件

django-admin makemessages -l de

然后在该特定语言环境的生成的django.po文件中手动为翻译文本提供Django引用。

但我被困在如何标记,因为我的信息是动态的,在一个dic内。或者还有另一种方法吗?

编辑:

数据访问如下

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

1 个答案:

答案 0 :(得分:4)

在插入动态上下文之前,你必须在消息中应用适当的翻译函数,在这种情况下(模块级别,我假设),这将是一个懒惰的:

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'}