homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: gettext.py breaks on plural-forms header (PATCH)
Type: behavior Stage: test needed
Components: Library (Lib) Versions: Python 2.6
process
Status: closed Resolution: duplicate
Dependencies: Superseder: gettext breaks on plural-forms header
View: 1475523
Assigned To: Nosy List: BreamoreBoy, dmalcolm, dsegan, loewis, potorange
Priority: normal Keywords: patch

Created on 2006年03月11日 23:20 by dsegan, last changed 2022年04月11日 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
gettext.py-fix dsegan, 2006年03月11日 23:20 Fix corner-case header fields parsing in gettext.py
Messages (7)
msg27754 - (view) Author: Danilo Segan (dsegan) Date: 2006年03月11日 23:20
See http://bugzilla.gnome.org/show_bug.cgi?id=334256
The problem is a PO file like the following:
test.po:
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"#-#-#-#-# plo.po (PACKAGE VERSION) #-#-#-#-#\n"
(these kinds of entries are sometimes inserted by
msgmerge, so they're somewhat common)
Any Python program trying to access this breaks:
$ python test.py
Traceback (most recent call last):
 File "test.py", line 7, in ?
 gt = gettext.GNUTranslations(file)
 File "/usr/lib/python2.4/gettext.py", line 177, in
__init__
 self._parse(fp)
 File "/usr/lib/python2.4/gettext.py", line 300, in _parse
 v = v.split(';')
AttributeError: 'list' object has no attribute 'split'
test.py is simple:
#!/usr/bin/env python
import gettext
file = open("test.mo", "rb")
if file:
 gt = gettext.GNUTranslations(file)
The problem is the corner-case: plural-forms precedes
this kind of comment, so "v" is split (v=v.split(";")).
In the next instance, lastk is "plural-forms", yet the
entry doesn't contain ":", so it tries to set plural
forms to v.split(";") again, which fails since v is
already a list.
The attached simple patch fixes this.
msg27755 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2006年03月19日 11:51
Logged In: YES 
user_id=21627
Several things seem to be going on here:
1. gettext.py is clearly wrong; it shouldn't break on that file.
2. it is trying to process multi-line fields here. So the
patch is also wrong, as it just sets k and v to None.
3. I believe that the PO file presented is also wrong. I
believe the intention of the header is that it should have
the RFC822 style syntax, which doesn't allow for # comment
lines. The tool should use a syntax like
X-Filename: plo.po; package=PACKAGE; version=VERSION;
To summarize, I think the attempt to process multi-line
fields in the header is misguided, and gettext.py should
just fetch the first line of content-type and plural-forms.
msg27756 - (view) Author: Danilo Segan (dsegan) Date: 2006年03月20日 04:07
Logged In: YES 
user_id=219596
Agreed on all points, except the "summary": multi-line
plural forms are actually supported and widely used.
Anyway, gettext.py should fail gracefully in case of any
problem in the header, instead of running into exception.
msg27757 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2006年03月20日 07:50
Logged In: YES 
user_id=21627
dsegan: Can you give a real-world (i.e. non-documentation)
example of a PO file with a multi-line plural formula?
msg27758 - (view) Author: Danilo Segan (dsegan) Date: 2006年03月21日 23:28
Logged In: YES 
user_id=219596
No. And based on what Bruno said, it's obviously not
supported (and since it's a GNU thingy, Bruno would probably
know best ;).
[btw, we need no plural forms in documentation at all, at
least not in static content translation; Yelp's
gnome-doc-utils stylesheets provide plural forms for where
they are appropriate]
msg27759 - (view) Author: Alexis Deruelle (potorange) Date: 2007年02月13日 12:31
gettext chokes on empty Plural-Forms ?
#> audit2allow
Traceback (most recent call last):
 File "/usr/bin/audit2allow", line 34, in ?
 gettext.install('policycoreutils')
 File "/usr/lib/python2.4/gettext.py", line 482, in install
 t = translation(domain, localedir, fallback=True, codeset=codeset)
 File "/usr/lib/python2.4/gettexTraceback (most recent call last):
 File "/usr/bin/audit2allow", line 34, in ?
 gettext.install('policycoreutils')
 File "/usr/lib/python2.4/gettext.py", line 482, in install
 t = translation(domain, localedir, fallback=True, codeset=codeset)
 File "/usr/lib/python2.4/gettext.py", line 467, in translation
 t = _translations.setdefault(key, class_(open(mofile, 'rb')))
 File "/usr/lib/python2.4/gettext.py", line 177, in __init__
 self._parse(fp)
 File "/usr/lib/python2.4/gettext.py", line 302, in _parse
 print v[1]
IndexError: list index out of range
t.py", line 467, in translation
 t = _translations.setdefault(key, class_(open(mofile, 'rb')))
 File "/usr/lib/python2.4/gettext.py", line 177, in __init__
 self._parse(fp)
 File "/usr/lib/python2.4/gettext.py", line 302, in _parse
 print v[1]
IndexError: list index out of range
#> msgunfmt /usr/share/locale/fr/LC_MESSAGES/policycoreutils.mo | grep -i plural
"Plural-Forms: \n"
Bellow is a patch that fixes this for me.
--- /usr/lib/python2.4/gettext.py.orig 2007年02月13日 13:25:54.000000000 +0100
+++ /usr/lib/python2.4/gettext.py 2007年02月13日 12:36:29.000000000 +0100
@@ -298,8 +298,9 @@
 self._charset = v.split('charset=')[1]
 elif k == 'plural-forms':
 v = v.split(';')
- plural = v[1].split('plural=')[1]
- self.plural = c2py(plural)
+ if len(v) > 1:
+ plural = v[1].split('plural=')[1]
+ self.plural = c2py(plural)
 # Note: we unconditionally convert both msgids and msgstrs to
 # Unicode using the character encoding specified in the charset
 # parameter of the Content-Type header. The gettext documentation
msg110376 - (view) Author: Mark Lawrence (BreamoreBoy) * Date: 2010年07月15日 16:10
I'm closing this as a duplicate of 1475523 as the latter has a unit test patch file attached, I'll also merge the nosy lists.
History
Date User Action Args
2022年04月11日 14:56:15adminsetgithub: 43019
2010年07月15日 16:13:59eric.araujosetsuperseder: gettext breaks on plural-forms header
2010年07月15日 16:10:49BreamoreBoysetstatus: open -> closed

nosy: + BreamoreBoy
messages: + msg110376

resolution: duplicate
2010年07月14日 13:35:19BreamoreBoysetdependencies: - gettext breaks on plural-forms header
2009年12月02日 19:03:19dmalcolmsetnosy: + dmalcolm
2009年03月21日 02:20:00ajaksu2setdependencies: + gettext breaks on plural-forms header
2009年03月21日 01:35:54ajaksu2setkeywords: + patch
stage: test needed
type: behavior
versions: + Python 2.6, - Python 2.4
2006年03月11日 23:20:02dsegancreate

AltStyle によって変換されたページ (->オリジナル) /