从Python2.7 -> 3.3.1和Django 1.4 -> 1.6.2升级一个项目。
更新代码后,我们的应用程序将再次运行(在py3中)。
正在从.mo文件中提取翻译。
唯一的问题是我们的旧.po文件不能与
django-admin.py makemessages -a
它展示了一个可爱的
UnicodeDecodeError: 'ascii' codec can't decode byte...
我们可以第一次运行makemessages并获取框架文件。一旦我们添加任何非ASCII (ǹ,èE等)的翻译。对于msgstr值,makemessages无法完成。
(如果我们运行更详细的makemessage,则会跳过任何非ASCII字符的模板。)
我已经为类似的问题找到了bug报告,但是它们回到了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")encoding值为ANSI_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" 这在Python2.7和Django 1.5下(相同的文件)是有效的。
更新#2
可能提交了一个bug,会更新。
发布于 2014-03-03 18:58:40
这让我很不爽,因为Py2的一切都很好,但Py3却没有,所以我认为问题就在那里。
问题的部分原因是我使用了Docker,并且在容器中运行makemessages,容器没有将地区设置为任何特定的bash。
我试过的事情:
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")正在传递的编码是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=这些是我可用的地区(缺少我的特定区域,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使用的是环境区域设置,而不是文件/或头内容类型的编码。
https://stackoverflow.com/questions/22106777
复制相似问题