New submission from Steve Strassmann:

The gettext.py parser used by django (lib/python2.7/gettext.py),
GNUTranslations._parse(), around line 313 does not use clean values for k,v on 
each
iteration ("for item in tmsg.splitlines():")

To reproduce the problem (see traceback, below), try parsing a .PO file 
containing two headers like this, with a comment header immediately following a 
plurals header. This example was created by calling msgcat to combine several 
.po files into a single .po file. Msgcat inserted the comment line.

"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"#-#-#-#-#  messages.po (EdX Studio)  #-#-#-#-#\n"

Parsing the first header binds the inner loop variables:
  k= plural-forms v= ['nplurals=2', ' plural=(n != 1)', '']

Parsing the second header leaves k,v untouched, which then causes an improper
attempt to parse (since it's a comment, no further parsing of k,v should occur)
 v = v.split(';')

Bug workaround: I use polib to read and immediately save the file. This 
reorders the metadata to avoid presenting the parser with something that will 
break it.

Recommended bug fix: on each iteration over tmsg.splitlines, reset the values 
of k,v = (None, None)

--------------------
Traceback:
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/core/handlers/base.py"
 in get_response
89.                     response = middleware_method(request)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/middleware/locale.py"
 in process_request
24.         translation.activate(language)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/__init__.py"
 in activate
105.     return _trans.activate(language)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py"
 in activate
201.     _active.value = translation(language)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py"
 in translation
191.     current_translation = _fetch(language, fallback=default_translation)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py"
 in _fetch
180.                 res = _merge(localepath)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py"
 in _merge
156.             t = _translation(path)
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py"
 in _translation
138.                 t = gettext_module.translation('django', path, [loc], 
DjangoTranslation)
File 
"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py"
 in translation
480.                 t = _translations.setdefault(key, class_(fp))
File 
"/Users/sstrassmann/src/mitx_all/python/lib/python2.7/site-packages/django/utils/translation/trans_real.py"
 in __init__
76.         gettext_module.GNUTranslations.__init__(self, *args, **kw)
File 
"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py"
 in __init__
180.             self._parse(fp)
File 
"/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gettext.py"
 in _parse
315.                         v = v.split(';')

Exception Type: AttributeError at /
Exception Value: 'list' object has no attribute 'split'

----------
components: Library (Lib)
messages: 188318
nosy: straz
priority: normal
severity: normal
status: open
title: gettext bug while parsing plural-forms metadata
type: behavior
versions: Python 2.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue17898>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to