makemessages的Unicode问题 - 所有Django 1.6.2 Python 3.3

Jus*_*tin 3 django unicode gettext python-3.x

Python 2.7升级项目- > 3.3.1Django 1.4 - > 1.6.2.

更新代码后,我们的应用程序再次运行(在py3中).
翻译是从.mo文件中提取的.

唯一的问题是我们的旧.po文件无法使用

django-admin.py makemessages -a

它显示了一个可爱的

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

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

我发现了类似问题的错误报告,但它们又回到了1.3.x版本,但没有真正适用于上述版本.


更新,更多信息:

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

def _translate_newlines(self, data, encoding):
    data = data.decode(encoding)
    return data.replace("\r\n", "\n").replace("\r", "\n")
Run Code Online (Sandbox Code Playgroud)

encodingANSI_X3.4-1968.我已经将模板文件保存为UTF-8以及.po文件.

这是.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 <LL@li.org>\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"  
Run Code Online (Sandbox Code Playgroud)

这在Python 2.7和Django 1.5下使用(相同的文件)


更新#2

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

可能提交错误,将更新.

Jus*_*tin 9

这让我失望,因为Py2的一切都很好,但不是Py3,所以我认为这就是问题所在.

问题部分是因为我正在使用Docker,并且makemessages从没有将语言环境设置为任何特定于bash的容器内运行.

我试过的事情:

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

最重要的异常是在这行847上的subprocess.py中抛出的:

def _translate_newlines(self, data, encoding):
    data = data.decode(encoding)
    return data.replace("\r\n", "\n").replace("\r", "\n")
Run Code Online (Sandbox Code Playgroud)

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

解答
在我的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=
Run Code Online (Sandbox Code Playgroud)

这些是我可用的语言环境(缺少我的特定语言环境,en_US.UTF-8但只要它是UTF-8我就可以了):

# locale -a
C
C.UTF-8
POSIX
Run Code Online (Sandbox Code Playgroud)

放在这个~/.bashrc:

export LC_ALL=C.UTF-8
export LANG=C.UTF-8
export LANGUAGE=C.UTF-8  
Run Code Online (Sandbox Code Playgroud)

现在我得到UTF-8内容类型subprocess.py,一切都适用于Py3/Django1.6 =)

长话短说,我听说Django/subprocess.py正在使用环境语言环境,而不是文件/或标题Content-Type的编码.