annotate roundup/msgfmt.py @ 5305:e20f472fde7d

issue2550799: provide basic support for handling html only emails Initial implementation and testing with the dehtml html converter done. The use of beautifulsoup 4 is not tested. My test system breaks when running dehtml.py using beautiful soup. I don't get the failures when running under the test harness, but the text output is significantly different (different line breaks, number of newlines etc.) The tests for dehtml need to be generated for beautiful soup and the expected output changed. Since I have a wonky install of beautiful soup, I don't trust my output as the standard to test against. Also since beautiful soup is optional, the test harness needs to skip the beautifulsoup tests if import bs4 fails. Again something outside of my expertise. I deleted the work I had done to implement that. I could not get it working and wanted to get this feature in in some form.
author John Rouillard <rouilj@ieee.org>
date Fri, 13 Oct 2017 21:46:59 -0400
parents 198b6e810c67
children 64b05e24dbd8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
29 import sys
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
30 import os
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
31 import getopt
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
32 import struct
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
33 import array
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
34
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
35 __version__ = "1.1"
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
36
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
37 MESSAGES = {}
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
38
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 def usage(code, msg=''):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
42 print >> sys.stderr, __doc__
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
43 if msg:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
44 print >> sys.stderr, msg
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
45 sys.exit(code)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
46
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 def add(id, str, fuzzy):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
50 "Add a non-fuzzy translation to the dictionary."
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
51 global MESSAGES
2801
ee9c3b850f9e fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2784
diff changeset
52 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
53 MESSAGES[id] = str
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
54
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 def generate():
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
58 "Return the generated output."
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
59 global MESSAGES
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
60 keys = MESSAGES.keys()
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
61 # the keys are sorted in the .mo file
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
62 keys.sort()
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
63 offsets = []
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
64 ids = strs = ''
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
65 for id in keys:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
66 # 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
67 # 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
68 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
69 ids += id + '\0'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
70 strs += MESSAGES[id] + '\0'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
71 output = ''
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
72 # 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
73 # the keys start right after the index tables.
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
74 # translated string.
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
75 keystart = 7*4+16*len(keys)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
76 # and the values start after the keys
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
77 valuestart = keystart + len(ids)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
78 koffsets = []
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
79 voffsets = []
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
80 # 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
81 # 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
82 for o1, l1, o2, l2 in offsets:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
83 koffsets += [l1, o1+keystart]
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
84 voffsets += [l2, o2+valuestart]
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
85 offsets = koffsets + voffsets
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
86 output = struct.pack("Iiiiiii",
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
87 0x950412deL, # Magic
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
88 0, # Version
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
89 len(keys), # # of entries
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
90 7*4, # start of key index
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
91 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
92 0, 0) # size and offset of hash table
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
93 output += array.array("i", offsets).tostring()
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
94 output += ids
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
95 output += strs
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
96 return output
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
97
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 def make(filename, outfile):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
101 ID = 1
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
102 STR = 2
3217
a6bf25d38518 reset global MESSAGES dictionary for each make
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2801
diff changeset
103 global MESSAGES
a6bf25d38518 reset global MESSAGES dictionary for each make
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2801
diff changeset
104 MESSAGES = {}
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
105
5237
c643d693d91e Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents: 3563
diff changeset
106 msgid = None
c643d693d91e Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents: 3563
diff changeset
107 msgstr = None
c643d693d91e Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents: 3563
diff changeset
108
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
109 # Compute .mo name from .po name and arguments
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
110 if filename.endswith('.po'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
111 infile = filename
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
112 else:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
113 infile = filename + '.po'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
114 if outfile is None:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
115 outfile = os.path.splitext(infile)[0] + '.mo'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
116
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
117 try:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
118 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
119 except IOError as msg:
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
120 print >> sys.stderr, msg
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
121 sys.exit(1)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
122
3563
7000070fe600 ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3217
diff changeset
123 # 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
124 # (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
125 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
126 lines[0] = lines[0][3:]
7000070fe600 ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3217
diff changeset
127
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
128 section = None
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
129 fuzzy = 0
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
130
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
131 # Parse the catalog
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
132 lno = 0
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
133 for l in lines:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
134 lno += 1
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
135 # 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
136 if l[0] == '#' and section == STR:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
137 add(msgid, msgstr, fuzzy)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
138 section = None
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
139 fuzzy = 0
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
140 # Record a fuzzy mark
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
141 if l[:2] == '#,' and (l.find('fuzzy') >= 0):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
142 fuzzy = 1
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
143 # Skip comments
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
144 if l[0] == '#':
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
145 continue
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
146 # 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
147 if l.startswith('msgid_plural'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
148 msgid += '\0'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
149 l = l[12:]
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
150 # 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
151 elif l.startswith('msgid'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
152 if section == STR:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
153 add(msgid, msgstr, fuzzy)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
154 section = ID
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
155 l = l[5:]
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
156 msgid = msgstr = ''
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
157 # Now we are in a msgstr section
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
158 elif l.startswith('msgstr'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
159 section = STR
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
160 l = l[6:]
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
161 # Check for plural forms
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
162 if l.startswith('['):
2801
ee9c3b850f9e fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2784
diff changeset
163 # Separate plural forms with \0
ee9c3b850f9e fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2784
diff changeset
164 if not l.startswith('[0]'):
ee9c3b850f9e fix plural forms:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2784
diff changeset
165 msgstr += '\0'
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
166 # Ignore the index - must come in sequence
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
167 l = l[l.index(']') + 1:]
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
168 # Skip empty lines
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
169 l = l.strip()
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
170 if not l:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
171 continue
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
172 # XXX: Does this always follow Python escape semantics?
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
173 l = eval(l)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
174 if section == ID:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
175 msgid += l
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
176 elif section == STR:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
177 msgstr += l
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
178 else:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
179 print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
180 'before:'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
181 print >> sys.stderr, l
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
182 sys.exit(1)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
183 # Add last entry
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
184 if section == STR:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
185 add(msgid, msgstr, fuzzy)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
186
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
187 # Compute output
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
188 output = generate()
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
189
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
190 try:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
191 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
192 except IOError as msg:
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
193 print >> sys.stderr, msg
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
194
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 def main():
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
198 try:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
199 opts, args = getopt.getopt(sys.argv[1:], 'hVo:',
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
200 ['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
201 except getopt.error as msg:
2784
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
202 usage(1, msg)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
203
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
204 outfile = None
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
205 # parse options
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
206 for opt, arg in opts:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
207 if opt in ('-h', '--help'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
208 usage(0)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
209 elif opt in ('-V', '--version'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
210 print >> sys.stderr, "msgfmt.py", __version__
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
211 sys.exit(0)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
212 elif opt in ('-o', '--output-file'):
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
213 outfile = arg
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
214 # do it
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
215 if not args:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
216 print >> sys.stderr, 'No input file given'
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
217 print >> sys.stderr, "Try `msgfmt --help' for more information."
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
218 return
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
219
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
220 for filename in args:
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
221 make(filename, outfile)
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
222
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 if __name__ == '__main__':
40643f8b41a0 catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff changeset
225 main()
3563
7000070fe600 ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3217
diff changeset
226
7000070fe600 ignore UTF-8 BOM in po file
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3217
diff changeset
227 # vim: set et sts=4 sw=4 :

Roundup Issue Tracker: http://roundup-tracker.org/