Mercurial > babel > old > babel-test
annotate babel/messages/catalog.py @ 352:20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
author | aronacher |
---|---|
date | Tue, 17 Jun 2008 19:54:34 +0000 |
parents | 7215876bdf89 |
children | 1355e4014496 |
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 # |
335 | 3 # Copyright (C) 2007-2008 Edgewall Software |
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
|
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 |
149
ba5150e9544e
Respect charset specified in PO headers in `read_po()`. Fixes #17.
cmlenz
parents:
131
diff
changeset
|
16 from cgi import parse_header |
67 | 17 from datetime import datetime |
165
650a6e996ede
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
163
diff
changeset
|
18 from difflib import get_close_matches |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
19 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
|
20 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
|
21 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
|
22 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
|
23 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
|
24 from sets import Set as set |
67 | 25 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
|
26 |
67 | 27 from babel import __version__ as VERSION |
64 | 28 from babel.core import Locale |
131
a63812008056
Use `dates.format_datetime` for dates in PO(T) header, as `datetime.strftime` produces wrong results on windows.
cmlenz
parents:
121
diff
changeset
|
29 from babel.dates import format_datetime |
67 | 30 from babel.messages.plurals import PLURALS |
351
7215876bdf89
Added `validate_format helper function to `babel.support`.
aronacher
parents:
350
diff
changeset
|
31 from babel.util import odict, distinct, LOCALTZ, UTC, FixedOffsetTimezone, \ |
7215876bdf89
Added `validate_format helper function to `babel.support`.
aronacher
parents:
350
diff
changeset
|
32 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
|
33 |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
34 __all__ = ['Message', 'Catalog', 'TranslationError'] |
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
|
35 __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
|
36 |
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 |
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 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
|
39 """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
|
40 |
149
ba5150e9544e
Respect charset specified in PO headers in `read_po()`. Fixes #17.
cmlenz
parents:
131
diff
changeset
|
41 def __init__(self, id, string=u'', locations=(), flags=(), auto_comments=(), |
335 | 42 user_comments=(), previous_id=(), lineno=None, context=None): |
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
|
43 """Create the message object. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
44 |
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
|
45 :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
|
46 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 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
|
48 ``(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
|
49 :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
|
50 :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
|
51 :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
|
52 :param user_comments: a sequence of user comments for the message |
203 | 53 :param previous_id: the previous message ID, or a ``(singular, plural)`` |
54 tuple for pluralizable messages | |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
55 :param lineno: the line number on which the msgid line was found in the |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
56 PO file, if any |
335 | 57 :param context: the message context |
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
|
58 """ |
107 | 59 self.id = id #: The message ID |
68 | 60 if not string and self.pluralizable: |
61 string = (u'', u'') | |
107 | 62 self.string = string #: The message translation |
229 | 63 self.locations = list(distinct(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
|
64 self.flags = set(flags) |
67 | 65 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
|
66 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
|
67 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
|
68 self.flags.discard('python-format') |
227 | 69 self.auto_comments = list(distinct(auto_comments)) |
70 self.user_comments = list(distinct(user_comments)) | |
203 | 71 if isinstance(previous_id, basestring): |
72 self.previous_id = [previous_id] | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
73 else: |
203 | 74 self.previous_id = list(previous_id) |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
75 self.lineno = lineno |
335 | 76 self.context = context |
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
|
77 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
78 def __repr__(self): |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
79 return '<%s %r (flags: %r)>' % (type(self).__name__, self.id, |
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
80 list(self.flags)) |
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 |
248
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
82 def __cmp__(self, obj): |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
83 """Compare Messages, taking into account plural ids""" |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
84 if isinstance(obj, Message): |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
85 plural = self.pluralizable |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
86 obj_plural = obj.pluralizable |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
87 if plural and obj_plural: |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
88 return cmp(self.id[0], obj.id[0]) |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
89 elif plural: |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
90 return cmp(self.id[0], obj.id) |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
91 elif obj_plural: |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
92 return cmp(self.id, obj.id[0]) |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
93 return cmp(self.id, obj.id) |
bedaaeadc1db
add a __cmp__ to Message that correctly sorts by id, taking into account plurals
pjenvey
parents:
229
diff
changeset
|
94 |
313
559c80b1ffb2
Merging catalogs would sometimes mix translations from different runs.
cmlenz
parents:
312
diff
changeset
|
95 def clone(self): |
559c80b1ffb2
Merging catalogs would sometimes mix translations from different runs.
cmlenz
parents:
312
diff
changeset
|
96 return Message(self.id, self.string, self.locations, self.flags, |
559c80b1ffb2
Merging catalogs would sometimes mix translations from different runs.
cmlenz
parents:
312
diff
changeset
|
97 self.auto_comments, self.user_comments, |
335 | 98 self.previous_id, self.lineno, self.context) |
313
559c80b1ffb2
Merging catalogs would sometimes mix translations from different runs.
cmlenz
parents:
312
diff
changeset
|
99 |
67 | 100 def fuzzy(self): |
101 return 'fuzzy' in self.flags | |
102 fuzzy = property(fuzzy, doc="""\ | |
103 Whether the translation is fuzzy. | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
104 |
67 | 105 >>> Message('foo').fuzzy |
106 False | |
175
3c4718fb7435
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
165
diff
changeset
|
107 >>> msg = Message('foo', 'foo', flags=['fuzzy']) |
3c4718fb7435
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
165
diff
changeset
|
108 >>> msg.fuzzy |
67 | 109 True |
175
3c4718fb7435
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
165
diff
changeset
|
110 >>> msg |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
111 <Message 'foo' (flags: ['fuzzy'])> |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
112 |
67 | 113 :type: `bool` |
114 """) | |
115 | |
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
|
116 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
|
117 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
|
118 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
|
119 Whether the message is plurizable. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
120 |
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
|
121 >>> 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
|
122 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
|
123 >>> 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
|
124 True |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
125 |
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
|
126 :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
|
127 """) |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
128 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 ids = [ids] |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
133 return bool(filter(None, [PYTHON_FORMAT.search(id) for id in ids])) |
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
|
134 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
|
135 Whether the message contains Python-style parameters. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
136 |
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
|
137 >>> 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
|
138 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
|
139 >>> 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
|
140 True |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
141 |
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
|
142 :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
|
143 """) |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
144 |
105
f744dd56573d
`Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents:
104
diff
changeset
|
145 |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
146 class TranslationError(Exception): |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
147 """Exception thrown by translation checkers when invalid message |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
148 translations are encountered.""" |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
149 |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
150 |
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
|
151 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
|
152 # Translations template for PROJECT. |
120 | 153 # 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
|
154 # 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
|
155 # 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
|
156 #""" |
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
|
157 |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
158 |
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
|
159 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
|
160 """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
|
161 |
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
|
162 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
|
163 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
|
164 msgid_bugs_address=None, creation_date=None, |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
165 revision_date=None, last_translator=None, language_team=None, |
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
166 charset='utf-8', fuzzy=True): |
64 | 167 """Initialize the catalog object. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
168 |
64 | 169 :param locale: the locale identifier or `Locale` object, or `None` |
170 if the catalog is not bound to a locale (which basically | |
171 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
|
172 :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
|
173 :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
|
174 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
|
175 :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
|
176 :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
|
177 :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
|
178 :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
|
179 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
|
180 :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
|
181 :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
|
182 :param last_translator: the name and email of the last translator |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
183 :param language_team: the name and email of the language team |
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
|
184 :param charset: the encoding to use in the output |
175
3c4718fb7435
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
165
diff
changeset
|
185 :param fuzzy: the fuzzy bit on the catalog header |
64 | 186 """ |
107 | 187 self.domain = domain #: The message domain |
64 | 188 if locale: |
189 locale = Locale.parse(locale) | |
107 | 190 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
|
191 self._header_comment = header_comment |
67 | 192 self._messages = odict() |
193 | |
107 | 194 self.project = project or 'PROJECT' #: The project name |
195 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
|
196 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
|
197 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
|
198 |
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
199 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
|
200 """Name and email address of the last translator.""" |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
201 self.language_team = language_team or 'LANGUAGE <LL@li.org>' |
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
202 """Name and email address of the language team.""" |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
203 |
95
008cd3f7d485
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
87
diff
changeset
|
204 self.charset = charset or 'utf-8' |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
205 |
67 | 206 if creation_date is None: |
97 | 207 creation_date = datetime.now(LOCALTZ) |
95
008cd3f7d485
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
87
diff
changeset
|
208 elif isinstance(creation_date, datetime) and not creation_date.tzinfo: |
97 | 209 creation_date = creation_date.replace(tzinfo=LOCALTZ) |
107 | 210 self.creation_date = creation_date #: Creation date of the template |
67 | 211 if revision_date is None: |
97 | 212 revision_date = datetime.now(LOCALTZ) |
95
008cd3f7d485
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
87
diff
changeset
|
213 elif isinstance(revision_date, datetime) and not revision_date.tzinfo: |
97 | 214 revision_date = revision_date.replace(tzinfo=LOCALTZ) |
107 | 215 self.revision_date = revision_date #: Last revision date of the catalog |
181
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
216 self.fuzzy = fuzzy #: Catalog header fuzzy bit (`True` or `False`) |
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
217 |
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
218 self.obsolete = odict() #: Dictionary of obsolete messages |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
219 self._num_plurals = None |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
220 self._plural_expr = None |
67 | 221 |
107 | 222 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
|
223 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
|
224 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
|
225 .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
|
226 .replace('YEAR', self.revision_date.strftime('%Y')) \ |
120 | 227 .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
|
228 if self.locale: |
107 | 229 comment = comment.replace('Translations template', '%s translations' |
230 % 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
|
231 return comment |
120 | 232 |
107 | 233 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
|
234 self._header_comment = string |
107 | 235 |
236 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
|
237 The header comment for the catalog. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
238 |
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
|
239 >>> 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
|
240 ... copyright_holder='Foo Company') |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
241 >>> print catalog.header_comment #doctest: +ELLIPSIS |
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
|
242 # Translations template for Foobar. |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
243 # Copyright (C) ... Foo Company |
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
|
244 # This file is distributed under the same license as the Foobar project. |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
245 # FIRST AUTHOR <EMAIL@ADDRESS>, .... |
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
|
246 # |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
247 |
120 | 248 The header can also be set from a string. Any known upper-case variables |
249 will be replaced when the header is retrieved again: | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
250 |
120 | 251 >>> catalog = Catalog(project='Foobar', version='1.0', |
252 ... copyright_holder='Foo Company') | |
253 >>> catalog.header_comment = '''\\ | |
254 ... # The POT for my really cool PROJECT project. | |
255 ... # Copyright (C) 1990-2003 ORGANIZATION | |
256 ... # This file is distributed under the same license as the PROJECT | |
257 ... # project. | |
258 ... #''' | |
259 >>> print catalog.header_comment | |
260 # The POT for my really cool Foobar project. | |
261 # Copyright (C) 1990-2003 Foo Company | |
262 # This file is distributed under the same license as the Foobar | |
263 # project. | |
264 # | |
265 | |
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
|
266 :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
|
267 """) |
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
|
268 |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
269 def _get_mime_headers(self): |
67 | 270 headers = [] |
271 headers.append(('Project-Id-Version', | |
272 '%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
|
273 headers.append(('Report-Msgid-Bugs-To', self.msgid_bugs_address)) |
67 | 274 headers.append(('POT-Creation-Date', |
131
a63812008056
Use `dates.format_datetime` for dates in PO(T) header, as `datetime.strftime` produces wrong results on windows.
cmlenz
parents:
121
diff
changeset
|
275 format_datetime(self.creation_date, 'yyyy-MM-dd HH:mmZ', |
a63812008056
Use `dates.format_datetime` for dates in PO(T) header, as `datetime.strftime` produces wrong results on windows.
cmlenz
parents:
121
diff
changeset
|
276 locale='en'))) |
67 | 277 if self.locale is None: |
278 headers.append(('PO-Revision-Date', 'YEAR-MO-DA HO:MI+ZONE')) | |
279 headers.append(('Last-Translator', 'FULL NAME <EMAIL@ADDRESS>')) | |
280 headers.append(('Language-Team', 'LANGUAGE <LL@li.org>')) | |
281 else: | |
282 headers.append(('PO-Revision-Date', | |
131
a63812008056
Use `dates.format_datetime` for dates in PO(T) header, as `datetime.strftime` produces wrong results on windows.
cmlenz
parents:
121
diff
changeset
|
283 format_datetime(self.revision_date, |
a63812008056
Use `dates.format_datetime` for dates in PO(T) header, as `datetime.strftime` produces wrong results on windows.
cmlenz
parents:
121
diff
changeset
|
284 'yyyy-MM-dd HH:mmZ', locale='en'))) |
67 | 285 headers.append(('Last-Translator', self.last_translator)) |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
286 headers.append(('Language-Team', |
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
287 self.language_team.replace('LANGUAGE', |
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
288 str(self.locale)))) |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
289 headers.append(('Plural-Forms', self.plural_forms)) |
67 | 290 headers.append(('MIME-Version', '1.0')) |
68 | 291 headers.append(('Content-Type', |
292 'text/plain; charset=%s' % self.charset)) | |
67 | 293 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
|
294 headers.append(('Generated-By', 'Babel %s\n' % VERSION)) |
67 | 295 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
|
296 |
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
297 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
|
298 for name, value in headers: |
291 | 299 if name.lower() == 'content-type': |
210
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
300 mimetype, params = parse_header(value) |
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
301 if 'charset' in params: |
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
302 self.charset = params['charset'].lower() |
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
303 break |
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
304 for name, value in headers: |
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
305 name = name.lower().decode(self.charset) |
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
306 value = value.decode(self.charset) |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
307 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
|
308 parts = value.split(' ') |
210
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
309 self.project = u' '.join(parts[:-1]) |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 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
|
314 self.last_translator = value |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
315 elif name == 'language-team': |
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
316 self.language_team = value |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
317 elif name == 'plural-forms': |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
318 _, params = parse_header(' ;' + value) |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
319 self._num_plurals = int(params.get('nplurals', 2)) |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
320 self._plural_expr = params.get('plural', '(n != 1)') |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
321 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
|
322 # 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
|
323 # is ready |
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
324 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
|
325 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
|
326 ts = time.mktime(tt) |
120 | 327 tzoffset = FixedOffsetTimezone(int(tzoffset[:2]) * 60 + |
328 int(tzoffset[2:])) | |
121 | 329 dt = datetime.fromtimestamp(ts) |
330 self.creation_date = dt.replace(tzinfo=tzoffset) | |
106
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
331 |
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
332 mime_headers = property(_get_mime_headers, _set_mime_headers, doc="""\ |
67 | 333 The MIME headers of the catalog, used for the special ``msgid ""`` entry. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
334 |
67 | 335 The behavior of this property changes slightly depending on whether a locale |
336 is set or not, the latter indicating that the catalog is actually a template | |
337 for actual translations. | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
338 |
67 | 339 Here's an example of the output for such a catalog template: |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
340 |
95
008cd3f7d485
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
87
diff
changeset
|
341 >>> created = datetime(1990, 4, 1, 15, 30, tzinfo=UTC) |
67 | 342 >>> 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
|
343 ... 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
|
344 >>> for name, value in catalog.mime_headers: |
67 | 345 ... print '%s: %s' % (name, value) |
346 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
|
347 Report-Msgid-Bugs-To: EMAIL@ADDRESS |
67 | 348 POT-Creation-Date: 1990-04-01 15:30+0000 |
349 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE | |
350 Last-Translator: FULL NAME <EMAIL@ADDRESS> | |
351 Language-Team: LANGUAGE <LL@li.org> | |
352 MIME-Version: 1.0 | |
353 Content-Type: text/plain; charset=utf-8 | |
354 Content-Transfer-Encoding: 8bit | |
355 Generated-By: Babel ... | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
356 |
67 | 357 And here's an example of the output when the locale is set: |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
358 |
95
008cd3f7d485
Fix for #11 (use local timezone in timestamps of generated POT).
cmlenz
parents:
87
diff
changeset
|
359 >>> revised = datetime(1990, 8, 3, 12, 0, tzinfo=UTC) |
67 | 360 >>> 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
|
361 ... creation_date=created, revision_date=revised, |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
362 ... last_translator='John Doe <jd@example.com>', |
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
363 ... language_team='de_DE <de@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
|
364 >>> for name, value in catalog.mime_headers: |
67 | 365 ... print '%s: %s' % (name, value) |
366 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
|
367 Report-Msgid-Bugs-To: EMAIL@ADDRESS |
67 | 368 POT-Creation-Date: 1990-04-01 15:30+0000 |
369 PO-Revision-Date: 1990-08-03 12:00+0000 | |
370 Last-Translator: John Doe <jd@example.com> | |
206
2fe580515695
Preserve language-team header in catalogs on update. Closes #35 again.
cmlenz
parents:
203
diff
changeset
|
371 Language-Team: de_DE <de@example.com> |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
372 Plural-Forms: nplurals=2; plural=(n != 1) |
67 | 373 MIME-Version: 1.0 |
374 Content-Type: text/plain; charset=utf-8 | |
375 Content-Transfer-Encoding: 8bit | |
376 Generated-By: Babel ... | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
377 |
67 | 378 :type: `list` |
379 """) | |
380 | |
68 | 381 def num_plurals(self): |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
382 if not self._num_plurals: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
383 num = 2 |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
384 if self.locale: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
385 if str(self.locale) in PLURALS: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
386 num = PLURALS[str(self.locale)][0] |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
387 elif self.locale.language in PLURALS: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
388 num = PLURALS[self.locale.language][0] |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
389 self._num_plurals = num |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
390 return self._num_plurals |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
391 num_plurals = property(num_plurals, doc="""\ |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
392 The number of plurals used by the catalog or locale. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
393 |
103
7cdf89eb9007
Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents:
97
diff
changeset
|
394 >>> Catalog(locale='en').num_plurals |
7cdf89eb9007
Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents:
97
diff
changeset
|
395 2 |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
396 >>> Catalog(locale='ga').num_plurals |
103
7cdf89eb9007
Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents:
97
diff
changeset
|
397 3 |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
398 |
103
7cdf89eb9007
Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents:
97
diff
changeset
|
399 :type: `int` |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
400 """) |
68 | 401 |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
402 def plural_expr(self): |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
403 if not self._plural_expr: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
404 expr = '(n != 1)' |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
405 if self.locale: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
406 if str(self.locale) in PLURALS: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
407 expr = PLURALS[str(self.locale)][1] |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
408 elif self.locale.language in PLURALS: |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
409 expr = PLURALS[self.locale.language][1] |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
410 self._plural_expr = expr |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
411 return self._plural_expr |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
412 plural_expr = property(plural_expr, doc="""\ |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
413 The plural expression used by the catalog or locale. |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
414 |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
415 >>> Catalog(locale='en').plural_expr |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
416 '(n != 1)' |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
417 >>> Catalog(locale='ga').plural_expr |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
418 '(n==1 ? 0 : n==2 ? 1 : 2)' |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
419 |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
420 :type: `basestring` |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
421 """) |
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
422 |
67 | 423 def plural_forms(self): |
333
c5f215e893ef
Change Catalog class to retain the plural forms set in the MIME headers.
cmlenz
parents:
313
diff
changeset
|
424 return 'nplurals=%s; plural=%s' % (self.num_plurals, self.plural_expr) |
67 | 425 plural_forms = property(plural_forms, doc="""\ |
426 Return the plural forms declaration for the locale. | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
427 |
103
7cdf89eb9007
Implement wrapping of header comments in PO(T) output. Related to #14.
cmlenz
parents:
97
diff
changeset
|
428 >>> Catalog(locale='en').plural_forms |
67 | 429 'nplurals=2; plural=(n != 1)' |
430 >>> Catalog(locale='pt_BR').plural_forms | |
431 'nplurals=2; plural=(n > 1)' | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
432 |
67 | 433 :type: `str` |
434 """) | |
435 | |
436 def __contains__(self, id): | |
437 """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
|
438 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
|
439 |
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
|
440 def __len__(self): |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
441 """The number of messages in the catalog. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
442 |
84
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
443 This does not include the special ``msgid ""`` entry. |
4ff9cc26c11b
Some cosmetic changes for the new translator comments support.
cmlenz
parents:
80
diff
changeset
|
444 """ |
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
|
445 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
|
446 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
447 def __iter__(self): |
64 | 448 """Iterates through all the entries in the catalog, in the order they |
449 were added, yielding a `Message` object for every entry. | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
450 |
64 | 451 :rtype: ``iterator`` |
452 """ | |
67 | 453 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
|
454 for name, value in self.mime_headers: |
67 | 455 buf.append('%s: %s' % (name, value)) |
198
74a346c7846d
Correctly handle non-ASCII chars in the catalog MIME headers.
cmlenz
parents:
196
diff
changeset
|
456 flags = set() |
175
3c4718fb7435
Changed the `__repr__` output to include the flags(it can be changed back, but it was usefull to implement the fuzzy header parsing).
palgarvio
parents:
165
diff
changeset
|
457 if self.fuzzy: |
198
74a346c7846d
Correctly handle non-ASCII chars in the catalog MIME headers.
cmlenz
parents:
196
diff
changeset
|
458 flags |= set(['fuzzy']) |
210
6c8b69e150a9
When parsing catalog headers, look for the content-type first, to be able to use a specified encoding on all other headers.
cmlenz
parents:
206
diff
changeset
|
459 yield Message(u'', '\n'.join(buf), flags=flags) |
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
|
460 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
|
461 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
|
462 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
463 def __repr__(self): |
64 | 464 locale = '' |
465 if self.locale: | |
466 locale = ' %s' % self.locale | |
467 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
|
468 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
469 def __delitem__(self, id): |
64 | 470 """Delete the message with the specified ID.""" |
350 | 471 self.delete(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
|
472 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
473 def __getitem__(self, id): |
64 | 474 """Return the message with the specified ID. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
475 |
64 | 476 :param id: the message ID |
350 | 477 :return: the message with the specified ID, or `None` if no such |
478 message is in the catalog | |
67 | 479 :rtype: `Message` |
64 | 480 """ |
350 | 481 return self.get(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
|
482 |
27fba894d3ca
Add actual data structures for handling message catalogs, so that more code can be reused here between the frontends.
cmlenz
parents:
diff
changeset
|
483 def __setitem__(self, id, message): |
64 | 484 """Add or update the message with the specified ID. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
485 |
64 | 486 >>> catalog = Catalog() |
487 >>> catalog[u'foo'] = Message(u'foo') | |
488 >>> catalog[u'foo'] | |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
489 <Message u'foo' (flags: [])> |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
490 |
64 | 491 If a message with that ID is already in the catalog, it is updated |
492 to include the locations and flags of the new message. | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
493 |
64 | 494 >>> catalog = Catalog() |
495 >>> catalog[u'foo'] = Message(u'foo', locations=[('main.py', 1)]) | |
496 >>> catalog[u'foo'].locations | |
497 [('main.py', 1)] | |
498 >>> catalog[u'foo'] = Message(u'foo', locations=[('utils.py', 5)]) | |
499 >>> catalog[u'foo'].locations | |
500 [('main.py', 1), ('utils.py', 5)] | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
501 |
64 | 502 :param id: the message ID |
503 :param message: the `Message` object | |
504 """ | |
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
|
505 assert isinstance(message, Message), 'expected a Message object' |
350 | 506 key = self._key_for(id, message.context) |
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
|
507 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
|
508 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
|
509 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
|
510 # 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
|
511 current.id = message.id |
70
2b0e18a04856
Fix for mixed singular/plural messages, follow-up to [70].
cmlenz
parents:
69
diff
changeset
|
512 current.string = message.string |
229 | 513 current.locations = list(distinct(current.locations + |
514 message.locations)) | |
228
fd29fabdc986
Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents:
227
diff
changeset
|
515 current.auto_comments = list(distinct(current.auto_comments + |
fd29fabdc986
Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents:
227
diff
changeset
|
516 message.auto_comments)) |
fd29fabdc986
Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents:
227
diff
changeset
|
517 current.user_comments = list(distinct(current.user_comments + |
fd29fabdc986
Follow-up to [239]: also combine duplicate comments when writing PO files.
cmlenz
parents:
227
diff
changeset
|
518 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
|
519 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
|
520 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
|
521 elif id == '': |
9b22b36066f6
Fix for #16: the header message (`msgid = ""`) is now treated specially by `read_po` and `Catalog`.
cmlenz
parents:
105
diff
changeset
|
522 # 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
|
523 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
|
524 self.mime_headers = headers.items() |
120 | 525 self.header_comment = '\n'.join(['# %s' % comment for comment |
526 in message.user_comments]) | |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
527 self.fuzzy = message.fuzzy |
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
|
528 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
|
529 if isinstance(id, (list, tuple)): |
277
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
530 assert isinstance(message.string, (list, tuple)), \ |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
531 'Expected sequence but got %s' % type(message.string) |
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
|
532 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
|
533 |
105
f744dd56573d
`Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents:
104
diff
changeset
|
534 def add(self, id, string=None, locations=(), flags=(), auto_comments=(), |
335 | 535 user_comments=(), previous_id=(), lineno=None, context=None): |
64 | 536 """Add or update the message with the specified ID. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
537 |
64 | 538 >>> catalog = Catalog() |
539 >>> catalog.add(u'foo') | |
540 >>> catalog[u'foo'] | |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
541 <Message u'foo' (flags: [])> |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
542 |
64 | 543 This method simply constructs a `Message` object with the given |
544 arguments and invokes `__setitem__` with that object. | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
545 |
64 | 546 :param id: the message ID, or a ``(singular, plural)`` tuple for |
547 pluralizable messages | |
548 :param string: the translated message string, or a | |
549 ``(singular, plural)`` tuple for pluralizable messages | |
550 :param locations: a sequence of ``(filenname, lineno)`` tuples | |
551 :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
|
552 :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
|
553 :param user_comments: a sequence of user comments |
203 | 554 :param previous_id: the previous message ID, or a ``(singular, plural)`` |
555 tuple for pluralizable messages | |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
556 :param lineno: the line number on which the msgid line was found in the |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
557 PO file, if any |
335 | 558 :param context: the message context |
64 | 559 """ |
105
f744dd56573d
`Message`, `read_po` and `write_po` now all handle user/auto comments correctly.
palgarvio
parents:
104
diff
changeset
|
560 self[id] = Message(id, string, list(locations), flags, auto_comments, |
335 | 561 user_comments, previous_id, lineno=lineno, |
562 context=context) | |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
563 |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
564 def check(self): |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
565 """Run various validation checks on the translations in the catalog. |
226 | 566 |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
567 For every message which fails validation, this method yield a |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
568 ``(message, errors)`` tuple, where ``message`` is the `Message` object |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
569 and ``errors`` is a sequence of `TranslationError` objects. |
226 | 570 |
220
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
571 :rtype: ``iterator`` |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
572 """ |
677147547e2d
Added infrastructure for adding catalog checkers, and implement a checker that validations Python format parameters in translations, closing #19.
cmlenz
parents:
210
diff
changeset
|
573 checkers = [] |
250
cd7e378b8190
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
248
diff
changeset
|
574 try: |
cd7e378b8190
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
248
diff
changeset
|
575 from pkg_resources import working_set |
cd7e378b8190
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
248
diff
changeset
|
576 except ImportError: |
352
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
577 from babel.messages.checkers import builtin_checkers |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
578 checkers.extend(builtin_checkers) |
250
cd7e378b8190
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
248
diff
changeset
|
579 else: |
cd7e378b8190
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
248
diff
changeset
|
580 for entry_point in working_set.iter_entry_points('babel.checkers'): |
cd7e378b8190
Soften dependency on setuptools. Extraction methods can now be referenced using a special section in the mapping configuration, mapping short names to fully-qualified function references.
cmlenz
parents:
248
diff
changeset
|
581 checkers.append(entry_point.load()) |
352
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
582 for message in self._messages.values(): |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
583 errors = [] |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
584 for checker in checkers: |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
585 try: |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
586 checker(self, message) |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
587 except TranslationError, e: |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
588 errors.append(e) |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
589 if errors: |
20d10066a42a
The builtin checkers don't require setuptools any longer, validate_format and python_format from the checkers module are merged into one now.
aronacher
parents:
351
diff
changeset
|
590 yield message, errors |
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
|
591 |
350 | 592 def get(self, id, context=None): |
593 """Return the message with the specified ID and context. | |
594 | |
595 :param id: the message ID | |
596 :param context: the message context, or ``None`` for no context | |
597 :return: the message with the specified ID, or `None` if no such | |
598 message is in the catalog | |
599 :rtype: `Message` | |
600 """ | |
601 return self._messages.get(self._key_for(id, context)) | |
602 | |
603 def delete(self, id, context=None): | |
604 """Delete the message with the specified ID and context. | |
605 | |
606 :param id: the message ID | |
607 :param context: the message context, or ``None`` for no context | |
608 """ | |
609 key = self._key_for(id, context) | |
610 if key in self._messages: | |
611 del self._messages[key] | |
612 | |
203 | 613 def update(self, template, no_fuzzy_matching=False): |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
614 """Update the catalog based on the given template catalog. |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
615 |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
616 >>> from babel.messages import Catalog |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
617 >>> template = Catalog() |
188 | 618 >>> template.add('green', locations=[('main.py', 99)]) |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
619 >>> template.add('blue', locations=[('main.py', 100)]) |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
620 >>> template.add(('salad', 'salads'), locations=[('util.py', 42)]) |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
621 >>> catalog = Catalog(locale='de_DE') |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
622 >>> catalog.add('blue', u'blau', locations=[('main.py', 98)]) |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
623 >>> catalog.add('head', u'Kopf', locations=[('util.py', 33)]) |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
624 >>> catalog.add(('salad', 'salads'), (u'Salat', u'Salate'), |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
625 ... locations=[('util.py', 38)]) |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
626 |
181
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
627 >>> catalog.update(template) |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
628 >>> len(catalog) |
188 | 629 3 |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
630 |
188 | 631 >>> msg1 = catalog['green'] |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
632 >>> msg1.string |
188 | 633 >>> msg1.locations |
634 [('main.py', 99)] | |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
635 |
188 | 636 >>> msg2 = catalog['blue'] |
637 >>> msg2.string | |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
638 u'blau' |
188 | 639 >>> msg2.locations |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
640 [('main.py', 100)] |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
641 |
188 | 642 >>> msg3 = catalog['salad'] |
643 >>> msg3.string | |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
644 (u'Salat', u'Salate') |
188 | 645 >>> msg3.locations |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
646 [('util.py', 42)] |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
647 |
181
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
648 Messages that are in the catalog but not in the template are removed |
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
649 from the main collection, but can still be accessed via the `obsolete` |
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
650 member: |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
651 |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
652 >>> 'head' in catalog |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
653 False |
181
9a1acb41e7dd
The frontends now provide ways to update existing translations catalogs from a template. Closes #22.
cmlenz
parents:
175
diff
changeset
|
654 >>> catalog.obsolete.values() |
196
93a922d31eca
Fix for #35, and a minor improvement to how we parse the catalog fuzzy bit.
cmlenz
parents:
188
diff
changeset
|
655 [<Message 'head' (flags: [])>] |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
656 |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
657 :param template: the reference catalog, usually read from a POT file |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
658 :param no_fuzzy_matching: whether to use fuzzy matching of message IDs |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
659 """ |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
660 messages = self._messages |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
661 remaining = messages.copy() |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
662 self._messages = odict() |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
663 |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
664 # Prepare for fuzzy matching |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
665 fuzzy_candidates = [] |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
666 if not no_fuzzy_matching: |
350 | 667 fuzzy_candidates = dict([ |
668 (self._key_for(msgid), messages[msgid].context) | |
669 for msgid in messages if msgid and messages[msgid].string | |
670 ]) | |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
671 fuzzy_matches = set() |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
672 |
277
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
673 def _merge(message, oldkey, newkey): |
313
559c80b1ffb2
Merging catalogs would sometimes mix translations from different runs.
cmlenz
parents:
312
diff
changeset
|
674 message = message.clone() |
277
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
675 fuzzy = False |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
676 if oldkey != newkey: |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
677 fuzzy = True |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
678 fuzzy_matches.add(oldkey) |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
679 oldmsg = messages.get(oldkey) |
277
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
680 if isinstance(oldmsg.id, basestring): |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
681 message.previous_id = [oldmsg.id] |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
682 else: |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
683 message.previous_id = list(oldmsg.id) |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
684 else: |
337
568170eb7580
Fix iterkeys/iteritems/itervalues/pop/popitem methods on the `odict` utility class. Thanks to Armin Ronacher for the patch.
cmlenz
parents:
335
diff
changeset
|
685 oldmsg = remaining.pop(oldkey, None) |
277
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
686 message.string = oldmsg.string |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
687 if isinstance(message.id, (list, tuple)): |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
688 if not isinstance(message.string, (list, tuple)): |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
689 fuzzy = True |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
690 message.string = tuple( |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
691 [message.string] + ([u''] * (len(message.id) - 1)) |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
692 ) |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
693 elif len(message.string) != len(message.id): |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
694 fuzzy = True |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
695 message.string = tuple(message.string[:len(oldmsg.string)]) |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
696 elif isinstance(message.string, (list, tuple)): |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
697 fuzzy = True |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
698 message.string = message.string[0] |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
699 message.flags |= oldmsg.flags |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
700 if fuzzy: |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
701 message.flags |= set([u'fuzzy']) |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
702 self[message.id] = message |
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
703 |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
704 for message in template: |
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
705 if message.id: |
350 | 706 key = self._key_for(message.id, message.context) |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
707 if key in messages: |
277
7a3f4ca113e4
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
cmlenz
parents:
250
diff
changeset
|
708 _merge(message, key, key) |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
709 else: |
200
2983c718f6e2
Added `--no-fuzzy-matching` to the frontends and also `--previous` which adds the old msgid's as comments. The latest closes #31.
palgarvio
parents:
198
diff
changeset
|
710 if no_fuzzy_matching is False: |
165
650a6e996ede
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
163
diff
changeset
|
711 # do some fuzzy matching with difflib |
350 | 712 if isinstance(key, tuple): |
713 matchkey = key[0] # just the msgid, no context | |
714 else: | |
715 matchkey = key | |
716 matches = get_close_matches(matchkey.lower().strip(), | |
717 fuzzy_candidates.keys(), 1) | |
165
650a6e996ede
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
163
diff
changeset
|
718 if matches: |
350 | 719 newkey = matches[0] |
720 newctxt = fuzzy_candidates[newkey] | |
721 if newctxt is not None: | |
722 newkey = newkey, newctxt | |
723 _merge(message, newkey, key) | |
188 | 724 continue |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
725 |
165
650a6e996ede
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
163
diff
changeset
|
726 self[message.id] = message |
650a6e996ede
Implement fuzzy matching to catalog updates. No frontend yet.
cmlenz
parents:
163
diff
changeset
|
727 |
312
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
728 self.obsolete = odict() |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
729 for msgid in remaining: |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
730 if no_fuzzy_matching or msgid not in fuzzy_matches: |
61e6b1933af4
Fix catalog updating with fuzzy matches. Closes #82.
cmlenz
parents:
291
diff
changeset
|
731 self.obsolete[msgid] = remaining[msgid] |
163
f2c78a271159
Added preliminary catalog updating/merging functionality.
cmlenz
parents:
149
diff
changeset
|
732 |
350 | 733 def _key_for(self, id, context=None): |
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
|
734 """The key for a message is just the singular ID even for pluralizable |
350 | 735 messages, but is a ``(msgid, msgctxt)`` tuple for context-specific |
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
|
736 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
|
737 """ |
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
|
738 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
|
739 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
|
740 key = id[0] |
350 | 741 if context is not None: |
742 key = (key, context) | |
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
|
743 return key |