Bugs item #1448060, was opened at 2006-03-12 00:20
Message generated for change (Comment added) made by potorange
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1448060&group_id=5470

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: Python Library
Group: Python 2.4
Status: Open
Resolution: None
Priority: 5
Private: No
Submitted By: Danilo Segan (dsegan)
Assigned to: Nobody/Anonymous (nobody)
Summary: gettext.py breaks on plural-forms header (PATCH)

Initial Comment:
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.


----------------------------------------------------------------------

Comment By: Alexis Deruelle (potorange)
Date: 2007-02-13 13:31

Message:
Logged In: YES 
user_id=1718193
Originator: NO

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


----------------------------------------------------------------------

Comment By: Danilo Segan (dsegan)
Date: 2006-03-22 00:28

Message:
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]


----------------------------------------------------------------------

Comment By: Martin v. Löwis (loewis)
Date: 2006-03-20 08:50

Message:
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?

----------------------------------------------------------------------

Comment By: Danilo Segan (dsegan)
Date: 2006-03-20 05:07

Message:
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.


----------------------------------------------------------------------

Comment By: Martin v. Löwis (loewis)
Date: 2006-03-19 12:51

Message:
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.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1448060&group_id=5470
_______________________________________________
Python-bugs-list mailing list 
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to