Mercurial > babel > old > mirror
annotate babel/messages/catalog.py @ 69:1d8e81bfedf9
Enhance catalog to also manage the MIME headers.
author | cmlenz |
---|---|
date | Fri, 08 Jun 2007 15:32:06 +0000 |
parents | d1a7425739d3 |
children | 620fdd25657a |
rev | line source |
---|---|
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
1 # -*- coding: utf-8 -*- |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
2 # |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
3 # Copyright (C) 2007 Edgewall Software |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
4 # All rights reserved. |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
5 # |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
6 # This software is licensed as described in the file COPYING, which |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
7 # you should have received as part of this distribution. The terms |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
8 # are also available at http://babel.edgewall.org/wiki/License. |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
9 # |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
10 # This software consists of voluntary contributions made by many |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
11 # individuals. For the exact contribution history, see the revision |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
12 # history and logs, available at http://babel.edgewall.org/log/. |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
13 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
14 """Data structures for message catalogs.""" |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
15 |
69 | 16 from datetime import datetime |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
17 import re |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
18 try: |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
19 set |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
20 except NameError: |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
21 from sets import Set as set |
69 | 22 import time |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
23 |
69 | 24 from babel import __version__ as VERSION |
66 | 25 from babel.core import Locale |
69 | 26 from babel.messages.plurals import PLURALS |
27 from babel.util import odict, UTC | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
28 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
29 __all__ = ['Message', 'Catalog'] |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
30 __docformat__ = 'restructuredtext en' |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
31 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
32 PYTHON_FORMAT = re.compile(r'\%(\([\w]+\))?[diouxXeEfFgGcrs]').search |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
33 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
34 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
35 class Message(object): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
36 """Representation of a single message in a catalog.""" |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
37 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
38 def __init__(self, id, string=None, locations=(), flags=()): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
39 """Create the message object. |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
40 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
41 :param id: the message ID, or a ``(singular, plural)`` tuple for |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
42 pluralizable messages |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
43 :param string: the translated message string, or a |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
44 ``(singular, plural)`` tuple for pluralizable messages |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
45 :param locations: a sequence of ``(filenname, lineno)`` tuples |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
46 :param flags: a set or sequence of flags |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
47 """ |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
48 self.id = id |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
49 self.string = string |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
50 self.locations = locations |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
51 self.flags = set(flags) |
69 | 52 if id and self.python_format: |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
53 self.flags.add('python-format') |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
54 else: |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
55 self.flags.discard('python-format') |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
56 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
57 def __repr__(self): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
58 return '<%s %r>' % (type(self).__name__, self.id) |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
59 |
69 | 60 def fuzzy(self): |
61 return 'fuzzy' in self.flags | |
62 fuzzy = property(fuzzy, doc="""\ | |
63 Whether the translation is fuzzy. | |
64 | |
65 >>> Message('foo').fuzzy | |
66 False | |
67 >>> Message('foo', 'foo', flags=['fuzzy']).fuzzy | |
68 True | |
69 | |
70 :type: `bool` | |
71 """) | |
72 | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
73 def pluralizable(self): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
74 return isinstance(self.id, (list, tuple)) |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
75 pluralizable = property(pluralizable, doc="""\ |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
76 Whether the message is plurizable. |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
77 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
78 >>> Message('foo').pluralizable |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
79 False |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
80 >>> Message(('foo', 'bar')).pluralizable |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
81 True |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
82 |
63
a60ecd4a4954
Move `Translations` and `LazyProxy` to new `babel.support` module, which should contain any convenience code that is useful for applications using Babel/I18n, but not used by Babel itself.
cmlenz
parents:
58
diff
changeset
|
83 :type: `bool` |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
84 """) |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
85 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
86 def python_format(self): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
87 ids = self.id |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
88 if not isinstance(ids, (list, tuple)): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
89 ids = [ids] |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
90 return bool(filter(None, [PYTHON_FORMAT(id) for id in ids])) |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
91 python_format = property(python_format, doc="""\ |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
92 Whether the message contains Python-style parameters. |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
93 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
94 >>> Message('foo %(name)s bar').python_format |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
95 True |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
96 >>> Message(('foo %(name)s', 'foo %(name)s')).python_format |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
97 True |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
98 |
63
a60ecd4a4954
Move `Translations` and `LazyProxy` to new `babel.support` module, which should contain any convenience code that is useful for applications using Babel/I18n, but not used by Babel itself.
cmlenz
parents:
58
diff
changeset
|
99 :type: `bool` |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
100 """) |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
101 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
102 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
103 class Catalog(object): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
104 """Representation a message catalog.""" |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
105 |
69 | 106 def __init__(self, locale=None, domain=None, project=None, version=None, |
107 creation_date=None, revision_date=None, last_translator=None): | |
66 | 108 """Initialize the catalog object. |
109 | |
110 :param domain: the message domain | |
111 :param locale: the locale identifier or `Locale` object, or `None` | |
112 if the catalog is not bound to a locale (which basically | |
113 means it's a template) | |
114 """ | |
115 self.domain = domain #: the message domain | |
116 if locale: | |
117 locale = Locale.parse(locale) | |
118 self.locale = locale #: the locale or `None` | |
69 | 119 self._messages = odict() |
120 | |
121 self.project = project or 'PROJECT' #: the project name | |
122 self.version = version or 'VERSION' #: the project version | |
123 | |
124 if creation_date is None: | |
125 creation_date = time.localtime() | |
126 elif isinstance(creation_date, datetime): | |
127 if creation_date.tzinfo is None: | |
128 creation_date = creation_date.replace(tzinfo=UTC) | |
129 creation_date = creation_date.timetuple() | |
130 self.creation_date = creation_date #: creation date of the template | |
131 if revision_date is None: | |
132 revision_date = time.localtime() | |
133 elif isinstance(revision_date, datetime): | |
134 if revision_date.tzinfo is None: | |
135 revision_date = revision_date.replace(tzinfo=UTC) | |
136 revision_date = revision_date.timetuple() | |
137 self.revision_date = revision_date #: last revision date of the catalog | |
138 self.last_translator = last_translator #: last translator name + email | |
139 | |
140 def headers(self): | |
141 headers = [] | |
142 headers.append(('Project-Id-Version', | |
143 '%s %s' % (self.project, self.version))) | |
144 headers.append(('POT-Creation-Date', | |
145 time.strftime('%Y-%m-%d %H:%M%z', self.creation_date))) | |
146 if self.locale is None: | |
147 headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE')) | |
148 headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>')) | |
149 headers.append(('Language-Team', 'LANGUAGE <LL@li.org>')) | |
150 else: | |
151 headers.append(('PO-Revision-Date', | |
152 time.strftime('%Y-%m-%d %H:%M%z', self.revision_date))) | |
153 headers.append(('Last-Translator', self.last_translator)) | |
154 headers.append(('Language-Team', '%s <LL@li.org>' % self.locale)) | |
155 headers.append(('Plural-Forms', self.plural_forms)) | |
156 headers.append(('MIME-Version', '1.0')) | |
157 headers.append(('Content-Type', 'text/plain; charset=utf-8')) | |
158 headers.append(('Content-Transfer-Encoding', '8bit')) | |
159 headers.append(('Generated-By', 'Babel %s' % VERSION)) | |
160 return headers | |
161 headers = property(headers, doc="""\ | |
162 The MIME headers of the catalog, used for the special ``msgid ""`` entry. | |
163 | |
164 The behavior of this property changes slightly depending on whether a locale | |
165 is set or not, the latter indicating that the catalog is actually a template | |
166 for actual translations. | |
167 | |
168 Here's an example of the output for such a catalog template: | |
169 | |
170 >>> catalog = Catalog(project='Foobar', version='1.0', | |
171 ... creation_date=datetime(1990, 4, 1, 15, 30)) | |
172 >>> for name, value in catalog.headers: | |
173 ... print '%s: %s' % (name, value) | |
174 Project-Id-Version: Foobar 1.0 | |
175 POT-Creation-Date: 1990-04-01 15:30+0000 | |
176 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE | |
177 Last-Translator: FULL NAME <EMAIL@ADDRESS> | |
178 Language-Team: LANGUAGE <LL@li.org> | |
179 Plural-Forms: nplurals=INTEGER; plural=EXPRESSION | |
180 MIME-Version: 1.0 | |
181 Content-Type: text/plain; charset=utf-8 | |
182 Content-Transfer-Encoding: 8bit | |
183 Generated-By: Babel ... | |
184 | |
185 And here's an example of the output when the locale is set: | |
186 | |
187 >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0', | |
188 ... creation_date=datetime(1990, 4, 1, 15, 30), | |
189 ... revision_date=datetime(1990, 8, 3, 12, 0), | |
190 ... last_translator='John Doe <jd@example.com>') | |
191 >>> for name, value in catalog.headers: | |
192 ... print '%s: %s' % (name, value) | |
193 Project-Id-Version: Foobar 1.0 | |
194 POT-Creation-Date: 1990-04-01 15:30+0000 | |
195 PO-Revision-Date: 1990-08-03 12:00+0000 | |
196 Last-Translator: John Doe <jd@example.com> | |
197 Language-Team: de_DE <LL@li.org> | |
198 Plural-Forms: nplurals=2; plural=(n != 1) | |
199 MIME-Version: 1.0 | |
200 Content-Type: text/plain; charset=utf-8 | |
201 Content-Transfer-Encoding: 8bit | |
202 Generated-By: Babel ... | |
203 | |
204 :type: `list` | |
205 """) | |
206 | |
207 def plural_forms(self): | |
208 num, expr = ('INTEGER', 'EXPRESSION') | |
209 if self.locale: | |
210 if str(self.locale) in PLURALS: | |
211 num, expr = PLURALS[str(self.locale)] | |
212 elif self.locale.language in PLURALS: | |
213 num, expr = PLURALS[self.locale.language] | |
214 return 'nplurals=%s; plural=%s' % (num, expr) | |
215 plural_forms = property(plural_forms, doc="""\ | |
216 Return the plural forms declaration for the locale. | |
217 | |
218 >>> Catalog(locale='en_US').plural_forms | |
219 'nplurals=2; plural=(n != 1)' | |
220 >>> Catalog(locale='pt_BR').plural_forms | |
221 'nplurals=2; plural=(n > 1)' | |
222 | |
223 :type: `str` | |
224 """) | |
225 | |
226 def __contains__(self, id): | |
227 """Return whether the catalog has a message with the specified ID.""" | |
228 return id in self._messages | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
229 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
230 def __iter__(self): |
66 | 231 """Iterates through all the entries in the catalog, in the order they |
232 were added, yielding a `Message` object for every entry. | |
233 | |
234 :rtype: ``iterator`` | |
235 """ | |
69 | 236 buf = [] |
237 for name, value in self.headers: | |
238 buf.append('%s: %s' % (name, value)) | |
239 yield Message('', '\n'.join(buf), flags=set(['fuzzy'])) | |
240 for id in self._messages: | |
241 yield self._messages[id] | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
242 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
243 def __repr__(self): |
66 | 244 locale = '' |
245 if self.locale: | |
246 locale = ' %s' % self.locale | |
247 return '<%s %r%s>' % (type(self).__name__, self.domain, locale) | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
248 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
249 def __delitem__(self, id): |
66 | 250 """Delete the message with the specified ID.""" |
69 | 251 if id in self._messages: |
252 del self._messages[id] | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
253 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
254 def __getitem__(self, id): |
66 | 255 """Return the message with the specified ID. |
256 | |
257 :param id: the message ID | |
258 :return: the message with the specified ID, or `None` if no such message | |
259 is in the catalog | |
69 | 260 :rtype: `Message` |
66 | 261 """ |
69 | 262 return self._messages.get(id) |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
263 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
264 def __setitem__(self, id, message): |
66 | 265 """Add or update the message with the specified ID. |
266 | |
267 >>> catalog = Catalog() | |
268 >>> catalog[u'foo'] = Message(u'foo') | |
269 >>> catalog[u'foo'] | |
270 <Message u'foo'> | |
271 | |
272 If a message with that ID is already in the catalog, it is updated | |
273 to include the locations and flags of the new message. | |
274 | |
275 >>> catalog = Catalog() | |
276 >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)]) | |
277 >>> catalog[u'foo'].locations | |
278 [('main.py', 1)] | |
279 >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)]) | |
280 >>> catalog[u'foo'].locations | |
281 [('main.py', 1), ('utils.py', 5)] | |
282 | |
283 :param id: the message ID | |
284 :param message: the `Message` object | |
285 """ | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
286 assert isinstance(message, Message), 'expected a Message object' |
69 | 287 current = self._messages.get(id) |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
288 if current: |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
289 assert current.string == message.string, 'translation mismatch' |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
290 current.locations.extend(message.locations) |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
291 current.flags |= message.flags |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
292 message = current |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
293 else: |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
294 if isinstance(id, (list, tuple)): |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
295 singular, plural = id |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
296 id = singular |
69 | 297 self._messages[id] = message |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
298 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
299 def add(self, id, string=None, locations=(), flags=()): |
66 | 300 """Add or update the message with the specified ID. |
301 | |
302 >>> catalog = Catalog() | |
303 >>> catalog.add(u'foo') | |
304 >>> catalog[u'foo'] | |
305 <Message u'foo'> | |
306 | |
307 This method simply constructs a `Message` object with the given | |
308 arguments and invokes `__setitem__` with that object. | |
309 | |
310 :param id: the message ID, or a ``(singular, plural)`` tuple for | |
311 pluralizable messages | |
312 :param string: the translated message string, or a | |
313 ``(singular, plural)`` tuple for pluralizable messages | |
314 :param locations: a sequence of ``(filenname, lineno)`` tuples | |
315 :param flags: a set or sequence of flags | |
316 """ | |
58
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
317 self[id] = Message(id, string, locations, flags) |