【问题标题】:Django uggetext as __ instead of _ breaks makemessagesDjango uggetext 作为 __ 而不是 _ 打破 makemessages
【发布时间】:2019-01-12 04:11:17
【问题描述】:

我刚遇到一个奇怪的错误(?),我最初有

from django.utils.translation import ugettext as _

我改了

from django.utils.translation import ugettext as __

但是,令人惊讶的是,在运行 ./manage.py makemessages --all 之后会破坏所有翻译,它们基本上都会在我的 .po 文件中得到评论,就好像它们不再被识别为翻译一样。

回到_ 并运行makemessages 修复它。我不太明白为什么变量的名称很重要,我想知道当我需要 ugettext 和 ugettext_lazy 时应该如何命名,以保持一致性。

Django 1.8,带有 python 2.7.14

【问题讨论】:

  • 我希望下面的答案能解决你的问题...!
  • 确实,我错过了!谢谢。

标签: django django-i18n


【解决方案1】:

这是因为 gettext 实用程序的内部结构,更具体地说是 xgettext 命令的内部结构。

简而言之,为了将字符串标记为可翻译,您必须将它们包装到特定的关键字中(即translate("hello world")translate 这里是关键字)。 xgettext 程序适用于许多编程语言。每种语言都有自己的predefined keywords(按Ctrl + f 并搜索--keyword)。

在 Python 中,这些关键字是(注意末尾的 _):

对于 Python:gettextugettextdgettext:2ngettext:1,2ungettext:1,2dngettext:2,3_

xgettext 命令有几个选项可以改变它的行为。其中之一是--keyword 选项。当您使用--keyword 选项调用xgettext 命令时,如果python 文件中的所有字符串都包含在您提供的预定义关键字之一或--keyword 选项中,则它们将被视为可翻译。例如,如果您运行xgettext --keyword=jimmy_hendrix,那么所有像jimmy_hendrix("hello world") 这样的字符串都将包含在您的.po 文件中。

但是,你永远不会在 Django 中明确地运行这个命令。您使用makemessages 命令。查看source of makemessages command,您可以看到Django 提供了额外的--keywords 用于标记要翻译的字符串。其实这些关键字和 Django 的附加翻译功能是一样的。

在所有这些之后,我认为现在很清楚别名 _____ 将不起作用,因为它不在 Django 的 xgettext 命令调用列表中,也不在 xgettext 命令的预定义关键字中。

你可能会看一个过时的but still valid answer

另外,xgettext on MDN, using PHP 的示例。

【讨论】:

  • 这是否可以通过 django 以某种方式配置,还是我们应该坚持使用我们可以使用的东西?我阅读了另一个答案,但不清楚我是否可以在基本快捷方式/别名之上添加自己的快捷方式/别名,或者这是否被认为是一种不好的做法。
  • 我担心你不能改变这种行为,因为它是写在核心中的,任何试图覆盖它的尝试,IMO 都会被认为是一种黑客行为。也就是说,如果有人对此有其他意见,我很乐意更新这个答案!
猜你喜欢
  • 1970-01-01
  • 2011-11-26
  • 2018-08-26
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多