Mercurial > p > roundup > code
annotate roundup/msgfmt.py @ 6681:ab2ed11c021e
issue2551205: Add support for specifying valid origins for api: xmlrpc/rest
We now have an allow list to filter the hosts allowed to do api
requests. An element of this allow list must match the http ORIGIN
header exactly or the rest/xmlrpc CORS request will result in an
error.
The tracker host is always allowed to do a request.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Tue, 17 May 2022 17:18:51 -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()) |
