makemessages 的 Unicode 问题 --all Django 1.6.2 Python 3.3

2024-04-18

升级项目Python 2.7 -> 3.3.1 and 姜戈1.4 -> 1.6.2.

更新代码后我们的应用程序再次运行(in py3).
翻译正在从.mo files.

唯一的问题是我们的旧.po文件不能与

django-admin.py makemessages -a

它展现出一种可爱的

UnicodeDecodeError: 'ascii' codec can't decode byte...

我们可以跑makemessages第一次并获取骨架文件。一旦我们将任何非 ASCII 的翻译(ǹ、è 等)添加到msgstr价值观,makemessages无法完成。
(如果我们使用更高详细程度的模板运行 makemessages,则任何非 ASCII 字符都会被跳过。)

我发现了类似问题的错误报告,但它们又回到了 1.3.x 版本,但上面的版本没有任何内容。


更新,更多信息:

这是发生异常的地方:
../python.3/subprocess.py 第 847 行

def _translate_newlines(self, data, encoding):
    data = data.decode(encoding)
    return data.replace("\r\n", "\n").replace("\r", "\n")

The encoding值为ANSI_X3.4-1968。我已将模板文件与 .po 文件一起保存为 UTF-8。

这是 .po 标头(只是从 makemessages 自动创建的骨架):

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-02-28 22:42+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected] /cdn-cgi/l/email-protection>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"  

这之前在 Python 2.7 和 Django 1.5 下有效(相同的文件)


更新#2

  • 项目清单
  • 创建了一个新的裸项目(django-admin.py startproject 等等)
  • 启用 i18n 等
  • 创建了一个翻译(仅在settings.py中)
  • 运行 `makemessages -l de
  • Py2.7 (#python manage.py makemessages -a) 按预期工作
  • Py3.3 (#python3 manage.py makemessages -a) 失败

可能会提交错误,将更新。


这让我很困惑,因为 Py2 一切都很好,但 Py3 却不行,所以我认为这就是问题所在。

问题的部分原因是我正在使用 Docker,并且正在运行makemessages来自容器内,该容器没有将区域设置设置为任何特别针对 bash 的内容。

我尝试过的事情:

  • 使用 UTF-8 保存文件(有和没有 BOM)
  • 确保我有UTF-8在标题中.po files
  • 创建一个新的空白项目
  • 重新创建所有.po使用 Py3 的文件(因为它们最初是用 Py2 创建的)

subprocess.py 中的第 847 行抛出了最重要的异常:

def _translate_newlines(self, data, encoding):
    data = data.decode(encoding)
    return data.replace("\r\n", "\n").replace("\r", "\n")

传入的编码是ANSI_X3.4-1968,这很奇怪,因为我将文件保存为 UTF-8 等(它被设置为 ANSI...由于我的 bash 会话没有专门设置区域设置).

Answer
在我的 Docker 容器中,我没有在终端中设置区域设置,因此它们是:

# locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

这些是我可用的区域设置(缺少我的特定区域设置,en_US.UTF-8,但只要是 UTF-8 就可以了):

# locale -a
C
C.UTF-8
POSIX

把这个放在~/.bashrc:

export LC_ALL=C.UTF-8
export LANG=C.UTF-8
export LANGUAGE=C.UTF-8  

现在我明白了UTF-8作为内容类型subprocess.py,并且一切都适用于 Py3/Django1.6 =)

长话短说,让我措手不及的是 Django/subprocess.py 使用的是环境区域设置,而不是文件/或标头 Content-Type 的编码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

makemessages 的 Unicode 问题 --all Django 1.6.2 Python 3.3 的相关文章

随机推荐