Decode from UTF-8 explicitly when reading a text file in makemessages.
This shows itself with Python 3 under Windows where UTF-8 usually isn't the default file I/O encoding and caused one failure and three errors in our test suite under that platform setup.
This commit is contained in:
parent
a098bee1b9
commit
b5f52647fe
|
@ -1,5 +1,6 @@
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import glob
|
import glob
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
@ -10,6 +11,7 @@ import django
|
||||||
from django.core.management.base import CommandError, NoArgsCommand
|
from django.core.management.base import CommandError, NoArgsCommand
|
||||||
from django.core.management.utils import (handle_extensions, find_command,
|
from django.core.management.utils import (handle_extensions, find_command,
|
||||||
popen_wrapper)
|
popen_wrapper)
|
||||||
|
from django.utils.encoding import force_str
|
||||||
from django.utils.functional import total_ordering
|
from django.utils.functional import total_ordering
|
||||||
from django.utils.text import get_text_list
|
from django.utils.text import get_text_list
|
||||||
from django.utils.jslex import prepare_js_for_gettext
|
from django.utils.jslex import prepare_js_for_gettext
|
||||||
|
@ -402,16 +404,17 @@ class Command(NoArgsCommand):
|
||||||
for domain in domains:
|
for domain in domains:
|
||||||
django_po = os.path.join(django_dir, 'conf', 'locale', locale, 'LC_MESSAGES', '%s.po' % domain)
|
django_po = os.path.join(django_dir, 'conf', 'locale', locale, 'LC_MESSAGES', '%s.po' % domain)
|
||||||
if os.path.exists(django_po):
|
if os.path.exists(django_po):
|
||||||
with open(django_po, 'rU') as fp:
|
with io.open(django_po, 'rU', encoding='utf-8') as fp:
|
||||||
m = plural_forms_re.search(fp.read())
|
m = plural_forms_re.search(fp.read())
|
||||||
if m:
|
if m:
|
||||||
|
plural_form_line = force_str(m.group('value'))
|
||||||
if self.verbosity > 1:
|
if self.verbosity > 1:
|
||||||
self.stdout.write("copying plural forms: %s\n" % m.group('value'))
|
self.stdout.write("copying plural forms: %s\n" % plural_form_line)
|
||||||
lines = []
|
lines = []
|
||||||
found = False
|
found = False
|
||||||
for line in msgs.split('\n'):
|
for line in msgs.split('\n'):
|
||||||
if not found and (not line or plural_forms_re.search(line)):
|
if not found and (not line or plural_forms_re.search(line)):
|
||||||
line = '%s\n' % m.group('value')
|
line = '%s\n' % plural_form_line
|
||||||
found = True
|
found = True
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
msgs = '\n'.join(lines)
|
msgs = '\n'.join(lines)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# -*- encoding: utf-8 -*-
|
# -*- encoding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import io
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
@ -65,8 +66,8 @@ class BasicExtractorTests(ExtractorTests):
|
||||||
os.chdir(self.test_dir)
|
os.chdir(self.test_dir)
|
||||||
management.call_command('makemessages', locale=LOCALE, verbosity=0)
|
management.call_command('makemessages', locale=LOCALE, verbosity=0)
|
||||||
self.assertTrue(os.path.exists(self.PO_FILE))
|
self.assertTrue(os.path.exists(self.PO_FILE))
|
||||||
with open(self.PO_FILE, 'r') as fp:
|
with io.open(self.PO_FILE, 'r', encoding='utf-8') as fp:
|
||||||
po_contents = force_text(fp.read())
|
po_contents = fp.read()
|
||||||
self.assertTrue('#. Translators: This comment should be extracted' in po_contents)
|
self.assertTrue('#. Translators: This comment should be extracted' in po_contents)
|
||||||
self.assertTrue('This comment should not be extracted' not in po_contents)
|
self.assertTrue('This comment should not be extracted' not in po_contents)
|
||||||
# Comments in templates
|
# Comments in templates
|
||||||
|
@ -363,8 +364,8 @@ class CopyPluralFormsExtractorTests(ExtractorTests):
|
||||||
os.chdir(self.test_dir)
|
os.chdir(self.test_dir)
|
||||||
management.call_command('makemessages', locale='es', extensions=['djtpl'], verbosity=0)
|
management.call_command('makemessages', locale='es', extensions=['djtpl'], verbosity=0)
|
||||||
self.assertTrue(os.path.exists(self.PO_FILE_ES))
|
self.assertTrue(os.path.exists(self.PO_FILE_ES))
|
||||||
with open(self.PO_FILE_ES, 'r') as fp:
|
with io.open(self.PO_FILE_ES, 'r', encoding='utf-8') as fp:
|
||||||
po_contents = force_text(fp.read())
|
po_contents = fp.read()
|
||||||
found = re.findall(r'^(?P<value>"Plural-Forms.+?\\n")\s*$', po_contents, re.MULTILINE | re.DOTALL)
|
found = re.findall(r'^(?P<value>"Plural-Forms.+?\\n")\s*$', po_contents, re.MULTILINE | re.DOTALL)
|
||||||
self.assertEqual(1, len(found))
|
self.assertEqual(1, len(found))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue