在Django中使用Python 2.7中可用的格式函数时,字符串不会被翻译。

20
Python 2.7中使用format格式化字符串是一种推荐的新方式,这种方式会导致在Django中无法翻译字符串吗?
这些字符串位于.po文件中,并已被翻译,但在网站上不会被翻译。例如:
from django.utils.translation import ugettext as _

website_name = "Stackoverflow"
title = _(u"{sitename} is a good website".format(sitename=website_name))

翻译完字符串后,.po 文件的内容如下:

#: path/to/file.py:4
msgid "{sitename} is a good website"
msgstr "{sitename} ist eine gute Website"
在运行django-admin.py compilemessages并重新启动Web服务器后,在处理过的HTML页面中,它仍然是英文,而所有其他字符串都被翻译了。 此外,使用format的所有字符串都没有被翻译,而使用%操作符格式化的字符串按预期被翻译。 这也不是一个gettext/ugettext问题,因为两个函数都存在相同的问题。

13
你尝试过使用_(u"{sitename}是一个不错的网站").format...吗? - jfs
这解决了问题。在这里询问之前,我已经搜索了数小时的解决方案,所以非常感谢您快速而有帮助性的回复。为什么您发布它作为评论而非答案呢? - Iodnas
不适用于 OP,但关于 format 的注意事项:当 format_string 或任何 str.format() 参数包含惰性翻译对象时,Python 的 str.format() 方法将无法工作。https://docs.djangoproject.com/en/1.11/topics/i18n/translation/#formatting-strings-format-lazy - User
3个回答

12

compilemessages看到的字符串是"{sitename}是一个好网站",但是当应用程序运行时,实际上这个字符串是例如"MySite是一个好网站",这显然没有翻译。您必须先翻译裸字符串,然后才能对其执行模板操作。


14
为了更清晰,这意味着_(u"{sitename}是一个不错的网站").format(sitename=website_name)(请注意括号位置的不同)。这也可以与ugettext_lazy完美配合使用,详见https://dev59.com/eWgu5IYBdhLWcg3w5K9a。 - Davide

3
以下应该可以正常工作:
_('Foo %(x)s') % {'x': "bar"}

s是字符串,d是整数。


1
我曾经遇到过同样的问题,所以我先翻译了文本,然后再添加动态内容。
title = _(u"is a good website")
title = " ".join([website_name, title])

一定有更好的方法来做这件事


谢谢您的回答,但是动态部分(占位符)必须作为字符串的一部分,以便在短语中允许特定于语言的放置。在您的解决方案中,它将固定在字符串的开头。 - Iodnas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接