annotate babel/messages/mofile.py @ 163:2faa5dc63068

Slightly simplified CLI-frontend class.
author cmlenz
date Thu, 21 Jun 2007 16:12:38 +0000
parents 661cb602781d
children aed3b2b06d19
rev   line source
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
2 #
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2007 Edgewall Software
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
4 # All rights reserved.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
5 #
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
9 #
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
13
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
14 """Writing of files in the ``gettext`` MO (machine object) format.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
15
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
16 :see: `The Format of MO Files
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
17 <http://www.gnu.org/software/gettext/manual/gettext.html#MO-Files>`_
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
18 """
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
19
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
20 import array
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
21 import struct
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
22
163
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
23 __all__ = ['write_mo']
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
24 __docformat__ = 'restructuredtext en'
2faa5dc63068 Slightly simplified CLI-frontend class.
cmlenz
parents: 162
diff changeset
25
162
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
26 def write_mo(fileobj, catalog, use_fuzzy=False):
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
27 """Write a catalog to the specified file-like object using the GNU MO file
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
28 format.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
29
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
30 >>> from babel.messages import Catalog
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
31 >>> from gettext import GNUTranslations
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
32 >>> from StringIO import StringIO
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
33
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
34 >>> catalog = Catalog(locale='en_US')
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
35 >>> catalog.add('foo', 'Voh')
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
36 >>> catalog.add((u'bar', u'baz'), (u'Bahr', u'Batz'))
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
37 >>> catalog.add('fuz', 'Futz', flags=['fuzzy'])
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
38 >>> buf = StringIO()
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
39
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
40 >>> write_mo(buf, catalog)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
41 >>> buf.seek(0)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
42 >>> translations = GNUTranslations(fp=buf)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
43 >>> translations.ugettext('foo')
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
44 u'Voh'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
45 >>> translations.ungettext('bar', 'baz', 1)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
46 u'Bahr'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
47 >>> translations.ungettext('bar', 'baz', 2)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
48 u'Batz'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
49 >>> translations.ugettext('fuz')
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
50 u'fuz'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
51
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
52 :param fileobj: the file-like object to write to
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
53 :param catalog: the `Catalog` instance
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
54 :param use_fuzzy: whether translations marked as "fuzzy" should be included
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
55 in the output
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
56 """
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
57 messages = list(catalog)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
58 if not use_fuzzy:
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
59 messages[1:] = [m for m in messages[1:] if not m.fuzzy]
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
60 messages.sort(lambda x,y: cmp(x.id, y.id))
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
61
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
62 ids = strs = ''
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
63 offsets = []
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
64
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
65 for message in messages:
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
66 # For each string, we need size and file offset. Each string is NUL
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
67 # terminated; the NUL does not count into the size.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
68 if message.pluralizable:
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
69 msgid = '\x00'.join([
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
70 msgid.encode(catalog.charset) for msgid in message.id
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
71 ])
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
72 msgstr = '\x00'.join([
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
73 msgstr.encode(catalog.charset) for msgstr in message.string
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
74 ])
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
75 else:
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
76 msgid = message.id.encode(catalog.charset)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
77 msgstr = message.string.encode(catalog.charset)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
78 offsets.append((len(ids), len(msgid), len(strs), len(msgstr)))
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
79 ids += msgid + '\x00'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
80 strs += msgstr + '\x00'
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
81
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
82 # The header is 7 32-bit unsigned integers. We don't use hash tables, so
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
83 # the keys start right after the index tables.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
84 keystart = 7 * 4 + 16 * len(messages)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
85 valuestart = keystart + len(ids)
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
86
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
87 # The string table first has the list of keys, then the list of values.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
88 # Each entry has first the size of the string, then the file offset.
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
89 koffsets = []
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
90 voffsets = []
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
91 for o1, l1, o2, l2 in offsets:
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
92 koffsets += [l1, o1 + keystart]
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
93 voffsets += [l2, o2 + valuestart]
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
94 offsets = koffsets + voffsets
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
95
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
96 fileobj.write(struct.pack('Iiiiiii',
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
97 0x950412deL, # magic
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
98 0, # version
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
99 len(messages), # number of entries
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
100 7 * 4, # start of key index
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
101 7 * 4 + len(messages) * 8, # start of value index
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
102 0, 0 # size and offset of hash table
661cb602781d Add MO file generation. Closes #21.
cmlenz
parents:
diff changeset
103 ) + array.array("i", offsets).tostring() + ids + strs)
Copyright (C) 2012-2017 Edgewall Software