2014-02-28 37 views
3

升級項目的Python 2.7 - >3.3.1的Django 1.4 - >1.6.2Unicode的問題與makemessages --all Django的1.6.2的Python 3.3

更新代碼之後,我們的應用程序運行時再次(在PY3)
翻譯正在從的.mo文件提取。

唯一的問題是,我們的老的.po文件無法與

django-admin.py makemessages -a

使用它顯示一個可愛的

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

我們可以在第一次運行makemessages並獲取框架文件。一旦我們將任何非ASCII(ǹ,è等)的翻譯添加到msgstr值中,則makemessages未能完成。
(如果我們運行與任何非ASCII字符的高冗長模板makemessages被跳過。)

我發現了一個類似的問題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 protected]>, 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 protected]>\n" 
"Language-Team: LANGUAGE <[email protected]>\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命令等等)
  • 啓用國際化等
  • 創建一個單一的翻譯(只是設置。PY)
  • 冉`makemessages -l德
  • Py2.7(#python manage.py makemessages -a)按預期工作
  • Py3.3(#python3 manage.py makemessages -a)失敗

可能提交一個錯誤,將更新。

+1

字符集標題包含.po文件中的正確值嗎? –

+0

「Content-Type:text/plain; charset = UTF-8 \ n」是.po標題中的內容。我已經爲subprocess.py(stacktrace的一部分)添加了一些打印語句,它獲得了ANSI_X3.4-1968的編碼 – Justin

+0

使用單個翻譯創建新項目給我帶來了同樣的悲傷。適用於Py 2.7,不適用於3.3 – Justin

回答

9

由於Py2的一切都很好,但不是Py3,所以我認爲這就是問題所在。

這個問題部分是因爲我使用Docker,並且從容器中運行makemessages,該容器沒有將語言環境設置爲特別針對bash的任何內容。

事情我想:

  • 使用UTF-8 (有或沒有BOM)
  • 確保我在.po文件
  • 的頭部有UTF-8創建一個新的空白石板文件項目
  • 使用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會話沒有專門設置語言環境)

回答
在我的泊塢容器我曾在終端沒有設定區域設置,所以他們是:

# 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內容類型,和一切與PY 3/Django1.6 =工作)

長話短說,我被猝不及防的是Django的/ subprocess.py是使用環境區域設置,而不是文件/或標題Content-Type的編碼。

+0

爲什麼不將env變量放入Dockerfile? – spedy