Issue 1448060: gettext.py breaks on plural-forms header (PATCH) (original) (raw)
Created on 2006-03-11 23:20 by dsegan, last changed 2022-04-11 14:56 by admin. This issue is now closed.
Messages (7)
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.
Author: Martin v. Löwis (loewis) *
Date: 2006-03-19 11:51
Logged In: YES user_id=21627
Several things seem to be going on here:
gettext.py is clearly wrong; it shouldn't break on that file.
it is trying to process multi-line fields here. So the patch is also wrong, as it just sets k and v to None.
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.
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.
Author: Martin v. Löwis (loewis) *
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?
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]
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
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:15
admin
set
github: 43019
2010-07-15 16:13:59
eric.araujo
set
superseder: gettext breaks on plural-forms header
2010-07-15 16:10:49
BreamoreBoy
set
status: open -> closed
nosy: + BreamoreBoy
messages: +
resolution: duplicate
2010-07-14 13:35:19
BreamoreBoy
set
dependencies: - gettext breaks on plural-forms header
2009-12-02 19:03:19
dmalcolm
set
nosy: + dmalcolm
2009-03-21 02:20:00
ajaksu2
set
dependencies: + gettext breaks on plural-forms header
2009-03-21 01:35:54
ajaksu2
set
keywords: + patch
stage: test needed
type: behavior
versions: + Python 2.6, - Python 2.4
2006-03-11 23:20:02
dsegan
create