djagno-admin.py makemessages"或xgettext调用中的bug?-> "警告:未终止的字符串

0 投票
1 回答
2683 浏览
提问于 2025-04-15 12:23

django-admin.py makemessages 在处理很长的字符串时,会出现“警告:未结束的字符串”的错误,导致程序崩溃:

string = "some text \
          more text\
          and even more"

这些字符串其实根本不需要翻译,比如 SQL 查询字符串。把字符串拼接起来后问题就解决了,但这样看起来很难看,而且拼接也挺麻烦的……

有没有人遇到过类似的问题?你们找到解决办法了吗?

我使用的工具版本如下:

xgettext-0.17, gettext-0.17, django-1.0.2, python-2.6.2

之前有一个关于这个问题的讨论,但可能是因为这个错误只在某些组件版本组合下出现,所以被关闭了。

编辑:找到了问题的根源 - xgettext 会把警告信息打印到错误输出,而 django 把这些当成致命错误,导致程序退出。

xgettext 的返回状态是 0,表示“成功”。我觉得 django 应该把这个当成成功,而不是因为警告就退出。

有趣的是,如果需要翻译,xgettext 仍然会提取用反斜杠包裹的字符串,但会在错误输出和 .po 文件中给出警告(“未结束的字符串”“国际化消息不应包含 `\r' 转义序列”)。

xgettext 的调用方式如下:

xgettext -d django -L Python --keyword=gettext_noop \
         --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 \
         --keyword=ugettext_noop --keyword=ugettext_lazy \
         --keyword=ungettext_lazy:1,2 
         --from-code UTF-8 -o - source_file.py

这个调用是在 django/core/management/commands/makemessages.py 中进行的。

1 个回答

2

我能想到两种可能性:你可能在行末的反斜杠后面多加了一个空格;或者你的代码中可能出现了错误的换行符(比如,Windows格式的换行符,而你的Python程序却期待Unix格式的换行符,这样就会导致反斜杠失效)。

无论是哪种情况,我建议你利用C语言风格的自动字符串连接:

>>> string = ("some text "
...           "more text "
...           "and even more")
>>> string
'some text more text and even more'

另外,如果你不介意里面有换行符,可以使用多行字符串:

>>> string = """some text
...             more text
...             and even more"""

我觉得这样看起来更好,而且在重构代码时也不容易出错。

这样说清楚了吗?

撰写回答