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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
24 from babel import __version__ as VERSION
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
25 from babel.core import Locale
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
26 from babel.messages.plurals import PLURALS
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
60 def fuzzy(self):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
61 return 'fuzzy' in self.flags
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
62 fuzzy = property(fuzzy, doc="""\
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
63 Whether the translation is fuzzy.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
64
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
65 >>> Message('foo').fuzzy
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
66 False
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
67 >>> Message('foo', 'foo', flags=['fuzzy']).fuzzy
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
68 True
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
70 :type: `bool`
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
71 """)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
106 def __init__(self, locale=None, domain=None, project=None, version=None,
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
107 creation_date=None, revision_date=None, last_translator=None):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
108 """Initialize the catalog object.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
109
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
110 :param domain: the message domain
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
111 :param locale: the locale identifier or `Locale` object, or `None`
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
112 if the catalog is not bound to a locale (which basically
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
113 means it's a template)
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
114 """
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
115 self.domain = domain #: the message domain
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
116 if locale:
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
117 locale = Locale.parse(locale)
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
118 self.locale = locale #: the locale or `None`
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
119 self._messages = odict()
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
120
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
121 self.project = project or 'PROJECT' #: the project name
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
122 self.version = version or 'VERSION' #: the project version
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
123
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
124 if creation_date is None:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
125 creation_date = time.localtime()
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
126 elif isinstance(creation_date, datetime):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
127 if creation_date.tzinfo is None:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
128 creation_date = creation_date.replace(tzinfo=UTC)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
129 creation_date = creation_date.timetuple()
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
130 self.creation_date = creation_date #: creation date of the template
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
131 if revision_date is None:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
132 revision_date = time.localtime()
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
133 elif isinstance(revision_date, datetime):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
134 if revision_date.tzinfo is None:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
135 revision_date = revision_date.replace(tzinfo=UTC)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
136 revision_date = revision_date.timetuple()
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
137 self.revision_date = revision_date #: last revision date of the catalog
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
138 self.last_translator = last_translator #: last translator name + email
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
139
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
140 def headers(self):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
141 headers = []
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
142 headers.append(('Project-Id-Version',
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
143 '%s %s' % (self.project, self.version)))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
144 headers.append(('POT-Creation-Date',
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
145 time.strftime('%Y-%m-%d %H:%M%z', self.creation_date)))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
146 if self.locale is None:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
147 headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
148 headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
149 headers.append(('Language-Team', 'LANGUAGE <LL@li.org>'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
150 else:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
151 headers.append(('PO-Revision-Date',
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
152 time.strftime('%Y-%m-%d %H:%M%z', self.revision_date)))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
153 headers.append(('Last-Translator', self.last_translator))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
154 headers.append(('Language-Team', '%s <LL@li.org>' % self.locale))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
155 headers.append(('Plural-Forms', self.plural_forms))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
156 headers.append(('MIME-Version', '1.0'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
157 headers.append(('Content-Type', 'text/plain; charset=utf-8'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
158 headers.append(('Content-Transfer-Encoding', '8bit'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
159 headers.append(('Generated-By', 'Babel %s' % VERSION))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
160 return headers
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
161 headers = property(headers, doc="""\
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
162 The MIME headers of the catalog, used for the special ``msgid ""`` entry.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
163
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
164 The behavior of this property changes slightly depending on whether a locale
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
165 is set or not, the latter indicating that the catalog is actually a template
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
166 for actual translations.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
167
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
168 Here's an example of the output for such a catalog template:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
169
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
170 >>> catalog = Catalog(project='Foobar', version='1.0',
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
171 ... creation_date=datetime(1990, 4, 1, 15, 30))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
172 >>> for name, value in catalog.headers:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
173 ... print '%s: %s' % (name, value)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
174 Project-Id-Version: Foobar 1.0
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
175 POT-Creation-Date: 1990-04-01 15:30+0000
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
176 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
177 Last-Translator: FULL NAME <EMAIL@ADDRESS>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
178 Language-Team: LANGUAGE <LL@li.org>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
179 Plural-Forms: nplurals=INTEGER; plural=EXPRESSION
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
180 MIME-Version: 1.0
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
181 Content-Type: text/plain; charset=utf-8
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
182 Content-Transfer-Encoding: 8bit
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
183 Generated-By: Babel ...
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
184
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
185 And here's an example of the output when the locale is set:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
186
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
187 >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0',
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
188 ... creation_date=datetime(1990, 4, 1, 15, 30),
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
189 ... revision_date=datetime(1990, 8, 3, 12, 0),
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
190 ... last_translator='John Doe <jd@example.com>')
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
191 >>> for name, value in catalog.headers:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
192 ... print '%s: %s' % (name, value)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
193 Project-Id-Version: Foobar 1.0
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
194 POT-Creation-Date: 1990-04-01 15:30+0000
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
195 PO-Revision-Date: 1990-08-03 12:00+0000
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
196 Last-Translator: John Doe <jd@example.com>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
197 Language-Team: de_DE <LL@li.org>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
198 Plural-Forms: nplurals=2; plural=(n != 1)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
199 MIME-Version: 1.0
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
200 Content-Type: text/plain; charset=utf-8
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
201 Content-Transfer-Encoding: 8bit
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
202 Generated-By: Babel ...
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
203
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
204 :type: `list`
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
205 """)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
206
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
207 def plural_forms(self):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
208 num, expr = ('INTEGER', 'EXPRESSION')
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
209 if self.locale:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
210 if str(self.locale) in PLURALS:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
211 num, expr = PLURALS[str(self.locale)]
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
212 elif self.locale.language in PLURALS:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
213 num, expr = PLURALS[self.locale.language]
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
214 return 'nplurals=%s; plural=%s' % (num, expr)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
215 plural_forms = property(plural_forms, doc="""\
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
216 Return the plural forms declaration for the locale.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
217
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
218 >>> Catalog(locale='en_US').plural_forms
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
219 'nplurals=2; plural=(n != 1)'
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
220 >>> Catalog(locale='pt_BR').plural_forms
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
221 'nplurals=2; plural=(n > 1)'
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
222
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
223 :type: `str`
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
224 """)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
225
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
226 def __contains__(self, id):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
227 """Return whether the catalog has a message with the specified ID."""
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
231 """Iterates through all the entries in the catalog, in the order they
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
232 were added, yielding a `Message` object for every entry.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
233
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
234 :rtype: ``iterator``
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
235 """
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
236 buf = []
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
237 for name, value in self.headers:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
238 buf.append('%s: %s' % (name, value))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
239 yield Message('', '\n'.join(buf), flags=set(['fuzzy']))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
240 for id in self._messages:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
244 locale = ''
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
245 if self.locale:
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
246 locale = ' %s' % self.locale
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
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
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
250 """Delete the message with the specified ID."""
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
251 if id in self._messages:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
255 """Return the message with the specified ID.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
256
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
257 :param id: the message ID
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
258 :return: the message with the specified ID, or `None` if no such message
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
259 is in the catalog
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
260 :rtype: `Message`
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
261 """
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
265 """Add or update the message with the specified ID.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
266
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
267 >>> catalog = Catalog()
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
268 >>> catalog[u'foo'] = Message(u'foo')
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
269 >>> catalog[u'foo']
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
270 <Message u'foo'>
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
271
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
272 If a message with that ID is already in the catalog, it is updated
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
273 to include the locations and flags of the new message.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
274
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
275 >>> catalog = Catalog()
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
276 >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)])
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
277 >>> catalog[u'foo'].locations
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
278 [('main.py', 1)]
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
279 >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)])
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
280 >>> catalog[u'foo'].locations
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
281 [('main.py', 1), ('utils.py', 5)]
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
282
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
283 :param id: the message ID
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
284 :param message: the `Message` object
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
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
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
300 """Add or update the message with the specified ID.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
301
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
302 >>> catalog = Catalog()
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
303 >>> catalog.add(u'foo')
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
304 >>> catalog[u'foo']
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
305 <Message u'foo'>
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
306
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
307 This method simply constructs a `Message` object with the given
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
308 arguments and invokes `__setitem__` with that object.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
309
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
310 :param id: the message ID, or a ``(singular, plural)`` tuple for
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
311 pluralizable messages
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
312 :param string: the translated message string, or a
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
313 ``(singular, plural)`` tuple for pluralizable messages
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
314 :param locations: a sequence of ``(filenname, lineno)`` tuples
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
315 :param flags: a set or sequence of flags
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
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)
Copyright (C) 2012-2017 Edgewall Software