gettext on Windows

G

Guest

Hi,

I'm trying to use gettext to internationalise my project [1], but I'm
getting the following error message with some translations:

"Traceback (most recent call last):
file PanicButton.py line 36 in ?
file Gettext.pyc line 177 in _init_
file Gettext.pyc line 274 in _parse
struct.error : unpack str size does not match format"

The snippet of code that loads the .mo file is below:

<code>
# Code to find & install l10n file
import gettext, os, locale, glob
loc = locale.getdefaultlocale ()
sLocale = loc [0]

#Use translation file with same name as locale if it exists
if (os.path.exists (os.path.join ('locale', sLocale + '.mo'))):
sLang = os.path.join ('locale', sLocale + '.mo')
else:
#find a .mo file that matches the first part (first three
characters) of the locale
sMoFiles = glob.glob (os.path.join ('locale', sLocale [:3] +
'*.mo'))
if (len (sMoFiles) > 0):
sLang = sMoFiles [0]
else:
#Could not find exact or partial match for locale - use default
translation file (British English)
sLang = os.path.join ('locale', 'en_GB.mo')

lan = gettext.GNUTranslations (open (sLang))
lan.install ()
# End of code to find & install l10n file
</code>

I *think* the problem is a unicode problem - it only seems to appear
when the translated file uses unicode strings.

Is the problem in the code that loads the .mo file - do I need to make
it use unicode? Or do the strings that are to be translated have to be
marked as unicode?

Full sourcecode is available via the SF.net project page [1], if
required.

Russ

[1] http://sourceforge.net/projects/panicbutton
 
F

Fredrik Lundh

lan = gettext.GNUTranslations (open (sLang))

are you sure the data file is a text file? what happens if you change
the above to

lan = gettext.GNUTranslations (open (sLang, "rb"))

?

</F>
 
G

Guest

Fredrik said:
are you sure the data file is a text file? what happens if you change
the above to

lan = gettext.GNUTranslations (open (sLang, "rb"))

The .mo files aren't text files, they're binary, but when I make that
change, I get this error message:

Traceback (most recent call last):
File "panicbutton.py", line 36, in ?
lan = gettext.GNUTranslations (open (sLang, "rb"))
File "C:\Python24\lib\gettext.py", line 177, in __init__
self._parse(fp)
File "C:\Python24\lib\gettext.py", line 280, in _parse
raise IOError(0, 'File is corrupt', filename)
IOError: [Errno 0] File is corrupt: 'locale\\fr_FR.mo'

Russ
 
?

=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=

Traceback (most recent call last):
File "panicbutton.py", line 36, in ?
lan = gettext.GNUTranslations (open (sLang, "rb"))
File "C:\Python24\lib\gettext.py", line 177, in __init__
self._parse(fp)
File "C:\Python24\lib\gettext.py", line 280, in _parse
raise IOError(0, 'File is corrupt', filename)
IOError: [Errno 0] File is corrupt: 'locale\\fr_FR.mo'

If it says so, it likely is right. How did you create the file?

Regards,
Martin
 
G

Guest

Martin said:
Traceback (most recent call last):
File "panicbutton.py", line 36, in ?
lan = gettext.GNUTranslations (open (sLang, "rb"))
File "C:\Python24\lib\gettext.py", line 177, in __init__
self._parse(fp)
File "C:\Python24\lib\gettext.py", line 280, in _parse
raise IOError(0, 'File is corrupt', filename)
IOError: [Errno 0] File is corrupt: 'locale\\fr_FR.mo'

If it says so, it likely is right. How did you create the file?

I only get the "File is corrupt" error when I changed

lan = gettext.GNUTranslations (open (sLang))

to

lan = gettext.GNUTranslations (open (sLang, "rb"))

Without the "rb" in the open () I get a "struct.error : unpack str size
does not match format" error (see original post).

The .mo files were created using poEdit (www.poedit.org), and I get the
same error with various translations, all created by different people.

Russ
 
L

Leo Kislov

Martin said:
Traceback (most recent call last):
File "panicbutton.py", line 36, in ?
lan = gettext.GNUTranslations (open (sLang, "rb"))
File "C:\Python24\lib\gettext.py", line 177, in __init__
self._parse(fp)
File "C:\Python24\lib\gettext.py", line 280, in _parse
raise IOError(0, 'File is corrupt', filename)
IOError: [Errno 0] File is corrupt: 'locale\\fr_FR.mo'

If it says so, it likely is right. How did you create the file?

I only get the "File is corrupt" error when I changed

lan = gettext.GNUTranslations (open (sLang))

This code definately corrupts .mo files since on windows files are
opened in text mode by default.
to

lan = gettext.GNUTranslations (open (sLang, "rb"))

Without the "rb" in the open () I get a "struct.error : unpack str size
does not match format" error (see original post).

struct.error usually means input data doesn't correspond to expected
format.
The .mo files were created using poEdit (www.poedit.org), and I get the
same error with various translations, all created by different people.

Try msgunfmt
http://www.gnu.org/software/gettext/manual/html_node/gettext_128.html#SEC128
to see if it can convert your files back to text.

-- Leo
 
?

=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=

Just tried it, and it was able to convert each of the .mo files back to
text without any problems.

Then you should make a bug report (or, better yet, a patch). Apparently,
the Python gettext implementation is not able to process the MO files
you are passing.

Regards,
Martin
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top