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