【问题标题】:Strings won't be translated in Django using format function available in Python 2.7字符串不会在 Django 中使用 Python 2.7 中可用的格式函数进行翻译
【发布时间】:2012-07-22 17:43:11
【问题描述】:

在 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 并重新启动网络服务器后,在已处理的 HTML 页面上,它仍然是英文的,而所有其他字符串正在被翻译。此外,虽然所有使用format 的字符串都不会被翻译,但使用% 运算符格式化的字符串会按预期进行翻译。这也不是 gettext/ugettext 问题,因为这两个函数的问题是相同的。

【问题讨论】:

  • 你试过_(u"{sitename} is a good website").format...
  • 这解决了问题。在向这里提问之前,我花了几个小时寻找解决方案,非常感谢您快速而有帮助的回复。为什么您将其发布为评论而不是答案?
  • 不适用于OP,但注意format: Python’s str.format() method will not work when either the format_string or any of the arguments to str.format() contains lazy translation objects. docs.djangoproject.com/en/1.11/topics/i18n/translation/…

标签: python django translation


【解决方案1】:

compilemessages 将字符串视为“{sitename} 是一个好网站”,但当应用程序运行时,该字符串实际上是例如“MySite 是个好网站”,当然没有翻译。你必须先翻译裸字符串,然后然后你可以对其进行模板操作。

【讨论】:

  • 为了清楚起见,这意味着_(u"{sitename} is a good website").format(sitename=website_name)(注意括号的不同位置)。这也适用于ugettext_lazy,另见stackoverflow.com/questions/10999954/…
【解决方案2】:

以下应该有效:

_('Foo %(x)s') % {'x': "bar"}

s 是字符串,d 是整数。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,所以我先翻译了文本,然后添加了动态内容,例如

    title = _(u"is a good website")
    title = " ".join([website_name, title])
    

    必须有更好的方法来做到这一点

    【讨论】:

    • 感谢您的回答,但动态部分(占位符)必须是字符串的一部分,以允许在短语中放置特定语言的位置。在您的解决方案中,它将在字符串的开头进行修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    相关资源
    最近更新 更多