annotate 0.9.x/babel/messages/catalog.py @ 509:cd2dec0823c9 stable

Python 2.3 compatibility: backporting r456 and r457 to 0.9 branch (see #233)
author fschwarz
date Fri, 04 Mar 2011 13:14:03 +0000
parents 4adedf7d0f04
children
rev   line source
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
1 # -*- coding: utf-8 -*-
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
2 #
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
3 # Copyright (C) 2007 Edgewall Software
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
4 # All rights reserved.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
5 #
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
6 # This software is licensed as described in the file COPYING, which
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
7 # you should have received as part of this distribution. The terms
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
8 # are also available at http://babel.edgewall.org/wiki/License.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
9 #
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
10 # This software consists of voluntary contributions made by many
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
11 # individuals. For the exact contribution history, see the revision
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
12 # history and logs, available at http://babel.edgewall.org/log/.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
13
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
14 """Data structures for message catalogs."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
15
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
16 from cgi import parse_header
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
17 from datetime import datetime
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
18 from difflib import get_close_matches
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
19 from email import message_from_string
371
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
20 from copy import copy
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
21 import re
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
22 import time
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
23
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
24 from babel import __version__ as VERSION
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
25 from babel.core import Locale
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
26 from babel.dates import format_datetime
381
6a0e7205790f Ported [407:415/trunk] back to 0.9.x branch.
cmlenz
parents: 371
diff changeset
27 from babel.messages.plurals import get_plural
509
cd2dec0823c9 Python 2.3 compatibility: backporting r456 and r457 to 0.9 branch (see #233)
fschwarz
parents: 481
diff changeset
28 from babel.util import odict, distinct, set, LOCALTZ, UTC, FixedOffsetTimezone
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
29
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
30 __all__ = ['Message', 'Catalog', 'TranslationError']
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
31 __docformat__ = 'restructuredtext en'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
32
371
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
33
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
34 PYTHON_FORMAT = re.compile(r'''(?x)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
35 \%
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
36 (?:\(([\w]*)\))?
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
37 (
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
38 [-#0\ +]?(?:\*|[\d]+)?
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
39 (?:\.(?:\*|[\d]+))?
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
40 [hlL]?
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
41 )
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
42 ([diouxXeEfFgGcrs%])
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
43 ''')
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
44
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
45
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
46 class Message(object):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
47 """Representation of a single message in a catalog."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
48
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
49 def __init__(self, id, string=u'', locations=(), flags=(), auto_comments=(),
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
50 user_comments=(), previous_id=(), lineno=None):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
51 """Create the message object.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
52
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
53 :param id: the message ID, or a ``(singular, plural)`` tuple for
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
54 pluralizable messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
55 :param string: the translated message string, or a
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
56 ``(singular, plural)`` tuple for pluralizable messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
57 :param locations: a sequence of ``(filenname, lineno)`` tuples
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
58 :param flags: a set or sequence of flags
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
59 :param auto_comments: a sequence of automatic comments for the message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
60 :param user_comments: a sequence of user comments for the message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
61 :param previous_id: the previous message ID, or a ``(singular, plural)``
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
62 tuple for pluralizable messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
63 :param lineno: the line number on which the msgid line was found in the
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
64 PO file, if any
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
65 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
66 self.id = id #: The message ID
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
67 if not string and self.pluralizable:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
68 string = (u'', u'')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
69 self.string = string #: The message translation
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
70 self.locations = list(distinct(locations))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
71 self.flags = set(flags)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
72 if id and self.python_format:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
73 self.flags.add('python-format')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
74 else:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
75 self.flags.discard('python-format')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
76 self.auto_comments = list(distinct(auto_comments))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
77 self.user_comments = list(distinct(user_comments))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
78 if isinstance(previous_id, basestring):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
79 self.previous_id = [previous_id]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
80 else:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
81 self.previous_id = list(previous_id)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
82 self.lineno = lineno
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
83
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
84 def __repr__(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
85 return '<%s %r (flags: %r)>' % (type(self).__name__, self.id,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
86 list(self.flags))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
87
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
88 def __cmp__(self, obj):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
89 """Compare Messages, taking into account plural ids"""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
90 if isinstance(obj, Message):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
91 plural = self.pluralizable
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
92 obj_plural = obj.pluralizable
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
93 if plural and obj_plural:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
94 return cmp(self.id[0], obj.id[0])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
95 elif plural:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
96 return cmp(self.id[0], obj.id)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
97 elif obj_plural:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
98 return cmp(self.id, obj.id[0])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
99 return cmp(self.id, obj.id)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
100
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
101 def clone(self):
371
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
102 return Message(*map(copy, (self.id, self.string, self.locations,
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
103 self.flags, self.auto_comments,
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
104 self.user_comments, self.previous_id,
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
105 self.lineno)))
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
106
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
107 def check(self, catalog=None):
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
108 """Run various validation checks on the message. Some validations
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
109 are only performed if the catalog is provided. This method returns
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
110 a sequence of `TranslationError` objects.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
111
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
112 :rtype: ``iterator``
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
113 :param catalog: A catalog instance that is passed to the checkers
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
114 :see: `Catalog.check` for a way to perform checks for all messages
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
115 in a catalog.
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
116 """
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
117 from babel.messages.checkers import checkers
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
118 errors = []
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
119 for checker in checkers:
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
120 try:
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
121 checker(catalog, self)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
122 except TranslationError, e:
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
123 errors.append(e)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
124 return errors
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
125
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
126 def fuzzy(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
127 return 'fuzzy' in self.flags
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
128 fuzzy = property(fuzzy, doc="""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
129 Whether the translation is fuzzy.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
130
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
131 >>> Message('foo').fuzzy
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
132 False
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
133 >>> msg = Message('foo', 'foo', flags=['fuzzy'])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
134 >>> msg.fuzzy
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
135 True
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
136 >>> msg
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
137 <Message 'foo' (flags: ['fuzzy'])>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
138
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
139 :type: `bool`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
140 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
141
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
142 def pluralizable(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
143 return isinstance(self.id, (list, tuple))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
144 pluralizable = property(pluralizable, doc="""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
145 Whether the message is plurizable.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
146
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
147 >>> Message('foo').pluralizable
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
148 False
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
149 >>> Message(('foo', 'bar')).pluralizable
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
150 True
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
151
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
152 :type: `bool`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
153 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
154
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
155 def python_format(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
156 ids = self.id
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
157 if not isinstance(ids, (list, tuple)):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
158 ids = [ids]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
159 return bool(filter(None, [PYTHON_FORMAT.search(id) for id in ids]))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
160 python_format = property(python_format, doc="""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
161 Whether the message contains Python-style parameters.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
162
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
163 >>> Message('foo %(name)s bar').python_format
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
164 True
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
165 >>> Message(('foo %(name)s', 'foo %(name)s')).python_format
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
166 True
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
167
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
168 :type: `bool`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
169 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
170
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
171
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
172 class TranslationError(Exception):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
173 """Exception thrown by translation checkers when invalid message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
174 translations are encountered."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
175
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
176
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
177 DEFAULT_HEADER = u"""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
178 # Translations template for PROJECT.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
179 # Copyright (C) YEAR ORGANIZATION
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
180 # This file is distributed under the same license as the PROJECT project.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
181 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
182 #"""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
183
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
184
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
185 class Catalog(object):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
186 """Representation of a message catalog."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
187
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
188 def __init__(self, locale=None, domain=None, header_comment=DEFAULT_HEADER,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
189 project=None, version=None, copyright_holder=None,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
190 msgid_bugs_address=None, creation_date=None,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
191 revision_date=None, last_translator=None, language_team=None,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
192 charset='utf-8', fuzzy=True):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
193 """Initialize the catalog object.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
194
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
195 :param locale: the locale identifier or `Locale` object, or `None`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
196 if the catalog is not bound to a locale (which basically
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
197 means it's a template)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
198 :param domain: the message domain
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
199 :param header_comment: the header comment as string, or `None` for the
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
200 default header
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
201 :param project: the project's name
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
202 :param version: the project's version
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
203 :param copyright_holder: the copyright holder of the catalog
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
204 :param msgid_bugs_address: the email address or URL to submit bug
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
205 reports to
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
206 :param creation_date: the date the catalog was created
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
207 :param revision_date: the date the catalog was revised
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
208 :param last_translator: the name and email of the last translator
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
209 :param language_team: the name and email of the language team
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
210 :param charset: the encoding to use in the output
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
211 :param fuzzy: the fuzzy bit on the catalog header
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
212 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
213 self.domain = domain #: The message domain
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
214 if locale:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
215 locale = Locale.parse(locale)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
216 self.locale = locale #: The locale or `None`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
217 self._header_comment = header_comment
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
218 self._messages = odict()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
219
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
220 self.project = project or 'PROJECT' #: The project name
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
221 self.version = version or 'VERSION' #: The project version
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
222 self.copyright_holder = copyright_holder or 'ORGANIZATION'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
223 self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
224
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
225 self.last_translator = last_translator or 'FULL NAME <EMAIL@ADDRESS>'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
226 """Name and email address of the last translator."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
227 self.language_team = language_team or 'LANGUAGE <LL@li.org>'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
228 """Name and email address of the language team."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
229
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
230 self.charset = charset or 'utf-8'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
231
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
232 if creation_date is None:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
233 creation_date = datetime.now(LOCALTZ)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
234 elif isinstance(creation_date, datetime) and not creation_date.tzinfo:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
235 creation_date = creation_date.replace(tzinfo=LOCALTZ)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
236 self.creation_date = creation_date #: Creation date of the template
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
237 if revision_date is None:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
238 revision_date = datetime.now(LOCALTZ)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
239 elif isinstance(revision_date, datetime) and not revision_date.tzinfo:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
240 revision_date = revision_date.replace(tzinfo=LOCALTZ)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
241 self.revision_date = revision_date #: Last revision date of the catalog
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
242 self.fuzzy = fuzzy #: Catalog header fuzzy bit (`True` or `False`)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
243
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
244 self.obsolete = odict() #: Dictionary of obsolete messages
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
245 self._num_plurals = None
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
246 self._plural_expr = None
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
247
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
248 def _get_header_comment(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
249 comment = self._header_comment
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
250 comment = comment.replace('PROJECT', self.project) \
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
251 .replace('VERSION', self.version) \
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
252 .replace('YEAR', self.revision_date.strftime('%Y')) \
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
253 .replace('ORGANIZATION', self.copyright_holder)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
254 if self.locale:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
255 comment = comment.replace('Translations template', '%s translations'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
256 % self.locale.english_name)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
257 return comment
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
258
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
259 def _set_header_comment(self, string):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
260 self._header_comment = string
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
261
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
262 header_comment = property(_get_header_comment, _set_header_comment, doc="""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
263 The header comment for the catalog.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
264
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
265 >>> catalog = Catalog(project='Foobar', version='1.0',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
266 ... copyright_holder='Foo Company')
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
267 >>> print catalog.header_comment #doctest: +ELLIPSIS
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
268 # Translations template for Foobar.
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
269 # Copyright (C) ... Foo Company
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
270 # This file is distributed under the same license as the Foobar project.
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
271 # FIRST AUTHOR <EMAIL@ADDRESS>, ....
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
272 #
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
273
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
274 The header can also be set from a string. Any known upper-case variables
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
275 will be replaced when the header is retrieved again:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
276
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
277 >>> catalog = Catalog(project='Foobar', version='1.0',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
278 ... copyright_holder='Foo Company')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
279 >>> catalog.header_comment = '''\\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
280 ... # The POT for my really cool PROJECT project.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
281 ... # Copyright (C) 1990-2003 ORGANIZATION
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
282 ... # This file is distributed under the same license as the PROJECT
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
283 ... # project.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
284 ... #'''
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
285 >>> print catalog.header_comment
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
286 # The POT for my really cool Foobar project.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
287 # Copyright (C) 1990-2003 Foo Company
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
288 # This file is distributed under the same license as the Foobar
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
289 # project.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
290 #
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
291
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
292 :type: `unicode`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
293 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
294
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
295 def _get_mime_headers(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
296 headers = []
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
297 headers.append(('Project-Id-Version',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
298 '%s %s' % (self.project, self.version)))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
299 headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
300 headers.append(('POT-Creation-Date',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
301 format_datetime(self.creation_date, 'yyyy-MM-dd HH:mmZ',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
302 locale='en')))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
303 if self.locale is None:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
304 headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE'))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
305 headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>'))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
306 headers.append(('Language-Team', 'LANGUAGE <LL@li.org>'))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
307 else:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
308 headers.append(('PO-Revision-Date',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
309 format_datetime(self.revision_date,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
310 'yyyy-MM-dd HH:mmZ', locale='en')))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
311 headers.append(('Last-Translator', self.last_translator))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
312 headers.append(('Language-Team',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
313 self.language_team.replace('LANGUAGE',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
314 str(self.locale))))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
315 headers.append(('Plural-Forms', self.plural_forms))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
316 headers.append(('MIME-Version', '1.0'))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
317 headers.append(('Content-Type',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
318 'text/plain; charset=%s' % self.charset))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
319 headers.append(('Content-Transfer-Encoding', '8bit'))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
320 headers.append(('Generated-By', 'Babel %s\n' % VERSION))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
321 return headers
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
322
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
323 def _set_mime_headers(self, headers):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
324 for name, value in headers:
295
270e771854d8 Merged revisions 321-323 via svnmerge from
pjenvey
parents: 280
diff changeset
325 if name.lower() == 'content-type':
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
326 mimetype, params = parse_header(value)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
327 if 'charset' in params:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
328 self.charset = params['charset'].lower()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
329 break
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
330 for name, value in headers:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
331 name = name.lower().decode(self.charset)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
332 value = value.decode(self.charset)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
333 if name == 'project-id-version':
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
334 parts = value.split(' ')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
335 self.project = u' '.join(parts[:-1])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
336 self.version = parts[-1]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
337 elif name == 'report-msgid-bugs-to':
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
338 self.msgid_bugs_address = value
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
339 elif name == 'last-translator':
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
340 self.last_translator = value
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
341 elif name == 'language-team':
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
342 self.language_team = value
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
343 elif name == 'plural-forms':
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
344 _, params = parse_header(' ;' + value)
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
345 self._num_plurals = int(params.get('nplurals', 2))
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
346 self._plural_expr = params.get('plural', '(n != 1)')
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
347 elif name == 'pot-creation-date':
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
348 # FIXME: this should use dates.parse_datetime as soon as that
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
349 # is ready
481
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
350 value, tzoffset, _ = re.split('([+-]\d{4})$', value, 1)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
351
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
352 tt = time.strptime(value, '%Y-%m-%d %H:%M')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
353 ts = time.mktime(tt)
481
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
354
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
355 # Separate the offset into a sign component, hours, and minutes
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
356 plus_minus_s, rest = tzoffset[0], tzoffset[1:]
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
357 hours_offset_s, mins_offset_s = rest[:2], rest[2:]
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
358
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
359 # Make them all integers
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
360 plus_minus = int(plus_minus_s + '1')
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
361 hours_offset = int(hours_offset_s)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
362 mins_offset = int(mins_offset_s)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
363
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
364 # Calculate net offset
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
365 net_mins_offset = hours_offset * 60
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
366 net_mins_offset += mins_offset
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
367 net_mins_offset *= plus_minus
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
368
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
369 # Create an offset object
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
370 tzoffset = FixedOffsetTimezone(net_mins_offset)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
371
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
372 # Store the offset in a datetime object
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
373 dt = datetime.fromtimestamp(ts)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
374 self.creation_date = dt.replace(tzinfo=tzoffset)
477
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
375 elif name == 'po-revision-date':
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
376 # Keep the value if it's not the default one
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
377 if 'YEAR' not in value:
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
378 # FIXME: this should use dates.parse_datetime as soon as
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
379 # that is ready
481
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
380 value, tzoffset, _ = re.split('([+-]\d{4})$', value, 1)
477
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
381 tt = time.strptime(value, '%Y-%m-%d %H:%M')
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
382 ts = time.mktime(tt)
481
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
383
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
384 # Separate the offset into a sign component, hours, and
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
385 # minutes
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
386 plus_minus_s, rest = tzoffset[0], tzoffset[1:]
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
387 hours_offset_s, mins_offset_s = rest[:2], rest[2:]
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
388
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
389 # Make them all integers
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
390 plus_minus = int(plus_minus_s + '1')
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
391 hours_offset = int(hours_offset_s)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
392 mins_offset = int(mins_offset_s)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
393
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
394 # Calculate net offset
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
395 net_mins_offset = hours_offset * 60
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
396 net_mins_offset += mins_offset
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
397 net_mins_offset *= plus_minus
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
398
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
399 # Create an offset object
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
400 tzoffset = FixedOffsetTimezone(net_mins_offset)
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
401
4adedf7d0f04 Merged revisions 469,529 via svnmerge from
jruigrok
parents: 477
diff changeset
402 # Store the offset in a datetime object
477
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
403 dt = datetime.fromtimestamp(ts)
39dd1c71fb5b Merged revisions 464 via svnmerge from
jruigrok
parents: 474
diff changeset
404 self.revision_date = dt.replace(tzinfo=tzoffset)
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
405
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
406 mime_headers = property(_get_mime_headers, _set_mime_headers, doc="""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
407 The MIME headers of the catalog, used for the special ``msgid ""`` entry.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
408
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
409 The behavior of this property changes slightly depending on whether a locale
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
410 is set or not, the latter indicating that the catalog is actually a template
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
411 for actual translations.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
412
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
413 Here's an example of the output for such a catalog template:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
414
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
415 >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
416 >>> catalog = Catalog(project='Foobar', version='1.0',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
417 ... creation_date=created)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
418 >>> for name, value in catalog.mime_headers:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
419 ... print '%s: %s' % (name, value)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
420 Project-Id-Version: Foobar 1.0
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
421 Report-Msgid-Bugs-To: EMAIL@ADDRESS
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
422 POT-Creation-Date: 1990-04-01 15:30+0000
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
423 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
424 Last-Translator: FULL NAME <EMAIL@ADDRESS>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
425 Language-Team: LANGUAGE <LL@li.org>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
426 MIME-Version: 1.0
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
427 Content-Type: text/plain; charset=utf-8
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
428 Content-Transfer-Encoding: 8bit
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
429 Generated-By: Babel ...
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
430
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
431 And here's an example of the output when the locale is set:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
432
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
433 >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
434 >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
435 ... creation_date=created, revision_date=revised,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
436 ... last_translator='John Doe <jd@example.com>',
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
437 ... language_team='de_DE <de@example.com>')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
438 >>> for name, value in catalog.mime_headers:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
439 ... print '%s: %s' % (name, value)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
440 Project-Id-Version: Foobar 1.0
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
441 Report-Msgid-Bugs-To: EMAIL@ADDRESS
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
442 POT-Creation-Date: 1990-04-01 15:30+0000
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
443 PO-Revision-Date: 1990-08-03 12:00+0000
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
444 Last-Translator: John Doe <jd@example.com>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
445 Language-Team: de_DE <de@example.com>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
446 Plural-Forms: nplurals=2; plural=(n != 1)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
447 MIME-Version: 1.0
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
448 Content-Type: text/plain; charset=utf-8
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
449 Content-Transfer-Encoding: 8bit
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
450 Generated-By: Babel ...
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
451
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
452 :type: `list`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
453 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
454
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
455 def num_plurals(self):
381
6a0e7205790f Ported [407:415/trunk] back to 0.9.x branch.
cmlenz
parents: 371
diff changeset
456 if self._num_plurals is None:
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
457 num = 2
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
458 if self.locale:
381
6a0e7205790f Ported [407:415/trunk] back to 0.9.x branch.
cmlenz
parents: 371
diff changeset
459 num = get_plural(self.locale)[0]
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
460 self._num_plurals = num
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
461 return self._num_plurals
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
462 num_plurals = property(num_plurals, doc="""\
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
463 The number of plurals used by the catalog or locale.
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
464
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
465 >>> Catalog(locale='en').num_plurals
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
466 2
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
467 >>> Catalog(locale='ga').num_plurals
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
468 3
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
469
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
470 :type: `int`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
471 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
472
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
473 def plural_expr(self):
381
6a0e7205790f Ported [407:415/trunk] back to 0.9.x branch.
cmlenz
parents: 371
diff changeset
474 if self._plural_expr is None:
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
475 expr = '(n != 1)'
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
476 if self.locale:
381
6a0e7205790f Ported [407:415/trunk] back to 0.9.x branch.
cmlenz
parents: 371
diff changeset
477 expr = get_plural(self.locale)[1]
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
478 self._plural_expr = expr
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
479 return self._plural_expr
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
480 plural_expr = property(plural_expr, doc="""\
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
481 The plural expression used by the catalog or locale.
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
482
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
483 >>> Catalog(locale='en').plural_expr
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
484 '(n != 1)'
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
485 >>> Catalog(locale='ga').plural_expr
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
486 '(n==1 ? 0 : n==2 ? 1 : 2)'
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
487
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
488 :type: `basestring`
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
489 """)
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
490
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
491 def plural_forms(self):
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
492 return 'nplurals=%s; plural=%s' % (self.num_plurals, self.plural_expr)
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
493 plural_forms = property(plural_forms, doc="""\
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
494 Return the plural forms declaration for the locale.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
495
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
496 >>> Catalog(locale='en').plural_forms
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
497 'nplurals=2; plural=(n != 1)'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
498 >>> Catalog(locale='pt_BR').plural_forms
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
499 'nplurals=2; plural=(n > 1)'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
500
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
501 :type: `str`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
502 """)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
503
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
504 def __contains__(self, id):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
505 """Return whether the catalog has a message with the specified ID."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
506 return self._key_for(id) in self._messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
507
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
508 def __len__(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
509 """The number of messages in the catalog.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
510
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
511 This does not include the special ``msgid ""`` entry.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
512 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
513 return len(self._messages)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
514
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
515 def __iter__(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
516 """Iterates through all the entries in the catalog, in the order they
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
517 were added, yielding a `Message` object for every entry.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
518
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
519 :rtype: ``iterator``
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
520 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
521 buf = []
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
522 for name, value in self.mime_headers:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
523 buf.append('%s: %s' % (name, value))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
524 flags = set()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
525 if self.fuzzy:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
526 flags |= set(['fuzzy'])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
527 yield Message(u'', '\n'.join(buf), flags=flags)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
528 for key in self._messages:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
529 yield self._messages[key]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
530
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
531 def __repr__(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
532 locale = ''
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
533 if self.locale:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
534 locale = ' %s' % self.locale
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
535 return '<%s %r%s>' % (type(self).__name__, self.domain, locale)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
536
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
537 def __delitem__(self, id):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
538 """Delete the message with the specified ID."""
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
539 key = self._key_for(id)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
540 if key in self._messages:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
541 del self._messages[key]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
542
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
543 def __getitem__(self, id):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
544 """Return the message with the specified ID.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
545
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
546 :param id: the message ID
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
547 :return: the message with the specified ID, or `None` if no such message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
548 is in the catalog
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
549 :rtype: `Message`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
550 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
551 return self._messages.get(self._key_for(id))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
552
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
553 def __setitem__(self, id, message):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
554 """Add or update the message with the specified ID.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
555
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
556 >>> catalog = Catalog()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
557 >>> catalog[u'foo'] = Message(u'foo')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
558 >>> catalog[u'foo']
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
559 <Message u'foo' (flags: [])>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
560
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
561 If a message with that ID is already in the catalog, it is updated
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
562 to include the locations and flags of the new message.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
563
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
564 >>> catalog = Catalog()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
565 >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
566 >>> catalog[u'foo'].locations
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
567 [('main.py', 1)]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
568 >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
569 >>> catalog[u'foo'].locations
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
570 [('main.py', 1), ('utils.py', 5)]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
571
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
572 :param id: the message ID
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
573 :param message: the `Message` object
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
574 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
575 assert isinstance(message, Message), 'expected a Message object'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
576 key = self._key_for(id)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
577 current = self._messages.get(key)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
578 if current:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
579 if message.pluralizable and not current.pluralizable:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
580 # The new message adds pluralization
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
581 current.id = message.id
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
582 current.string = message.string
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
583 current.locations = list(distinct(current.locations +
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
584 message.locations))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
585 current.auto_comments = list(distinct(current.auto_comments +
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
586 message.auto_comments))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
587 current.user_comments = list(distinct(current.user_comments +
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
588 message.user_comments))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
589 current.flags |= message.flags
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
590 message = current
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
591 elif id == '':
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
592 # special treatment for the header message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
593 headers = message_from_string(message.string.encode(self.charset))
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
594 self.mime_headers = headers.items()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
595 self.header_comment = '\n'.join(['# %s' % comment for comment
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
596 in message.user_comments])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
597 self.fuzzy = message.fuzzy
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
598 else:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
599 if isinstance(id, (list, tuple)):
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
600 assert isinstance(message.string, (list, tuple)), \
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
601 'Expected sequence but got %s' % type(message.string)
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
602 self._messages[key] = message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
603
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
604 def add(self, id, string=None, locations=(), flags=(), auto_comments=(),
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
605 user_comments=(), previous_id=(), lineno=None):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
606 """Add or update the message with the specified ID.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
607
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
608 >>> catalog = Catalog()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
609 >>> catalog.add(u'foo')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
610 >>> catalog[u'foo']
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
611 <Message u'foo' (flags: [])>
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
612
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
613 This method simply constructs a `Message` object with the given
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
614 arguments and invokes `__setitem__` with that object.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
615
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
616 :param id: the message ID, or a ``(singular, plural)`` tuple for
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
617 pluralizable messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
618 :param string: the translated message string, or a
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
619 ``(singular, plural)`` tuple for pluralizable messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
620 :param locations: a sequence of ``(filenname, lineno)`` tuples
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
621 :param flags: a set or sequence of flags
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
622 :param auto_comments: a sequence of automatic comments
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
623 :param user_comments: a sequence of user comments
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
624 :param previous_id: the previous message ID, or a ``(singular, plural)``
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
625 tuple for pluralizable messages
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
626 :param lineno: the line number on which the msgid line was found in the
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
627 PO file, if any
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
628 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
629 self[id] = Message(id, string, list(locations), flags, auto_comments,
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
630 user_comments, previous_id, lineno=lineno)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
631
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
632 def check(self):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
633 """Run various validation checks on the translations in the catalog.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
634
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
635 For every message which fails validation, this method yield a
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
636 ``(message, errors)`` tuple, where ``message`` is the `Message` object
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
637 and ``errors`` is a sequence of `TranslationError` objects.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
638
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
639 :rtype: ``iterator``
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
640 """
371
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
641 for message in self._messages.values():
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
642 errors = message.check(catalog=self)
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
643 if errors:
4b63ce84c6ae Ported [388:405/trunk] to 0.9.x branch.
cmlenz
parents: 348
diff changeset
644 yield message, errors
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
645
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
646 def update(self, template, no_fuzzy_matching=False):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
647 """Update the catalog based on the given template catalog.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
648
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
649 >>> from babel.messages import Catalog
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
650 >>> template = Catalog()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
651 >>> template.add('green', locations=[('main.py', 99)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
652 >>> template.add('blue', locations=[('main.py', 100)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
653 >>> template.add(('salad', 'salads'), locations=[('util.py', 42)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
654 >>> catalog = Catalog(locale='de_DE')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
655 >>> catalog.add('blue', u'blau', locations=[('main.py', 98)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
656 >>> catalog.add('head', u'Kopf', locations=[('util.py', 33)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
657 >>> catalog.add(('salad', 'salads'), (u'Salat', u'Salate'),
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
658 ... locations=[('util.py', 38)])
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
659
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
660 >>> catalog.update(template)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
661 >>> len(catalog)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
662 3
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
663
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
664 >>> msg1 = catalog['green']
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
665 >>> msg1.string
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
666 >>> msg1.locations
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
667 [('main.py', 99)]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
668
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
669 >>> msg2 = catalog['blue']
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
670 >>> msg2.string
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
671 u'blau'
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
672 >>> msg2.locations
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
673 [('main.py', 100)]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
674
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
675 >>> msg3 = catalog['salad']
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
676 >>> msg3.string
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
677 (u'Salat', u'Salate')
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
678 >>> msg3.locations
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
679 [('util.py', 42)]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
680
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
681 Messages that are in the catalog but not in the template are removed
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
682 from the main collection, but can still be accessed via the `obsolete`
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
683 member:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
684
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
685 >>> 'head' in catalog
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
686 False
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
687 >>> catalog.obsolete.values()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
688 [<Message 'head' (flags: [])>]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
689
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
690 :param template: the reference catalog, usually read from a POT file
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
691 :param no_fuzzy_matching: whether to use fuzzy matching of message IDs
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
692 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
693 messages = self._messages
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
694 remaining = messages.copy()
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
695 self._messages = odict()
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
696
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
697 # Prepare for fuzzy matching
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
698 fuzzy_candidates = []
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
699 if not no_fuzzy_matching:
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
700 fuzzy_candidates = [
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
701 self._key_for(msgid) for msgid in messages
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
702 if msgid and messages[msgid].string
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
703 ]
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
704 fuzzy_matches = set()
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
705
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
706 def _merge(message, oldkey, newkey):
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
707 message = message.clone()
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
708 fuzzy = False
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
709 if oldkey != newkey:
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
710 fuzzy = True
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
711 fuzzy_matches.add(oldkey)
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
712 oldmsg = messages.get(oldkey)
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
713 if isinstance(oldmsg.id, basestring):
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
714 message.previous_id = [oldmsg.id]
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
715 else:
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
716 message.previous_id = list(oldmsg.id)
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
717 else:
348
05975a0e7021 Merged revisions [358:360], [364:370], [373:378], [380:382] from [source:trunk].
cmlenz
parents: 316
diff changeset
718 oldmsg = remaining.pop(oldkey, None)
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
719 message.string = oldmsg.string
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
720 if isinstance(message.id, (list, tuple)):
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
721 if not isinstance(message.string, (list, tuple)):
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
722 fuzzy = True
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
723 message.string = tuple(
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
724 [message.string] + ([u''] * (len(message.id) - 1))
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
725 )
454
8941027e8b22 Merged revisions 467 via svnmerge from
jruigrok
parents: 381
diff changeset
726 elif len(message.string) != self.num_plurals:
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
727 fuzzy = True
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
728 message.string = tuple(message.string[:len(oldmsg.string)])
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
729 elif isinstance(message.string, (list, tuple)):
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
730 fuzzy = True
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
731 message.string = message.string[0]
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
732 message.flags |= oldmsg.flags
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
733 if fuzzy:
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
734 message.flags |= set([u'fuzzy'])
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
735 self[message.id] = message
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
736
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
737 for message in template:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
738 if message.id:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
739 key = self._key_for(message.id)
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
740 if key in messages:
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
741 _merge(message, key, key)
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
742 else:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
743 if no_fuzzy_matching is False:
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
744 # do some fuzzy matching with difflib
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
745 matches = get_close_matches(key.lower().strip(),
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
746 fuzzy_candidates, 1)
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
747 if matches:
280
65c6ca63aca3 Ported [305] to 0.9.x branch.
cmlenz
parents: 263
diff changeset
748 _merge(message, matches[0], key)
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
749 continue
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
750
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
751 self[message.id] = message
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
752
316
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
753 self.obsolete = odict()
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
754 for msgid in remaining:
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
755 if no_fuzzy_matching or msgid not in fuzzy_matches:
9121183df490 Ported [346] and [347] to 0.9.x branch.
cmlenz
parents: 295
diff changeset
756 self.obsolete[msgid] = remaining[msgid]
474
c40f442c22b7 Merged revisions 460-461 via svnmerge from
jruigrok
parents: 454
diff changeset
757 # Make updated catalog's POT-Creation-Date equal to the template
c40f442c22b7 Merged revisions 460-461 via svnmerge from
jruigrok
parents: 454
diff changeset
758 # used to update the catalog
c40f442c22b7 Merged revisions 460-461 via svnmerge from
jruigrok
parents: 454
diff changeset
759 self.creation_date = template.creation_date
263
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
760
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
761 def _key_for(self, id):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
762 """The key for a message is just the singular ID even for pluralizable
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
763 messages.
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
764 """
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
765 key = id
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
766 if isinstance(key, (list, tuple)):
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
767 key = id[0]
5b7d3f9f7d74 Create branch for 0.9.x maintenance.
cmlenz
parents:
diff changeset
768 return key
Copyright (C) 2012-2017 Edgewall Software