首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >makemessages的Unicode问题--all Django 1.6.2 Python3.3

makemessages的Unicode问题--all Django 1.6.2 Python3.3
EN

Stack Overflow用户
提问于 2014-02-28 22:09:02
回答 1查看 2.3K关注 0票数 3

Python2.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 (ǹ,èE等)的翻译。对于msgstr值,makemessages无法完成。

(如果我们运行更详细的makemessage,则会跳过任何非ASCII字符的模板。)

我已经为类似的问题找到了bug报告,但是它们回到了1.3.x版本,但对于上面的版本却没有。

更新,更多信息:

这里是例外情况发生的地方:

./python3.3/subprocess.py第847行

代码语言:javascript
复制
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创建的框架):

代码语言:javascript
复制
# 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

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

可能提交了一个bug,会更新。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-03 18:58:40

这让我很不爽,因为Py2的一切都很好,但Py3却没有,所以我认为问题就在那里。

问题的部分原因是我使用了Docker,并且在容器中运行makemessages,容器没有将地区设置为任何特定的bash。

我试过的事情:

  • 用UTF-8保存文件(有和不带BOM)
  • 确保在UTF-8文件的头中有.po
  • 创建一个新的空白板岩项目
  • 使用.po重新创建所有Py3文件(最初是用Py2创建的)

在第847行的subprocess.py中抛出了最高级的异常:

代码语言:javascript
复制
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容器中,我在终端中没有设置任何区域设置,因此它们是:

代码语言:javascript
复制
# 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,我就没事了):

代码语言:javascript
复制
# locale -a
C
C.UTF-8
POSIX

将其放在~/.bashrc中:

代码语言:javascript
复制
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使用的是环境区域设置,而不是文件/或头内容类型的编码。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22106777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档