Mercurial > p > roundup > code
annotate roundup/msgfmt.py @ 5380:64c4e43fbb84
Python 3 preparation: numeric literal syntax.
Fixes octal constants to use leading 0o, and removes 'L' suffixes.
Tool-assisted patch.
| author | Joseph Myers <jsm@polyomino.org.uk> |
|---|---|
| date | Tue, 24 Jul 2018 21:43:32 +0000 |
| parents | 64b05e24dbd8 |
| children | 23b8e6067f7c |
| rev | line source |
|---|---|
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
1 #! /usr/bin/env python |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
2 # -*- coding: iso-8859-1 -*- |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
3 # Written by Martin v. Löwis <loewis@informatik.hu-berlin.de> |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
4 # Plural forms support added by alexander smishlajev <alex@tycobka.lv> |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
5 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
6 """Generate binary message catalog from textual translation description. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
7 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
8 This program converts a textual Uniforum-style message catalog (.po file) into |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
9 a binary GNU catalog (.mo file). This is essentially the same function as the |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
10 GNU msgfmt program, however, it is a simpler implementation. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
11 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
12 Usage: msgfmt.py [OPTIONS] filename.po |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
13 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
14 Options: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
15 -o file |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
16 --output-file=file |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
17 Specify the output file to write to. If omitted, output will go to a |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
18 file named filename.mo (based off the input file name). |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
19 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
20 -h |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
21 --help |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
22 Print this message and exit. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
23 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
24 -V |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
25 --version |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
26 Display version information and exit. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
27 """ |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
28 |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
29 from __future__ import print_function |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
30 import sys |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
31 import os |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
32 import getopt |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
33 import struct |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
34 import array |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
35 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
36 __version__ = "1.1" |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
37 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
38 MESSAGES = {} |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
39 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
40 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
41 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
42 def usage(code, msg=''): |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
43 print(__doc__, file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
44 if msg: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
45 print(msg, file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
46 sys.exit(code) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
47 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
48 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
49 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
50 def add(id, str, fuzzy): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
51 "Add a non-fuzzy translation to the dictionary." |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
52 global MESSAGES |
|
2801
ee9c3b850f9e
fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2784
diff
changeset
|
53 if not fuzzy and str and not str.startswith('\0'): |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
54 MESSAGES[id] = str |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
55 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
56 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
57 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
58 def generate(): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
59 "Return the generated output." |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
60 global MESSAGES |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
61 keys = MESSAGES.keys() |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
62 # the keys are sorted in the .mo file |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
63 keys.sort() |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
64 offsets = [] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
65 ids = strs = '' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
66 for id in keys: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
67 # For each string, we need size and file offset. Each string is NUL |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
68 # terminated; the NUL does not count into the size. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
69 offsets.append((len(ids), len(id), len(strs), len(MESSAGES[id]))) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
70 ids += id + '\0' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
71 strs += MESSAGES[id] + '\0' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
72 output = '' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
73 # The header is 7 32-bit unsigned integers. We don't use hash tables, so |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
74 # the keys start right after the index tables. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
75 # translated string. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
76 keystart = 7*4+16*len(keys) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
77 # and the values start after the keys |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
78 valuestart = keystart + len(ids) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
79 koffsets = [] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
80 voffsets = [] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
81 # The string table first has the list of keys, then the list of values. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
82 # Each entry has first the size of the string, then the file offset. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
83 for o1, l1, o2, l2 in offsets: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
84 koffsets += [l1, o1+keystart] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
85 voffsets += [l2, o2+valuestart] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
86 offsets = koffsets + voffsets |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
87 output = struct.pack("Iiiiiii", |
|
5380
64c4e43fbb84
Python 3 preparation: numeric literal syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5376
diff
changeset
|
88 0x950412de, # Magic |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
89 0, # Version |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
90 len(keys), # # of entries |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
91 7*4, # start of key index |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
92 7*4+len(keys)*8, # start of value index |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
93 0, 0) # size and offset of hash table |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
94 output += array.array("i", offsets).tostring() |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
95 output += ids |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
96 output += strs |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
97 return output |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
98 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
99 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
100 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
101 def make(filename, outfile): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
102 ID = 1 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
103 STR = 2 |
|
3217
a6bf25d38518
reset global MESSAGES dictionary for each make
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2801
diff
changeset
|
104 global MESSAGES |
|
a6bf25d38518
reset global MESSAGES dictionary for each make
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2801
diff
changeset
|
105 MESSAGES = {} |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
106 |
|
5237
c643d693d91e
Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents:
3563
diff
changeset
|
107 msgid = None |
|
c643d693d91e
Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents:
3563
diff
changeset
|
108 msgstr = None |
|
c643d693d91e
Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents:
3563
diff
changeset
|
109 |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
110 # Compute .mo name from .po name and arguments |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
111 if filename.endswith('.po'): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
112 infile = filename |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
113 else: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
114 infile = filename + '.po' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
115 if outfile is None: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
116 outfile = os.path.splitext(infile)[0] + '.mo' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
117 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
118 try: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
119 lines = open(infile).readlines() |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5237
diff
changeset
|
120 except IOError as msg: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
121 print(msg, file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
122 sys.exit(1) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
123 |
|
3563
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
124 # remove UTF-8 Byte Order Mark, if any. |
|
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
125 # (UCS2 BOMs are not handled because messages in UCS2 cannot be handled) |
|
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
126 if lines[0].startswith('\xEF\xBB\xBF'): |
|
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
127 lines[0] = lines[0][3:] |
|
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
128 |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
129 section = None |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
130 fuzzy = 0 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
131 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
132 # Parse the catalog |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
133 lno = 0 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
134 for l in lines: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
135 lno += 1 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
136 # If we get a comment line after a msgstr, this is a new entry |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
137 if l[0] == '#' and section == STR: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
138 add(msgid, msgstr, fuzzy) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
139 section = None |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
140 fuzzy = 0 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
141 # Record a fuzzy mark |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
142 if l[:2] == '#,' and (l.find('fuzzy') >= 0): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
143 fuzzy = 1 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
144 # Skip comments |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
145 if l[0] == '#': |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
146 continue |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
147 # Start of msgid_plural section, separate from singular form with \0 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
148 if l.startswith('msgid_plural'): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
149 msgid += '\0' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
150 l = l[12:] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
151 # Now we are in a msgid section, output previous section |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
152 elif l.startswith('msgid'): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
153 if section == STR: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
154 add(msgid, msgstr, fuzzy) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
155 section = ID |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
156 l = l[5:] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
157 msgid = msgstr = '' |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
158 # Now we are in a msgstr section |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
159 elif l.startswith('msgstr'): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
160 section = STR |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
161 l = l[6:] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
162 # Check for plural forms |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
163 if l.startswith('['): |
|
2801
ee9c3b850f9e
fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2784
diff
changeset
|
164 # Separate plural forms with \0 |
|
ee9c3b850f9e
fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2784
diff
changeset
|
165 if not l.startswith('[0]'): |
|
ee9c3b850f9e
fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
2784
diff
changeset
|
166 msgstr += '\0' |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
167 # Ignore the index - must come in sequence |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
168 l = l[l.index(']') + 1:] |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
169 # Skip empty lines |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
170 l = l.strip() |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
171 if not l: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
172 continue |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
173 # XXX: Does this always follow Python escape semantics? |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
174 l = eval(l) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
175 if section == ID: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
176 msgid += l |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
177 elif section == STR: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
178 msgstr += l |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
179 else: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
180 print('Syntax error on %s:%d' % (infile, lno), |
|
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
181 'before:', file=sys.stderr) |
|
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
182 print(l, file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
183 sys.exit(1) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
184 # Add last entry |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
185 if section == STR: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
186 add(msgid, msgstr, fuzzy) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
187 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
188 # Compute output |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
189 output = generate() |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
190 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
191 try: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
192 open(outfile,"wb").write(output) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5237
diff
changeset
|
193 except IOError as msg: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
194 print(msg, file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
195 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
196 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
197 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
198 def main(): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
199 try: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
200 opts, args = getopt.getopt(sys.argv[1:], 'hVo:', |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
201 ['help', 'version', 'output-file=']) |
|
5248
198b6e810c67
Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents:
5237
diff
changeset
|
202 except getopt.error as msg: |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
203 usage(1, msg) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
204 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
205 outfile = None |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
206 # parse options |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
207 for opt, arg in opts: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
208 if opt in ('-h', '--help'): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
209 usage(0) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
210 elif opt in ('-V', '--version'): |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
211 print("msgfmt.py", __version__, file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
212 sys.exit(0) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
213 elif opt in ('-o', '--output-file'): |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
214 outfile = arg |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
215 # do it |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
216 if not args: |
|
5376
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
217 print('No input file given', file=sys.stderr) |
|
64b05e24dbd8
Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5248
diff
changeset
|
218 print("Try `msgfmt --help' for more information.", file=sys.stderr) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
219 return |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
220 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
221 for filename in args: |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
222 make(filename, outfile) |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
223 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
224 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
225 if __name__ == '__main__': |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
226 main() |
|
3563
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
227 |
|
7000070fe600
ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
3217
diff
changeset
|
228 # vim: set et sts=4 sw=4 : |
