annotate babel/messages/catalog.py @ 106:2cd83f77cc98 trunk

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