def testIsIdenticalTranslation(self): """Test `is_identical_translation`.""" msg1 = TranslationMessageData() msg2 = TranslationMessageData() msg1.msgid_singular = "foo" msg2.msgid_singular = "foo" self.assertTrue( is_identical_translation(msg1, msg2), "Two blank translation messages do not evaluate as identical.") msg1.msgid_plural = "foos" self.assertFalse( is_identical_translation(msg1, msg2), "Message with fewer plural forms is accepted as identical.") msg2.msgid_plural = "splat" self.assertFalse( is_identical_translation(msg1, msg2), "Messages with different plurals accepted as identical.") msg2.msgid_plural = "foos" self.assertTrue( is_identical_translation(msg1, msg2), "Messages with identical plural forms not accepted as identical.") msg1._translations = ["le foo"] self.assertFalse( is_identical_translation(msg1, msg2), "Failed to distinguish translated message from untranslated one.") msg2._translations = ["le foo"] self.assertTrue(is_identical_translation(msg1, msg2), "Identical translations not accepted as identical.") msg1._translations = ["le foo", "les foos"] self.assertFalse( is_identical_translation(msg1, msg2), "Failed to distinguish message with missing plural translation.") msg2._translations = ["le foo", "les foos"] self.assertTrue( is_identical_translation(msg1, msg2), "Identical plural translations not accepted as equal.") msg1._translations = ["le foo", "les foos", "beaucoup des foos"] self.assertFalse( is_identical_translation(msg1, msg2), "Failed to distinguish message with extra plural translations.") msg2._translations = ["le foo", "les foos", "beaucoup des foos", None] self.assertTrue( is_identical_translation(msg1, msg2), "Identical multi-form messages not accepted as identical.")
def getTranslationMessageData(self, translationmessage): # Convert a TranslationMessage to TranslationMessageData object, # which is used during import. potmsgset = translationmessage.potmsgset message_data = TranslationMessageData() message_data.context = potmsgset.context message_data.msgid_singular = potmsgset.singular_text message_data.msgid_plural = potmsgset.plural_text translations = translationmessage.translations for plural_form, translation in enumerate(translations): message_data.addTranslation(plural_form, translation) return message_data
def testIsIdenticalTranslation(self): """Test `is_identical_translation`.""" msg1 = TranslationMessageData() msg2 = TranslationMessageData() msg1.msgid_singular = "foo" msg2.msgid_singular = "foo" self.assertTrue(is_identical_translation(msg1, msg2), "Two blank translation messages do not evaluate as identical.") msg1.msgid_plural = "foos" self.assertFalse(is_identical_translation(msg1, msg2), "Message with fewer plural forms is accepted as identical.") msg2.msgid_plural = "splat" self.assertFalse(is_identical_translation(msg1, msg2), "Messages with different plurals accepted as identical.") msg2.msgid_plural = "foos" self.assertTrue(is_identical_translation(msg1, msg2), "Messages with identical plural forms not accepted as identical.") msg1._translations = ["le foo"] self.assertFalse(is_identical_translation(msg1, msg2), "Failed to distinguish translated message from untranslated one.") msg2._translations = ["le foo"] self.assertTrue(is_identical_translation(msg1, msg2), "Identical translations not accepted as identical.") msg1._translations = ["le foo", "les foos"] self.assertFalse(is_identical_translation(msg1, msg2), "Failed to distinguish message with missing plural translation.") msg2._translations = ["le foo", "les foos"] self.assertTrue(is_identical_translation(msg1, msg2), "Identical plural translations not accepted as equal.") msg1._translations = ["le foo", "les foos", "beaucoup des foos"] self.assertFalse(is_identical_translation(msg1, msg2), "Failed to distinguish message with extra plural translations.") msg2._translations = ["le foo", "les foos", "beaucoup des foos", None] self.assertTrue(is_identical_translation(msg1, msg2), "Identical multi-form messages not accepted as identical.")
def _fetchDBRows(self, simulate_timeout=False): msgstr_joins = [ "LEFT OUTER JOIN POTranslation AS pt%d " "ON pt%d.id = TranslationMessage.msgstr%d" % (form, form, form) for form in xrange(TranslationConstants.MAX_PLURAL_FORMS) ] translations = [ "pt%d.translation AS translation%d" % (form, form) for form in xrange(TranslationConstants.MAX_PLURAL_FORMS) ] substitutions = { 'translation_columns': ', '.join(translations), 'translation_joins': '\n'.join(msgstr_joins), 'language': quote(self.pofile.language), 'potemplate': quote(self.pofile.potemplate), 'flag': self._getFlagName(), } sql = """ SELECT POMsgId.msgid AS msgid, POMsgID_Plural.msgid AS msgid_plural, context, date_reviewed, %(translation_columns)s FROM POTMsgSet JOIN TranslationTemplateItem ON TranslationTemplateItem.potmsgset = POTMsgSet.id AND TranslationTemplateItem.potemplate = %(potemplate)s JOIN TranslationMessage ON POTMsgSet.id=TranslationMessage.potmsgset AND ( TranslationMessage.potemplate = %(potemplate)s OR TranslationMessage.potemplate IS NULL) AND TranslationMessage.language = %(language)s %(translation_joins)s JOIN POMsgID ON POMsgID.id = POTMsgSet.msgid_singular LEFT OUTER JOIN POMsgID AS POMsgID_Plural ON POMsgID_Plural.id = POTMsgSet.msgid_plural WHERE %(flag)s IS TRUE ORDER BY TranslationTemplateItem.sequence, TranslationMessage.potemplate NULLS LAST """ % substitutions cur = cursor() try: # XXX JeroenVermeulen 2010-11-24 bug=680802: We set a # timeout to work around bug 408718, but the query is # simpler now. See if we still need this. # We have to commit what we've got so far or we'll lose # it when we hit TimeoutError. transaction.commit() if simulate_timeout: # This is used in tests. timeout = '1ms' query = "SELECT pg_sleep(2)" else: timeout = 1000 * int(config.poimport.statement_timeout) query = sql cur.execute("SET statement_timeout to %s" % quote(timeout)) cur.execute(query) except TimeoutError: # XXX JeroenVermeulen 2010-11-24 bug=680802: Log this so we # know whether it still happens. transaction.abort() return rows = cur.fetchall() assert TranslationConstants.MAX_PLURAL_FORMS == 6, ( "Change this code to support %d plural forms" % TranslationConstants.MAX_PLURAL_FORMS) for row in rows: msgid, msgid_plural, context, date = row[:4] # The last part of the row is msgstr0 .. msgstr5. Store them # in a dict indexed by the number of the plural form. msgstrs = dict(enumerate(row[4:])) key = (msgid, msgid_plural, context) if key in self.current_messages: message = self.current_messages[key] else: message = TranslationMessageData() self.current_messages[key] = message message.context = context message.msgid_singular = msgid message.msgid_plural = msgid_plural for plural in xrange(TranslationConstants.MAX_PLURAL_FORMS): msgstr = msgstrs.get(plural, None) if (msgstr is not None and ((len(message.translations) > plural and message.translations[plural] is None) or (len(message.translations) <= plural))): message.addTranslation(plural, msgstr)
def _fetchDBRows(self, simulate_timeout=False): msgstr_joins = [ "LEFT OUTER JOIN POTranslation AS pt%d " "ON pt%d.id = TranslationMessage.msgstr%d" % (form, form, form) for form in xrange(TranslationConstants.MAX_PLURAL_FORMS)] translations = [ "pt%d.translation AS translation%d" % (form, form) for form in xrange(TranslationConstants.MAX_PLURAL_FORMS)] substitutions = { 'translation_columns': ', '.join(translations), 'translation_joins': '\n'.join(msgstr_joins), 'language': quote(self.pofile.language), 'potemplate': quote(self.pofile.potemplate), 'flag': self._getFlagName(), } sql = """ SELECT POMsgId.msgid AS msgid, POMsgID_Plural.msgid AS msgid_plural, context, date_reviewed, %(translation_columns)s FROM POTMsgSet JOIN TranslationTemplateItem ON TranslationTemplateItem.potmsgset = POTMsgSet.id AND TranslationTemplateItem.potemplate = %(potemplate)s JOIN TranslationMessage ON POTMsgSet.id=TranslationMessage.potmsgset AND ( TranslationMessage.potemplate = %(potemplate)s OR TranslationMessage.potemplate IS NULL) AND TranslationMessage.language = %(language)s %(translation_joins)s JOIN POMsgID ON POMsgID.id = POTMsgSet.msgid_singular LEFT OUTER JOIN POMsgID AS POMsgID_Plural ON POMsgID_Plural.id = POTMsgSet.msgid_plural WHERE %(flag)s IS TRUE ORDER BY TranslationTemplateItem.sequence, TranslationMessage.potemplate NULLS LAST """ % substitutions cur = cursor() try: # XXX JeroenVermeulen 2010-11-24 bug=680802: We set a # timeout to work around bug 408718, but the query is # simpler now. See if we still need this. # We have to commit what we've got so far or we'll lose # it when we hit TimeoutError. transaction.commit() if simulate_timeout: # This is used in tests. timeout = '1ms' query = "SELECT pg_sleep(2)" else: timeout = 1000 * int(config.poimport.statement_timeout) query = sql cur.execute("SET statement_timeout to %s" % quote(timeout)) cur.execute(query) except TimeoutError: # XXX JeroenVermeulen 2010-11-24 bug=680802: Log this so we # know whether it still happens. transaction.abort() return rows = cur.fetchall() assert TranslationConstants.MAX_PLURAL_FORMS == 6, ( "Change this code to support %d plural forms" % TranslationConstants.MAX_PLURAL_FORMS) for row in rows: msgid, msgid_plural, context, date = row[:4] # The last part of the row is msgstr0 .. msgstr5. Store them # in a dict indexed by the number of the plural form. msgstrs = dict(enumerate(row[4:])) key = (msgid, msgid_plural, context) if key in self.current_messages: message = self.current_messages[key] else: message = TranslationMessageData() self.current_messages[key] = message message.context = context message.msgid_singular = msgid message.msgid_plural = msgid_plural for plural in xrange(TranslationConstants.MAX_PLURAL_FORMS): msgstr = msgstrs.get(plural, None) if (msgstr is not None and ((len(message.translations) > plural and message.translations[plural] is None) or (len(message.translations) <= plural))): message.addTranslation(plural, msgstr)