Mercurial > p > roundup > code
annotate roundup/msgfmt.py @ 7035:edaf7086cb2e
flake8 E228 missing whitespace around modulo operator
plus some indenting fixes to realign lines.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Mon, 10 Oct 2022 14:41:11 -0400 |
| parents | 4d2e1fa03f0f |
| children | 6a1c1cd69582 |
| 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 -*- |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
3 # Written by Martin v. Loewis <loewis@informatik.hu-berlin.de> |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
4 # |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
5 # Changed by Christian 'Tiran' Heimes <tiran@cheimes.de> for the placeless |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
6 # translation service (PTS) of Zope |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
7 # |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
8 # Fixed some bugs and updated to support msgctxt |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
9 # by Hanno Schlichting <hanno@hannosch.eu> |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
10 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
11 """Generate binary message catalog from textual translation description. |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
12 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
13 This program converts a textual Uniforum-style message catalog (.po file) into |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
14 a binary GNU catalog (.mo file). This is essentially the same function as the |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
15 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
|
16 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
17 This file was taken from Python-2.3.2/Tools/i18n and altered in several ways. |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
18 Now you can simply use it from another python module: |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
19 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
20 from msgfmt import Msgfmt |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
21 mo = Msgfmt(po).get() |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
22 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
23 where po is path to a po file as string, an opened po file ready for reading or |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
24 a list of strings (readlines of a po file) and mo is the compiled mo file as |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
25 binary string. |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
26 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
27 Exceptions: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
28 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
29 * IOError if the file couldn't be read |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
30 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
31 * msgfmt.PoSyntaxError if the po file has syntax errors |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
32 """ |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
33 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
34 import array |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
35 from ast import literal_eval |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
36 import codecs |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
37 from email.parser import HeaderParser |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
38 import struct |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
39 import sys |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
40 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
41 PY3 = sys.version_info[0] == 3 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
42 if PY3: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
43 def header_charset(s): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
44 p = HeaderParser() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
45 return p.parsestr(s).get_content_charset() |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
46 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
47 import io |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
48 BytesIO = io.BytesIO |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
49 FILE_TYPE = io.IOBase |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
50 else: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
51 def header_charset(s): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
52 p = HeaderParser() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
53 return p.parsestr(s.encode('utf-8', 'ignore')).get_content_charset() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
54 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
55 from cStringIO import StringIO as BytesIO |
|
6033
4d2e1fa03f0f
flake8 format fixes, ignore 'file' as it is a type under py2
John Rouillard <rouilj@ieee.org>
parents:
5450
diff
changeset
|
56 # file is a type defined only under python 2. |
|
4d2e1fa03f0f
flake8 format fixes, ignore 'file' as it is a type under py2
John Rouillard <rouilj@ieee.org>
parents:
5450
diff
changeset
|
57 # Flake8 when run in py3 flags this. |
|
4d2e1fa03f0f
flake8 format fixes, ignore 'file' as it is a type under py2
John Rouillard <rouilj@ieee.org>
parents:
5450
diff
changeset
|
58 FILE_TYPE = file # noqa: 821 |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
59 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
60 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
61 class PoSyntaxError(Exception): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
62 """ Syntax error in a po file """ |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
63 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
64 def __init__(self, msg): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
65 self.msg = msg |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
66 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
67 def __str__(self): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
68 return 'Po file syntax error: %s' % self.msg |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
69 |
|
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
70 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
71 class Msgfmt: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
72 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
73 def __init__(self, po, name='unknown'): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
74 self.po = po |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
75 self.name = name |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
76 self.messages = {} |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
77 self.openfile = False |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
78 # Start off assuming latin-1, so everything decodes without failure, |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
79 # until we know the exact encoding |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
80 self.encoding = 'latin-1' |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
81 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
82 def readPoData(self): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
83 """ read po data from self.po and return an iterator """ |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
84 output = [] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
85 if isinstance(self.po, str): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
86 output = open(self.po, 'rb') |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
87 elif isinstance(self.po, FILE_TYPE): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
88 self.po.seek(0) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
89 self.openfile = True |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
90 output = self.po |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
91 elif isinstance(self.po, list): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
92 output = self.po |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
93 if not output: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
94 raise ValueError("self.po is invalid! %s" % type(self.po)) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
95 if isinstance(output, FILE_TYPE): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
96 # remove BOM from the start of the parsed input |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
97 first = output.readline() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
98 if len(first) == 0: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
99 return output.readlines() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
100 if first.startswith(codecs.BOM_UTF8): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
101 first = first.lstrip(codecs.BOM_UTF8) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
102 return [first] + output.readlines() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
103 return output |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
104 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
105 def add(self, context, id, string, fuzzy): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
106 "Add a non-empty and non-fuzzy translation to the dictionary." |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
107 if string and not fuzzy: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
108 # The context is put before the id and separated by a EOT char. |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
109 if context: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
110 id = context + u'\x04' + id |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
111 if not id: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
112 # See whether there is an encoding declaration |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
113 charset = header_charset(string) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
114 if charset: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
115 # decode header in proper encoding |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
116 string = string.encode(self.encoding).decode(charset) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
117 if not PY3: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
118 # undo damage done by literal_eval in Python 2.x |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
119 string = string.encode(self.encoding).decode(charset) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
120 self.encoding = charset |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
121 self.messages[id] = string |
|
5237
c643d693d91e
Iniitalize two variables to None.
John Rouillard <rouilj@ieee.org>
parents:
3563
diff
changeset
|
122 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
123 def generate(self): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
124 "Return the generated output." |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
125 # the keys are sorted in the .mo file |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
126 keys = sorted(self.messages.keys()) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
127 offsets = [] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
128 ids = strs = b'' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
129 for id in keys: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
130 msg = self.messages[id].encode(self.encoding) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
131 id = id.encode(self.encoding) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
132 # For each string, we need size and file offset. Each string is |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
133 # NUL terminated; the NUL does not count into the size. |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
134 offsets.append((len(ids), len(id), len(strs), |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
135 len(msg))) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
136 ids += id + b'\0' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
137 strs += msg + b'\0' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
138 output = b'' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
139 # The header is 7 32-bit unsigned integers. We don't use hash tables, |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
140 # so the keys start right after the index tables. |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
141 keystart = 7 * 4 + 16 * len(keys) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
142 # and the values start after the keys |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
143 valuestart = keystart + len(ids) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
144 koffsets = [] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
145 voffsets = [] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
146 # The string table first has the list of keys, then the list of values. |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
147 # Each entry has first the size of the string, then the file offset. |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
148 for o1, l1, o2, l2 in offsets: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
149 koffsets += [l1, o1 + keystart] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
150 voffsets += [l2, o2 + valuestart] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
151 offsets = koffsets + voffsets |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
152 # Even though we don't use a hashtable, we still set its offset to be |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
153 # binary compatible with the gnu gettext format produced by: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
154 # msgfmt file.po --no-hash |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
155 output = struct.pack("Iiiiiii", |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
156 0x950412de, # Magic |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
157 0, # Version |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
158 len(keys), # # of entries |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
159 7 * 4, # start of key index |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
160 7 * 4 + len(keys) * 8, # start of value index |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
161 0, keystart) # size and offset of hash table |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
162 if PY3: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
163 output += array.array("i", offsets).tobytes() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
164 else: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
165 output += array.array("i", offsets).tostring() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
166 output += ids |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
167 output += strs |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
168 return output |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
169 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
170 def get(self): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
171 """ """ |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
172 self.read() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
173 # Compute output |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
174 return self.generate() |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
175 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
176 def read(self, header_only=False): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
177 """ """ |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
178 ID = 1 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
179 STR = 2 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
180 CTXT = 3 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
181 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
182 section = None |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
183 fuzzy = 0 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
184 msgid = msgstr = msgctxt = u'' |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
185 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
186 # Parse the catalog |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
187 lno = 0 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
188 for l in self.readPoData(): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
189 l = l.decode(self.encoding) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
190 lno += 1 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
191 # If we get a comment line after a msgstr or a line starting with |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
192 # msgid or msgctxt, this is a new entry |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
193 if section == STR and (l[0] == '#' or (l[0] == 'm' and |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
194 (l.startswith('msgctxt') or l.startswith('msgid')))): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
195 self.add(msgctxt, msgid, msgstr, fuzzy) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
196 section = None |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
197 fuzzy = 0 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
198 # If we only want the header we stop after the first message |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
199 if header_only: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
200 break |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
201 # Record a fuzzy mark |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
202 if l[:2] == '#,' and 'fuzzy' in l: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
203 fuzzy = 1 |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
204 # Skip comments |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
205 if l[0] == '#': |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
206 continue |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
207 # Now we are in a msgctxt section |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
208 if l.startswith('msgctxt'): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
209 section = CTXT |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
210 l = l[7:] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
211 msgctxt = u'' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
212 # Now we are in a msgid section, output previous section |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
213 elif (l.startswith('msgid') and |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
214 not l.startswith('msgid_plural')): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
215 if section == STR: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
216 self.add(msgid, msgstr, fuzzy) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
217 section = ID |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
218 l = l[5:] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
219 msgid = msgstr = u'' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
220 is_plural = False |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
221 # This is a message with plural forms |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
222 elif l.startswith('msgid_plural'): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
223 if section != ID: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
224 raise PoSyntaxError( |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
225 'msgid_plural not preceeded by ' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
226 'msgid on line %d of po file %s' % |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
227 (lno, repr(self.name))) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
228 l = l[12:] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
229 msgid += u'\0' # separator of singular and plural |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
230 is_plural = True |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
231 # Now we are in a msgstr section |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
232 elif l.startswith('msgstr'): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
233 section = STR |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
234 if l.startswith('msgstr['): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
235 if not is_plural: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
236 raise PoSyntaxError( |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
237 'plural without msgid_plural ' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
238 'on line %d of po file %s' % |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
239 (lno, repr(self.name))) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
240 l = l.split(']', 1)[1] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
241 if msgstr: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
242 # Separator of the various plural forms |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
243 msgstr += u'\0' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
244 else: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
245 if is_plural: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
246 raise PoSyntaxError( |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
247 'indexed msgstr required for ' |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
248 'plural on line %d of po file %s' % |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
249 (lno, repr(self.name))) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
250 l = l[6:] |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
251 # Skip empty lines |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
252 l = l.strip() |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
253 if not l: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
254 continue |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
255 # TODO: Does this always follow Python escape semantics? |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
256 try: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
257 l = literal_eval(l) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
258 except Exception as msg: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
259 raise PoSyntaxError( |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
260 '%s (line %d of po file %s): \n%s' % |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
261 (msg, lno, repr(self.name), l)) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
262 if isinstance(l, bytes): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
263 l = l.decode(self.encoding) |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
264 if section == CTXT: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
265 msgctxt += l |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
266 elif section == ID: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
267 msgid += l |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
268 elif section == STR: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
269 msgstr += l |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
270 else: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
271 raise PoSyntaxError( |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
272 'error on line %d of po file %s' % |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
273 (lno, repr(self.name))) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
274 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
275 # Add last entry |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
276 if section == STR: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
277 self.add(msgctxt, msgid, msgstr, fuzzy) |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
278 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
279 if self.openfile: |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
280 self.po.close() |
|
2784
40643f8b41a0
catalog compilation utility for message translations
Alexander Smishlajev <a1s@users.sourceforge.net>
parents:
diff
changeset
|
281 |
|
5450
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
282 def getAsFile(self): |
|
f2fade4552c5
replaced msgfmt.py with latest version supporting Python 3
Christof Meerwald <cmeerw@cmeerw.org>
parents:
5395
diff
changeset
|
283 return BytesIO(self.get()) |
