Mercurial > babel > mirror
comparison babel/messages/catalog.py @ 277:9886bf6f2d15 trunk
Fix for updating catalog messages that changed from gettext to ngettext or vice versa.
author | cmlenz |
---|---|
date | Tue, 04 Sep 2007 15:09:54 +0000 |
parents | 6c06570af1b9 |
children | 2f6b2b06a428 |
comparison
equal
deleted
inserted
replaced
275:87967a5593fd | 277:9886bf6f2d15 |
---|---|
499 self.header_comment = '\n'.join(['# %s' % comment for comment | 499 self.header_comment = '\n'.join(['# %s' % comment for comment |
500 in message.user_comments]) | 500 in message.user_comments]) |
501 self.fuzzy = message.fuzzy | 501 self.fuzzy = message.fuzzy |
502 else: | 502 else: |
503 if isinstance(id, (list, tuple)): | 503 if isinstance(id, (list, tuple)): |
504 assert isinstance(message.string, (list, tuple)) | 504 assert isinstance(message.string, (list, tuple)), \ |
505 'Expected sequence but got %s' % type(message.string) | |
505 self._messages[key] = message | 506 self._messages[key] = message |
506 | 507 |
507 def add(self, id, string=None, locations=(), flags=(), auto_comments=(), | 508 def add(self, id, string=None, locations=(), flags=(), auto_comments=(), |
508 user_comments=(), previous_id=(), lineno=None): | 509 user_comments=(), previous_id=(), lineno=None): |
509 """Add or update the message with the specified ID. | 510 """Add or update the message with the specified ID. |
610 :param no_fuzzy_matching: whether to use fuzzy matching of message IDs | 611 :param no_fuzzy_matching: whether to use fuzzy matching of message IDs |
611 """ | 612 """ |
612 messages = self._messages | 613 messages = self._messages |
613 self._messages = odict() | 614 self._messages = odict() |
614 | 615 |
616 def _merge(message, oldkey, newkey): | |
617 fuzzy = False | |
618 oldmsg = messages.pop(oldkey) | |
619 if oldkey != newkey: | |
620 fuzzy = True | |
621 if isinstance(oldmsg.id, basestring): | |
622 message.previous_id = [oldmsg.id] | |
623 else: | |
624 message.previous_id = list(oldmsg.id) | |
625 message.string = oldmsg.string | |
626 if isinstance(message.id, (list, tuple)): | |
627 if not isinstance(message.string, (list, tuple)): | |
628 fuzzy = True | |
629 message.string = tuple( | |
630 [message.string] + ([u''] * (len(message.id) - 1)) | |
631 ) | |
632 elif len(message.string) != len(message.id): | |
633 fuzzy = True | |
634 message.string = tuple(message.string[:len(oldmsg.string)]) | |
635 elif isinstance(message.string, (list, tuple)): | |
636 fuzzy = True | |
637 message.string = message.string[0] | |
638 message.flags |= oldmsg.flags | |
639 if fuzzy: | |
640 message.flags |= set([u'fuzzy']) | |
641 self[message.id] = message | |
642 | |
615 for message in template: | 643 for message in template: |
616 if message.id: | 644 if message.id: |
617 key = self._key_for(message.id) | 645 key = self._key_for(message.id) |
618 if key in messages: | 646 if key in messages: |
619 oldmsg = messages.pop(key) | 647 _merge(message, key, key) |
620 message.string = oldmsg.string | |
621 message.flags |= oldmsg.flags | |
622 self[message.id] = message | |
623 | |
624 else: | 648 else: |
625 if no_fuzzy_matching is False: | 649 if no_fuzzy_matching is False: |
626 # do some fuzzy matching with difflib | 650 # do some fuzzy matching with difflib |
627 matches = get_close_matches(key.lower().strip(), | 651 matches = get_close_matches(key.lower().strip(), |
628 [self._key_for(msgid) for msgid in messages], 1) | 652 [self._key_for(msgid) for msgid in messages], 1) |
629 if matches: | 653 if matches: |
630 oldmsg = messages.pop(matches[0]) | 654 _merge(message, matches[0], key) |
631 message.string = oldmsg.string | |
632 message.flags |= oldmsg.flags | set([u'fuzzy']) | |
633 if isinstance(oldmsg.id, basestring): | |
634 message.previous_id = [oldmsg.id] | |
635 else: | |
636 message.previous_id = list(oldmsg.id) | |
637 self[message.id] = message | |
638 continue | 655 continue |
639 | 656 |
640 self[message.id] = message | 657 self[message.id] = message |
641 | 658 |
642 self.obsolete = messages | 659 self.obsolete = messages |