comparison babel/messages/catalog.py @ 279:3308e9971fab

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 2398fc97675b
children 62d4f85d33ea
comparison
equal deleted inserted replaced
277:a186cddb4a10 279:3308e9971fab
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
Copyright (C) 2012-2017 Edgewall Software