Index: translate/storage/cpo.py =================================================================== --- translate/storage/cpo.py (revision 7740) +++ translate/storage/cpo.py (working copy) @@ -134,12 +134,18 @@ gpo.po_message_msgid_plural.restype = STRING gpo.po_message_msgstr.restype = STRING gpo.po_message_msgstr_plural.restype = STRING +gpo.po_message_prev_msgid.restype = STRING +gpo.po_message_prev_msgid.restype = STRING +gpo.po_message_prev_msgid_plural.restype = STRING # Message (set methods) gpo.po_message_set_comments.argtypes = [c_int, STRING] gpo.po_message_set_extracted_comments.argtypes = [c_int, STRING] gpo.po_message_set_fuzzy.argtypes = [c_int, c_int] gpo.po_message_set_msgctxt.argtypes = [c_int, STRING] +gpo.po_message_set_prev_msgctxt.argtypes = [c_int, STRING] +gpo.po_message_set_prev_msgid.argtypes = [c_int, STRING] +gpo.po_message_set_prev_msgid_plural.argtypes = [c_int, STRING] # Setup the po_xerror_handler xerror_handler = po_xerror_handler() @@ -181,6 +187,72 @@ gpo.po_message_set_msgid_plural(self._gpo_message, msgid_plural) msgid_plural = property(None, setmsgid_plural) + def setprev_context(self, msgid_context): + """Set the previous context for this message""" + gpo.po_message_set_prev_msgctxt(self._gpo_message, msgid_context) + + def getprev_context(self): + """Get the previous context for this message, if any """ + prev_ctxt = gpo.po_message_prev_msgctxt(self._gpo_message) + if not prev_ctxt: + return "" + return prev_ctxt + + prev_context = property(getprev_context, setprev_context) + + def setprev_source(self, prev_source): + """Set msgid as a previous msgid for this message""" + if isinstance(prev_source, multistring): + prev_source = prev_source.strings + if isinstance(prev_source, unicode): + prev_source = prev_source.encode(self._encoding) + if isinstance(prev_source, list): + if len(prev_source) > 1: + self.prev_plural = str(prev_source[1]) + + prev_source = str(prev_source[0]) + + self.source = "" + print prev_source, type(prev_source) + gpo.po_message_set_prev_msgid(self._gpo_message, prev_source) + + def getprev_source(self): + """Get the previous msgid for this message, if any""" + prev_source = gpo.po_message_prev_msgid(self._gpo_message) + if not prev_source: + return "" + return prev_source + + prev_source = property(getprev_source, setprev_source) + + def setprev_plural(self, msgid_plural): + """Set a given msgid_plural as a previous plural""" + if isinstance(msgid_plural, list): + msgid_plural = "".join(msgid_plural) + gpo.po_message_set_prev_msgid_plural(self._gpo_message, msgid_plural) + + def getprev_plural(self): + """Get the previous plural for this message, if any""" + prev_plural = gpo.po_message_prev_msgid_plural(self._gpo_message) + if not prev_plural: + return "" + return prev_plural + + prev_plural = property(getprev_plural, setprev_plural) + + def set_as_previous(self): + """Sets the current msgid as previous message. Then, the current + msgid could be filled with a new msgid. Note that, if a unit + contains a previous msgid, it also is marked as fuzzy (to keep the + same behavior as msgmerge). + """ + if not self.target: + return + + self.markfuzzy() + self.prev_context = gpo.po_message_msgctxt(self._gpo_message) + self.prev_source = self.source + def getsource(self): def remove_msgid_comments(text): if not text: Index: translate/storage/test_cpo.py =================================================================== --- translate/storage/test_cpo.py (revision 7740) +++ translate/storage/test_cpo.py (working copy) @@ -72,6 +72,62 @@ unit.addnote("# Double commented comment") assert unit.getnotes() == "# Double commented comment" + def test_previous_source(self): + """tests if we handle previous msgid properly""" + unit = self.UnitClass("Cat") + assert unit.prev_source == "" + + unit.prev_source = "Feline" + assert unit.prev_source == "Feline" + + unit.prev_source = "" + assert unit.prev_source == "" + + def test_previous_context(self): + """tests if we handle previous context messages properly""" + unit = self.UnitClass("Cat") + assert unit.prev_context == "" + + context = "A sort of a cute animal" + unit.prev_context = context + assert unit.prev_context == context + + unit.prev_context = "" + assert unit.prev_context == "" + + def test_previous_plural(self): + """tests if we handle previous plural properly""" + unit = self.UnitClass("Cat") + assert unit.prev_plural == "" + + unit.prev_plural = "Cats" + assert unit.prev_plural == "Cats" + + unit.prev_plural = "" + assert unit.prev_plural == "" + + def test_set_as_previous(self): + """tests if we set previous messages properly""" + # This is just a sanity test, for a more complete test look + # at convert/test_pot2po.py + unit = self.UnitClass("Test %d") + unit.msgid_plural = ["Tests %d"] + unit.target = ["Teste %d", "Testes %d"] + unit.set_as_previous() + unit.source = "Test %s" + test_unit = '''#, fuzzy\n#| msgid "Test %d"\n#| msgid_plural "Tests %d" +msgid "Test %s"\nmsgstr "Teste %d"\n''' + assert str(unit) == test_unit + assert unit.isfuzzy() + + # without a target, the unit remain the same + unit2 = self.UnitClass("Other") + unit2.msgid_plural = ["Others"] + expected = str(unit2) + unit2.set_as_previous() + assert str(unit2) == expected + + class TestCPOFile(test_po.TestPOFile): StoreClass = cpo.pofile def test_msgidcomments(self):