Mercurial > babel > old > mirror
annotate babel/messages/catalog.py @ 89:31519c52c0fe
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
Fixed a bug on the `new_catalog` and `init` frontends, we were badly building the new directory for the localized catalog. Normal directory hierarchy is `<output_dir>/<locale>/LC_MESSAGES/<domain>.po`, not `<output_dir>/<locale>/<domain>.po`, ie `LC_MESSAGES/<locale>/<domain>.po`.
author | palgarvio |
---|---|
date | Mon, 11 Jun 2007 00:48:07 +0000 |
parents | 8a703ecdba91 |
children | debd9ac3bb4d |
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 |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
38 def __init__(self, id, string='', locations=(), flags=(), comments=()): |
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
|
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 |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
47 :param comments: a sequence of translator comments for the 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
|
48 """ |
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.id = id |
70 | 50 if not string and self.pluralizable: |
51 string = (u'', u'') | |
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
|
52 self.string = string |
72
f5a6bf38df89
Fix for mixed singular/plural messages, follow-up to [70].
cmlenz
parents:
71
diff
changeset
|
53 self.locations = list(locations) |
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
|
54 self.flags = set(flags) |
69 | 55 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
|
56 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
|
57 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
|
58 self.flags.discard('python-format') |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
59 self.comments = list(comments) |
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
|
60 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
61 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
|
62 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
|
63 |
69 | 64 def fuzzy(self): |
65 return 'fuzzy' in self.flags | |
66 fuzzy = property(fuzzy, doc="""\ | |
67 Whether the translation is fuzzy. | |
68 | |
69 >>> Message('foo').fuzzy | |
70 False | |
71 >>> Message('foo', 'foo', flags=['fuzzy']).fuzzy | |
72 True | |
73 | |
74 :type: `bool` | |
75 """) | |
76 | |
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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 |
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 >>> 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
|
83 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
|
84 >>> 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
|
85 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
|
86 |
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
|
87 :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
|
88 """) |
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 |
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 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
|
91 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
|
92 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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 |
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 >>> 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
|
99 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
|
100 >>> 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
|
101 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
|
102 |
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
|
103 :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
|
104 """) |
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 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
106 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
107 class Catalog(object): |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
108 """Representation of a message catalog.""" |
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
|
109 |
69 | 110 def __init__(self, locale=None, domain=None, project=None, version=None, |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
111 msgid_bugs_address=None, creation_date=None, |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
112 revision_date=None, last_translator=None, charset='utf-8'): |
66 | 113 """Initialize the catalog object. |
114 | |
115 :param locale: the locale identifier or `Locale` object, or `None` | |
116 if the catalog is not bound to a locale (which basically | |
117 means it's a template) | |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
118 :param domain: the message domain |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
119 :param project: the project's name |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
120 :param version: the project's version |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
121 :param msgid_bugs_address: the address to report bugs about the catalog |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
122 :param creation_date: the date the catalog was created |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
123 :param revision_date: the date the catalog was revised |
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
124 :param last_translator: the name and email of the last translator |
66 | 125 """ |
126 self.domain = domain #: the message domain | |
127 if locale: | |
128 locale = Locale.parse(locale) | |
129 self.locale = locale #: the locale or `None` | |
69 | 130 self._messages = odict() |
131 | |
132 self.project = project or 'PROJECT' #: the project name | |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
133 self.version = version or 'VERSION' #: the project version |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
134 self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS' |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
135 |
69 | 136 if creation_date is None: |
137 creation_date = time.localtime() | |
138 elif isinstance(creation_date, datetime): | |
139 if creation_date.tzinfo is None: | |
140 creation_date = creation_date.replace(tzinfo=UTC) | |
141 creation_date = creation_date.timetuple() | |
142 self.creation_date = creation_date #: creation date of the template | |
143 if revision_date is None: | |
144 revision_date = time.localtime() | |
145 elif isinstance(revision_date, datetime): | |
146 if revision_date.tzinfo is None: | |
147 revision_date = revision_date.replace(tzinfo=UTC) | |
148 revision_date = revision_date.timetuple() | |
149 self.revision_date = revision_date #: last revision date of the catalog | |
150 self.last_translator = last_translator #: last translator name + email | |
70 | 151 self.charset = charset or 'utf-8' |
69 | 152 |
153 def headers(self): | |
154 headers = [] | |
155 headers.append(('Project-Id-Version', | |
156 '%s %s' % (self.project, self.version))) | |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
157 headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address)) |
69 | 158 headers.append(('POT-Creation-Date', |
159 time.strftime('%Y-%m-%d %H:%M%z', self.creation_date))) | |
160 if self.locale is None: | |
161 headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE')) | |
162 headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>')) | |
163 headers.append(('Language-Team', 'LANGUAGE <LL@li.org>')) | |
164 else: | |
165 headers.append(('PO-Revision-Date', | |
166 time.strftime('%Y-%m-%d %H:%M%z', self.revision_date))) | |
167 headers.append(('Last-Translator', self.last_translator)) | |
168 headers.append(('Language-Team', '%s <LL@li.org>' % self.locale)) | |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
169 headers.append(('Plural-Forms', self.plural_forms)) |
69 | 170 headers.append(('MIME-Version', '1.0')) |
70 | 171 headers.append(('Content-Type', |
172 'text/plain; charset=%s' % self.charset)) | |
69 | 173 headers.append(('Content-Transfer-Encoding', '8bit')) |
174 headers.append(('Generated-By', 'Babel %s' % VERSION)) | |
175 return headers | |
176 headers = property(headers, doc="""\ | |
177 The MIME headers of the catalog, used for the special ``msgid ""`` entry. | |
178 | |
179 The behavior of this property changes slightly depending on whether a locale | |
180 is set or not, the latter indicating that the catalog is actually a template | |
181 for actual translations. | |
182 | |
183 Here's an example of the output for such a catalog template: | |
184 | |
185 >>> catalog = Catalog(project='Foobar', version='1.0', | |
186 ... creation_date=datetime(1990, 4, 1, 15, 30)) | |
187 >>> for name, value in catalog.headers: | |
188 ... print '%s: %s' % (name, value) | |
189 Project-Id-Version: Foobar 1.0 | |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
190 Report-Msgid-Bugs-To: EMAIL@ADDRESS |
69 | 191 POT-Creation-Date: 1990-04-01 15:30+0000 |
192 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE | |
193 Last-Translator: FULL NAME <EMAIL@ADDRESS> | |
194 Language-Team: LANGUAGE <LL@li.org> | |
195 MIME-Version: 1.0 | |
196 Content-Type: text/plain; charset=utf-8 | |
197 Content-Transfer-Encoding: 8bit | |
198 Generated-By: Babel ... | |
199 | |
200 And here's an example of the output when the locale is set: | |
201 | |
202 >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0', | |
203 ... creation_date=datetime(1990, 4, 1, 15, 30), | |
204 ... revision_date=datetime(1990, 8, 3, 12, 0), | |
205 ... last_translator='John Doe <jd@example.com>') | |
206 >>> for name, value in catalog.headers: | |
207 ... print '%s: %s' % (name, value) | |
208 Project-Id-Version: Foobar 1.0 | |
80
8e2e9d549693
Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents:
72
diff
changeset
|
209 Report-Msgid-Bugs-To: EMAIL@ADDRESS |
69 | 210 POT-Creation-Date: 1990-04-01 15:30+0000 |
211 PO-Revision-Date: 1990-08-03 12:00+0000 | |
212 Last-Translator: John Doe <jd@example.com> | |
213 Language-Team: de_DE <LL@li.org> | |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
214 Plural-Forms: nplurals=2; plural=(n != 1) |
69 | 215 MIME-Version: 1.0 |
216 Content-Type: text/plain; charset=utf-8 | |
217 Content-Transfer-Encoding: 8bit | |
218 Generated-By: Babel ... | |
219 | |
220 :type: `list` | |
221 """) | |
222 | |
70 | 223 def num_plurals(self): |
224 num = 2 | |
225 if self.locale: | |
226 if str(self.locale) in PLURALS: | |
227 num = PLURALS[str(self.locale)][0] | |
228 elif self.locale.language in PLURALS: | |
229 num = PLURALS[self.locale.language][0] | |
230 return num | |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
231 num_plurals = property(num_plurals, doc="""\ |
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
232 The number of plurals used by the locale. |
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
233 """) |
70 | 234 |
69 | 235 def plural_forms(self): |
236 num, expr = ('INTEGER', 'EXPRESSION') | |
237 if self.locale: | |
238 if str(self.locale) in PLURALS: | |
239 num, expr = PLURALS[str(self.locale)] | |
240 elif self.locale.language in PLURALS: | |
241 num, expr = PLURALS[self.locale.language] | |
242 return 'nplurals=%s; plural=%s' % (num, expr) | |
243 plural_forms = property(plural_forms, doc="""\ | |
244 Return the plural forms declaration for the locale. | |
245 | |
246 >>> Catalog(locale='en_US').plural_forms | |
247 'nplurals=2; plural=(n != 1)' | |
248 >>> Catalog(locale='pt_BR').plural_forms | |
249 'nplurals=2; plural=(n > 1)' | |
250 | |
251 :type: `str` | |
252 """) | |
253 | |
254 def __contains__(self, id): | |
255 """Return whether the catalog has a message with the specified ID.""" | |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
256 return self._key_for(id) in self._messages |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
257 |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
258 def __len__(self): |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
259 """The number of messages in the catalog. |
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
260 |
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
261 This does not include the special ``msgid ""`` entry. |
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
262 """ |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
263 return len(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
|
264 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
265 def __iter__(self): |
66 | 266 """Iterates through all the entries in the catalog, in the order they |
267 were added, yielding a `Message` object for every entry. | |
268 | |
269 :rtype: ``iterator`` | |
270 """ | |
69 | 271 buf = [] |
272 for name, value in self.headers: | |
273 buf.append('%s: %s' % (name, value)) | |
274 yield Message('', '\n'.join(buf), flags=set(['fuzzy'])) | |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
275 for key in self._messages: |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
276 yield self._messages[key] |
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
|
277 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
278 def __repr__(self): |
66 | 279 locale = '' |
280 if self.locale: | |
281 locale = ' %s' % self.locale | |
282 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
|
283 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
284 def __delitem__(self, id): |
66 | 285 """Delete the message with the specified ID.""" |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
286 key = self._key_for(id) |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
287 if key in self._messages: |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
288 del self._messages[key] |
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
|
289 |
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 def __getitem__(self, id): |
66 | 291 """Return the message with the specified ID. |
292 | |
293 :param id: the message ID | |
294 :return: the message with the specified ID, or `None` if no such message | |
295 is in the catalog | |
69 | 296 :rtype: `Message` |
66 | 297 """ |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
298 return self._messages.get(self._key_for(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
|
299 |
068952b4d4c0
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
300 def __setitem__(self, id, message): |
66 | 301 """Add or update the message with the specified ID. |
302 | |
303 >>> catalog = Catalog() | |
304 >>> catalog[u'foo'] = Message(u'foo') | |
305 >>> catalog[u'foo'] | |
306 <Message u'foo'> | |
307 | |
308 If a message with that ID is already in the catalog, it is updated | |
309 to include the locations and flags of the new message. | |
310 | |
311 >>> catalog = Catalog() | |
312 >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)]) | |
313 >>> catalog[u'foo'].locations | |
314 [('main.py', 1)] | |
315 >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)]) | |
316 >>> catalog[u'foo'].locations | |
317 [('main.py', 1), ('utils.py', 5)] | |
318 | |
319 :param id: the message ID | |
320 :param message: the `Message` object | |
321 """ | |
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
|
322 assert isinstance(message, Message), 'expected a Message object' |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
323 key = self._key_for(id) |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
324 current = self._messages.get(key) |
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
|
325 if current: |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
326 if message.pluralizable and not current.pluralizable: |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
327 # The new message adds pluralization |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
328 current.id = message.id |
72
f5a6bf38df89
Fix for mixed singular/plural messages, follow-up to [70].
cmlenz
parents:
71
diff
changeset
|
329 current.string = message.string |
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
|
330 current.locations.extend(message.locations) |
89
31519c52c0fe
Fixed a bug on Catalog. `__setitem__` was not updating the translator comments. Thanks pjenvey!
palgarvio
parents:
86
diff
changeset
|
331 current.comments.extend(message.comments) |
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
|
332 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
|
333 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
|
334 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
|
335 if isinstance(id, (list, tuple)): |
70 | 336 assert isinstance(message.string, (list, tuple)) |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
337 self._messages[key] = 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
|
338 |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
339 def add(self, id, string=None, locations=(), flags=(), comments=()): |
66 | 340 """Add or update the message with the specified ID. |
341 | |
342 >>> catalog = Catalog() | |
343 >>> catalog.add(u'foo') | |
344 >>> catalog[u'foo'] | |
345 <Message u'foo'> | |
346 | |
347 This method simply constructs a `Message` object with the given | |
348 arguments and invokes `__setitem__` with that object. | |
349 | |
350 :param id: the message ID, or a ``(singular, plural)`` tuple for | |
351 pluralizable messages | |
352 :param string: the translated message string, or a | |
353 ``(singular, plural)`` tuple for pluralizable messages | |
354 :param locations: a sequence of ``(filenname, lineno)`` tuples | |
355 :param flags: a set or sequence of flags | |
86
8a703ecdba91
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
82
diff
changeset
|
356 :param comments: a list of translator comments |
66 | 357 """ |
82
f421e5576d26
Added support for translator comments at the API and frontends levels.(See #12, item 1). Updated docs and tests accordingly.
palgarvio
parents:
80
diff
changeset
|
358 self[id] = Message(id, string, list(locations), flags, comments) |
71
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
359 |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
360 def _key_for(self, id): |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
361 """The key for a message is just the singular ID even for pluralizable |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
362 messages. |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
363 """ |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
364 key = id |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
365 if isinstance(key, (list, tuple)): |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
366 key = id[0] |
b260ffa01a2d
Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents:
70
diff
changeset
|
367 return key |