annotate babel/messages/catalog.py @ 109:7a5a7bf39d3d

Minor doc improvements.
author cmlenz
date Thu, 14 Jun 2007 10:05:47 +0000
parents 8ea225f33f28
children 03f106700f02
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
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
17 from email import message_from_string
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
18 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
19 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
20 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
21 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
22 from sets import Set as set
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
23 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
24
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
25 from babel import __version__ as VERSION
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
26 from babel.core import Locale
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
27 from babel.messages.plurals import PLURALS
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
28 from babel.util import odict, LOCALTZ, UTC, FixedOffsetTimezone
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
29
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 __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
31 __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
32
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 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
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
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 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
37 """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
38
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
39 def __init__(self, id, string='', locations=(), flags=(), auto_comments=(),
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
40 user_comments=()):
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
41 """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
42
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 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
44 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 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
46 ``(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
47 :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
48 :param flags: a set or sequence of flags
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
49 :param auto_comments: a sequence of automatic comments for the message
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
50 :param user_comments: a sequence of user comments for the message
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
51 """
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
52 self.id = id #: The message ID
70
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
53 if not string and self.pluralizable:
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
54 string = (u'', u'')
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
55 self.string = string #: The message translation
72
f5a6bf38df89 Fix for mixed singular/plural messages, follow-up to [70].
cmlenz
parents: 71
diff changeset
56 self.locations = list(locations)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
57 self.flags = set(flags)
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
58 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
59 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
60 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
61 self.flags.discard('python-format')
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
62 self.auto_comments = list(auto_comments)
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
63 self.user_comments = list(user_comments)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
64
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
65 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
66 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
67
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
68 def fuzzy(self):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
69 return 'fuzzy' in self.flags
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
70 fuzzy = property(fuzzy, doc="""\
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
71 Whether the translation is fuzzy.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
72
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
73 >>> Message('foo').fuzzy
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
74 False
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
75 >>> Message('foo', 'foo', flags=['fuzzy']).fuzzy
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
76 True
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
77
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
78 :type: `bool`
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
79 """)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
80
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
81 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
82 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
83 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
84 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
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 >>> 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
87 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
88 >>> 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
89 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
90
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
91 :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
92 """)
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 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
95 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
96 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
97 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
98 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
99 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
100 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
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 >>> 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
103 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
104 >>> 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
105 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
106
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
107 :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
108 """)
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
109
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
110
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
111 DEFAULT_HEADER = u"""\
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
112 # Translations template for PROJECT.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
113 # Copyright (C) YEAR COPYRIGHT HOLDER
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
114 # This file is distributed under the same license as the PROJECT project.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
115 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
116 #"""
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
117
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
118 class Catalog(object):
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
119 """Representation of a message catalog."""
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
120
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
121 def __init__(self, locale=None, domain=None, header_comment=DEFAULT_HEADER,
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
122 project=None, version=None, copyright_holder=None,
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
123 msgid_bugs_address=None, creation_date=None,
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
124 revision_date=None, last_translator=None, charset='utf-8'):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
125 """Initialize the catalog object.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
126
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
127 :param locale: the locale identifier or `Locale` object, or `None`
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
128 if the catalog is not bound to a locale (which basically
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
129 means it's a template)
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
130 :param domain: the message domain
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
131 :param header_comment: the header comment as string, or `None` for the
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
132 default header
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
133 :param project: the project's name
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
134 :param version: the project's version
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
135 :param copyright_holder: the copyright holder of the catalog
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
136 :param msgid_bugs_address: the email address or URL to submit bug
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
137 reports to
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
138 :param creation_date: the date the catalog was created
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
139 :param revision_date: the date the catalog was revised
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
140 :param last_translator: the name and email of the last translator
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
141 :param charset: the encoding to use in the output
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
142 """
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
143 self.domain = domain #: The message domain
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
144 if locale:
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
145 locale = Locale.parse(locale)
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
146 self.locale = locale #: The locale or `None`
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
147 self._header_comment = header_comment
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
148 self._messages = odict()
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
149
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
150 self.project = project or 'PROJECT' #: The project name
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
151 self.version = version or 'VERSION' #: The project version
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
152 self.copyright_holder = copyright_holder or 'ORGANIZATION'
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
153 self.msgid_bugs_address = msgid_bugs_address or 'EMAIL@ADDRESS'
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
154
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
155 self.last_translator = last_translator or 'FULL NAME <EMAIL@ADDRESS>'
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
156 """Name and email address of the last translator."""
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
157
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
158 self.charset = charset or 'utf-8'
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
159
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
160 if creation_date is None:
99
b6b5992daa6c Renamed `LOCAL` to `LOCALTZ`.
cmlenz
parents: 97
diff changeset
161 creation_date = datetime.now(LOCALTZ)
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
162 elif isinstance(creation_date, datetime) and not creation_date.tzinfo:
99
b6b5992daa6c Renamed `LOCAL` to `LOCALTZ`.
cmlenz
parents: 97
diff changeset
163 creation_date = creation_date.replace(tzinfo=LOCALTZ)
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
164 self.creation_date = creation_date #: Creation date of the template
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
165 if revision_date is None:
99
b6b5992daa6c Renamed `LOCAL` to `LOCALTZ`.
cmlenz
parents: 97
diff changeset
166 revision_date = datetime.now(LOCALTZ)
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
167 elif isinstance(revision_date, datetime) and not revision_date.tzinfo:
99
b6b5992daa6c Renamed `LOCAL` to `LOCALTZ`.
cmlenz
parents: 97
diff changeset
168 revision_date = revision_date.replace(tzinfo=LOCALTZ)
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
169 self.revision_date = revision_date #: Last revision date of the catalog
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
170
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
171 def _get_header_comment(self):
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
172 comment = self._header_comment
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
173 comment = comment.replace('PROJECT', self.project) \
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
174 .replace('VERSION', self.version) \
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
175 .replace('YEAR', self.revision_date.strftime('%Y')) \
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
176 .replace('COPYRIGHT HOLDER', self.copyright_holder)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
177 if self.locale:
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
178 comment = comment.replace('Translations template', '%s translations'
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
179 % self.locale.english_name)
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
180 return comment
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
181 def _set_header_comment(self, string):
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
182 self._header_comment = string
109
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
183
7a5a7bf39d3d Minor doc improvements.
cmlenz
parents: 108
diff changeset
184 header_comment = property(_get_header_comment, _set_header_comment, doc="""\
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
185 The header comment for the catalog.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
186
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
187 >>> catalog = Catalog(project='Foobar', version='1.0',
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
188 ... copyright_holder='Foo Company')
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
189 >>> print catalog.header_comment
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
190 # Translations template for Foobar.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
191 # Copyright (C) 2007 Foo Company
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
192 # This file is distributed under the same license as the Foobar project.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
193 # FIRST AUTHOR <EMAIL@ADDRESS>, 2007.
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
194 #
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
195
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
196 :type: `unicode`
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
197 """)
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
198
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
199 def _get_mime_headers(self):
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
200 headers = []
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
201 headers.append(('Project-Id-Version',
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
202 '%s %s' % (self.project, self.version)))
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
203 headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address))
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
204 headers.append(('POT-Creation-Date',
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
205 self.creation_date.strftime('%Y-%m-%d %H:%M%z')))
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
206 if self.locale is None:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
207 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
208 headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
209 headers.append(('Language-Team', 'LANGUAGE <LL@li.org>'))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
210 else:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
211 headers.append(('PO-Revision-Date',
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
212 self.revision_date.strftime('%Y-%m-%d %H:%M%z')))
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
213 headers.append(('Last-Translator', self.last_translator))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
214 headers.append(('Language-Team', '%s <LL@li.org>' % self.locale))
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
215 headers.append(('Plural-Forms', self.plural_forms))
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
216 headers.append(('MIME-Version', '1.0'))
70
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
217 headers.append(('Content-Type',
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
218 'text/plain; charset=%s' % self.charset))
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
219 headers.append(('Content-Transfer-Encoding', '8bit'))
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
220 headers.append(('Generated-By', 'Babel %s\n' % VERSION))
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
221 return headers
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
222
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
223 def _set_mime_headers(self, headers):
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
224 for name, value in headers:
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
225 name = name.lower()
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
226 if name == 'project-id-version':
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
227 parts = value.split(' ')
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
228 self.project = ' '.join(parts[:-1])
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
229 self.version = parts[-1]
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
230 elif name == 'report-msgid-bugs-to':
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
231 self.msgid_bugs_address = value
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
232 elif name == 'last-translator':
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
233 self.last_translator = value
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
234 elif name == 'pot-creation-date':
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
235 # FIXME: this should use dates.parse_datetime as soon as that
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
236 # is ready
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
237 value, tzoffset, _ = re.split('[+-](\d{4})$', value, 1)
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
238 tt = time.strptime(value, '%Y-%m-%d %H:%M')
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
239 ts = time.mktime(tt)
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
240 tzoffset = FixedOffsetTimezone(int(tzoffset))
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
241 self.creation_date = datetime.fromtimestamp(ts, tzoffset)
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
242
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
243 mime_headers = property(_get_mime_headers, _set_mime_headers, doc="""\
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
244 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
245
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
246 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
247 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
248 for actual translations.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
249
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
250 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
251
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
252 >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC)
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
253 >>> catalog = Catalog(project='Foobar', version='1.0',
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
254 ... creation_date=created)
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
255 >>> for name, value in catalog.mime_headers:
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
256 ... print '%s: %s' % (name, value)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
257 Project-Id-Version: Foobar 1.0
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
258 Report-Msgid-Bugs-To: EMAIL@ADDRESS
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
259 POT-Creation-Date: 1990-04-01 15:30+0000
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
260 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
261 Last-Translator: FULL NAME <EMAIL@ADDRESS>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
262 Language-Team: LANGUAGE <LL@li.org>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
263 MIME-Version: 1.0
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
264 Content-Type: text/plain; charset=utf-8
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
265 Content-Transfer-Encoding: 8bit
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
266 Generated-By: Babel ...
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
267
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
268 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
269
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
270 >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC)
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
271 >>> catalog = Catalog(locale='de_DE', project='Foobar', version='1.0',
97
debd9ac3bb4d Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents: 89
diff changeset
272 ... creation_date=created, revision_date=revised,
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
273 ... last_translator='John Doe <jd@example.com>')
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
274 >>> for name, value in catalog.mime_headers:
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
275 ... print '%s: %s' % (name, value)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
276 Project-Id-Version: Foobar 1.0
80
8e2e9d549693 Fixed the plurals header on `Catalog` which should only be written if it's not a catalog template.
palgarvio
parents: 72
diff changeset
277 Report-Msgid-Bugs-To: EMAIL@ADDRESS
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
278 POT-Creation-Date: 1990-04-01 15:30+0000
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
279 PO-Revision-Date: 1990-08-03 12:00+0000
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
280 Last-Translator: John Doe <jd@example.com>
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
281 Language-Team: de_DE <LL@li.org>
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
282 Plural-Forms: nplurals=2; plural=(n != 1)
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
283 MIME-Version: 1.0
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
284 Content-Type: text/plain; charset=utf-8
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
285 Content-Transfer-Encoding: 8bit
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
286 Generated-By: Babel ...
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
287
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
288 :type: `list`
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
289 """)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
290
70
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
291 def num_plurals(self):
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
292 num = 2
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
293 if self.locale:
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
294 if str(self.locale) in PLURALS:
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
295 num = PLURALS[str(self.locale)][0]
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
296 elif self.locale.language in PLURALS:
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
297 num = PLURALS[self.locale.language][0]
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
298 return num
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
299 num_plurals = property(num_plurals, doc="""\
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
300 The number of plurals used by the locale.
105
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
301
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
302 >>> Catalog(locale='en').num_plurals
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
303 2
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
304 >>> Catalog(locale='cs_CZ').num_plurals
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
305 3
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
306
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
307 :type: `int`
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
308 """)
70
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
309
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
310 def plural_forms(self):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
311 num, expr = ('INTEGER', 'EXPRESSION')
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
312 if self.locale:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
313 if str(self.locale) in PLURALS:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
314 num, expr = PLURALS[str(self.locale)]
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
315 elif self.locale.language in PLURALS:
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
316 num, expr = PLURALS[self.locale.language]
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
317 return 'nplurals=%s; plural=%s' % (num, expr)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
318 plural_forms = property(plural_forms, doc="""\
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
319 Return the plural forms declaration for the locale.
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
320
105
abd3a594dab4 Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents: 99
diff changeset
321 >>> Catalog(locale='en').plural_forms
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
322 'nplurals=2; plural=(n != 1)'
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
323 >>> Catalog(locale='pt_BR').plural_forms
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
324 'nplurals=2; plural=(n > 1)'
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
325
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
326 :type: `str`
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
327 """)
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
328
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
329 def __contains__(self, id):
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
330 """Return whether the catalog has a message with the specified ID."""
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
331 return self._key_for(id) in self._messages
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
332
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
333 def __len__(self):
86
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
334 """The number of messages in the catalog.
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
335
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
336 This does not include the special ``msgid ""`` entry.
8a703ecdba91 Some cosmetic changes for the new translator comments support.
cmlenz
parents: 82
diff changeset
337 """
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
338 return len(self._messages)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
339
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
340 def __iter__(self):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
341 """Iterates through all the entries in the catalog, in the order they
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
342 were added, yielding a `Message` object for every entry.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
343
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
344 :rtype: ``iterator``
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
345 """
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
346 buf = []
106
2a00e352c986 Merged `write_pot` and `write_po` functions by moving more functionality to the `Catalog` class. This is certainly not perfect yet, but moves us in the right direction.
cmlenz
parents: 105
diff changeset
347 for name, value in self.mime_headers:
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
348 buf.append('%s: %s' % (name, value))
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
349 yield Message('', '\n'.join(buf), flags=set(['fuzzy']))
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
350 for key in self._messages:
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
351 yield self._messages[key]
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
352
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
353 def __repr__(self):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
354 locale = ''
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
355 if self.locale:
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
356 locale = ' %s' % self.locale
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
357 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
358
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
359 def __delitem__(self, id):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
360 """Delete the message with the specified ID."""
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
361 key = self._key_for(id)
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
362 if key in self._messages:
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
363 del self._messages[key]
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
364
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
365 def __getitem__(self, id):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
366 """Return the message with the specified ID.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
367
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
368 :param id: the message ID
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
369 :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
370 is in the catalog
69
1d8e81bfedf9 Enhance catalog to also manage the MIME headers.
cmlenz
parents: 66
diff changeset
371 :rtype: `Message`
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
372 """
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
373 return self._messages.get(self._key_for(id))
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
374
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
375 def __setitem__(self, id, message):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
376 """Add or update the message with the specified ID.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
377
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
378 >>> catalog = Catalog()
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
379 >>> catalog[u'foo'] = Message(u'foo')
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
380 >>> catalog[u'foo']
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
381 <Message u'foo'>
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
382
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
383 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
384 to include the locations and flags of the new message.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
385
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
386 >>> catalog = Catalog()
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
387 >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)])
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
388 >>> catalog[u'foo'].locations
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
389 [('main.py', 1)]
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
390 >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)])
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
391 >>> catalog[u'foo'].locations
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
392 [('main.py', 1), ('utils.py', 5)]
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
393
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
394 :param id: the message ID
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
395 :param message: the `Message` object
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
396 """
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
397 assert isinstance(message, Message), 'expected a Message object'
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
398 key = self._key_for(id)
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
399 current = self._messages.get(key)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
400 if current:
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
401 if message.pluralizable and not current.pluralizable:
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
402 # The new message adds pluralization
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
403 current.id = message.id
72
f5a6bf38df89 Fix for mixed singular/plural messages, follow-up to [70].
cmlenz
parents: 71
diff changeset
404 current.string = message.string
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
405 current.locations.extend(message.locations)
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
406 current.auto_comments.extend(message.auto_comments)
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
407 current.user_comments.extend(message.user_comments)
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
408 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
409 message = current
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
410 elif id == '':
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
411 # special treatment for the header message
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
412 headers = message_from_string(message.string.encode(self.charset))
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
413 self.mime_headers = headers.items()
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
414 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
415 if isinstance(id, (list, tuple)):
70
620fdd25657a Add back POT header broken in previous check-in.
cmlenz
parents: 69
diff changeset
416 assert isinstance(message.string, (list, tuple))
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
417 self._messages[key] = message
58
068952b4d4c0 Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff changeset
418
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
419 def add(self, id, string=None, locations=(), flags=(), auto_comments=(),
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
420 user_comments=()):
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
421 """Add or update the message with the specified ID.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
422
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
423 >>> catalog = Catalog()
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
424 >>> catalog.add(u'foo')
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
425 >>> catalog[u'foo']
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
426 <Message u'foo'>
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
427
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
428 This method simply constructs a `Message` object with the given
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
429 arguments and invokes `__setitem__` with that object.
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
430
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
431 :param id: the message ID, or a ``(singular, plural)`` tuple for
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
432 pluralizable messages
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
433 :param string: the translated message string, or a
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
434 ``(singular, plural)`` tuple for pluralizable messages
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
435 :param locations: a sequence of ``(filenname, lineno)`` tuples
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
436 :param flags: a set or sequence of flags
108
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
437 :param auto_comments: a sequence of automatic comments
8ea225f33f28 Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents: 107
diff changeset
438 :param user_comments: a sequence of user comments
66
d1a7425739d3 `read_po` now returns a `Catalog`.
cmlenz
parents: 63
diff changeset
439 """
107
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
440 self[id] = Message(id, string, list(locations), flags, auto_comments,
4b42e23644e5 `Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents: 106
diff changeset
441 user_comments)
71
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
442
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
443 def _key_for(self, id):
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
444 """The key for a message is just the singular ID even for pluralizable
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
445 messages.
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
446 """
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
447 key = id
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
448 if isinstance(key, (list, tuple)):
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
449 key = id[0]
b260ffa01a2d Message catalogs can have multiple messages with the same ID, where some of them have plural strings, and others don't. Still the same message.
cmlenz
parents: 70
diff changeset
450 return key
Copyright (C) 2012-2017 Edgewall Software