)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"5452109639ba4076a4286fc880f21f1ac13f8ea3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"https://review.openstack.org/#q,topic:bp/more-gettext-support,n,z"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint more-gettext-support"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Ic16d902ddfe94cfb5cfabe1c4f612ff001a8fa53"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"fa32b979_e28e9026","line":16,"updated":"2015-06-22 16:51:47.000000000","message":"It would be good to add a Depends-on entry here for the spec patch so we don\u0027t merge this without the spec. I think you want\n\n  Depends-on: I258eac447ecc7b71fb02952077cf3ef3ecfe12bb","commit_id":"febb9b97311a210ce193ecc08471cca5708c8aea"}],"oslo_i18n/_factory.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return f"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _make_contextual_translation_func(self, domain\u003dNone):"},{"line_number":88,"context_line":"        \"Return a translation function ready for use with context messages.\""},{"line_number":89,"context_line":"        if domain is None:"},{"line_number":90,"context_line":"            domain \u003d self.domain"},{"line_number":91,"context_line":"        t \u003d gettext.translation(domain,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_28b41ff1","line":88,"updated":"2015-01-02 17:53:51.000000000","message":"Please don\u0027t use bare strings for function docstrings.  This should use the \"\"\" docstring syntax like _make_translation_func above.\n\nAlso, a more detailed description of what a contextual translation is would be good too.  It\u0027s not obvious to me what this would be used for.","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return f"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _make_contextual_translation_func(self, domain\u003dNone):"},{"line_number":88,"context_line":"        \"Return a translation function ready for use with context messages.\""},{"line_number":89,"context_line":"        if domain is None:"},{"line_number":90,"context_line":"            domain \u003d self.domain"},{"line_number":91,"context_line":"        t \u003d gettext.translation(domain,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_729d2957","line":88,"in_reply_to":"3a961159_28b41ff1","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        return f"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _make_plural_translation_func(self, domain\u003dNone):"},{"line_number":113,"context_line":"        \"Return a plural translation function ready for use with messages\""},{"line_number":114,"context_line":"        if domain is None:"},{"line_number":115,"context_line":"            domain \u003d self.domain"},{"line_number":116,"context_line":"        t \u003d gettext.translation(domain,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_48b7abf5","line":113,"updated":"2015-01-02 17:53:51.000000000","message":"Same comment on docstring syntax.","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        return f"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _make_plural_translation_func(self, domain\u003dNone):"},{"line_number":113,"context_line":"        \"Return a plural translation function ready for use with messages\""},{"line_number":114,"context_line":"        if domain is None:"},{"line_number":115,"context_line":"            domain \u003d self.domain"},{"line_number":116,"context_line":"        t \u003d gettext.translation(domain,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_52c90d59","line":113,"in_reply_to":"3a961159_48b7abf5","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @property"},{"line_number":137,"context_line":"    def contextual_form(self):"},{"line_number":138,"context_line":"        \"The contextual translation function.\""},{"line_number":139,"context_line":"        return self._make_contextual_translation_func()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_68cd4786","line":138,"updated":"2015-01-02 17:53:51.000000000","message":"And here.","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    @property"},{"line_number":137,"context_line":"    def contextual_form(self):"},{"line_number":138,"context_line":"        \"The contextual translation function.\""},{"line_number":139,"context_line":"        return self._make_contextual_translation_func()"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_32eac1ac","line":138,"in_reply_to":"3a961159_68cd4786","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @property"},{"line_number":142,"context_line":"    def plural_form(self):"},{"line_number":143,"context_line":"        \"The plural translation function.\""},{"line_number":144,"context_line":"        return self._make_plural_translation_func()"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def _make_log_translation_func(self, level):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_a8c72f63","line":143,"updated":"2015-01-02 17:53:51.000000000","message":"Here too. :-)","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @property"},{"line_number":142,"context_line":"    def plural_form(self):"},{"line_number":143,"context_line":"        \"The plural translation function.\""},{"line_number":144,"context_line":"        return self._make_plural_translation_func()"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def _make_log_translation_func(self, level):"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_52d02df7","line":143,"in_reply_to":"3a961159_a8c72f63","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"}],"oslo_i18n/_gettextutils.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    from six import moves"},{"line_number":50,"context_line":"    tf \u003d _factory.TranslatorFactory(domain)"},{"line_number":51,"context_line":"    moves.builtins.__dict__[\u0027_\u0027] \u003d tf.primary"},{"line_number":52,"context_line":"    moves.builtins.__dict__[\u0027_C\u0027] \u003d tf.contextual_form"},{"line_number":53,"context_line":"    moves.builtins.__dict__[\u0027_P\u0027] \u003d tf.plural_form"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_c899db7a","line":52,"updated":"2015-01-02 17:53:51.000000000","message":"I believe we\u0027re discouraging people from using install in new code.  I\u0027d rather not add these here so people have to use the recommended method if they want to take advantage of the new functionality.\n\nThis would match what we did with _LE, _LI, etc. too I think.","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    from six import moves"},{"line_number":50,"context_line":"    tf \u003d _factory.TranslatorFactory(domain)"},{"line_number":51,"context_line":"    moves.builtins.__dict__[\u0027_\u0027] \u003d tf.primary"},{"line_number":52,"context_line":"    moves.builtins.__dict__[\u0027_C\u0027] \u003d tf.contextual_form"},{"line_number":53,"context_line":"    moves.builtins.__dict__[\u0027_P\u0027] \u003d tf.plural_form"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_726c499e","line":52,"in_reply_to":"3a961159_c899db7a","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"}],"oslo_i18n/_message.py":[{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # Reserved for contextual and plural translation function"},{"line_number":136,"context_line":"        if isinstance(msgid, tuple) and 4 \u003d\u003d len(msgid):"},{"line_number":137,"context_line":"            assert False, \"Unimplemented.\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        assert False, \"Unknown msgid type.\""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_a8756f33","line":137,"updated":"2015-01-02 17:53:51.000000000","message":"Instead of asserts, I think this should raise a ValueError.  This isn\u0027t internal state that we\u0027re trying to assert is consistent, it\u0027s checking that the data passed to us is correct.","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # Reserved for contextual and plural translation function"},{"line_number":136,"context_line":"        if isinstance(msgid, tuple) and 4 \u003d\u003d len(msgid):"},{"line_number":137,"context_line":"            assert False, \"Unimplemented.\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        assert False, \"Unknown msgid type.\""},{"line_number":140,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_b266b1b9","line":137,"in_reply_to":"3a961159_a8756f33","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":6928,"name":"Ben Nemec","email":"openstack@nemebean.com","username":"bnemec"},"change_message_id":"f74806772b4ec85c347877076f6af3d32422c0f9","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        if isinstance(msgid, tuple) and 4 \u003d\u003d len(msgid):"},{"line_number":137,"context_line":"            assert False, \"Unimplemented.\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        assert False, \"Unknown msgid type.\""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def __mod__(self, other):"},{"line_number":142,"context_line":"        # When we mod a Message we want the actual operation to be performed"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_0892034b","line":139,"updated":"2015-01-02 17:53:51.000000000","message":"For the same reason, this should probably raise TypeError.","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"eebfde6f1c3eaa55126eff59f8e8b7306233223a","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        if isinstance(msgid, tuple) and 4 \u003d\u003d len(msgid):"},{"line_number":137,"context_line":"            assert False, \"Unimplemented.\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        assert False, \"Unknown msgid type.\""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def __mod__(self, other):"},{"line_number":142,"context_line":"        # When we mod a Message we want the actual operation to be performed"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a961159_f20759c7","line":139,"in_reply_to":"3a961159_0892034b","updated":"2015-01-04 07:11:02.000000000","message":"Done","commit_id":"f40e01bc07985f7053450e442ad94ad6a1c8c679"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"dc55f8204dbebe07750e2fe634167262ae63315f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                                   fallback\u003dTrue)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        # Primary translation function"},{"line_number":107,"context_line":"        if not isinstance(msgid, tuple):"},{"line_number":108,"context_line":"            translator \u003d lang.gettext if six.PY3 else lang.ugettext"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"            translated_message \u003d translator(msgid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa32b979_62dda06f","line":107,"updated":"2015-06-22 16:50:21.000000000","message":"I\u0027m not sure I\u0027m comfortable with the type and tuple-length checking to detect the message mode. We know when we instantiate the Message what mode it should have, right? Maybe we should pass some flags in so we can be explicit instead. I see below that you anticipate a combined mode with both plural and context, so maybe we need 2 separate boolean arguments.\n\nAnother option is to create subclasses of Message for the different cases, but I don\u0027t know if that\u0027s going to actually be easier to manage, since we only have this one function that behaves differently.","commit_id":"febb9b97311a210ce193ecc08471cca5708c8aea"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"cf581a7b5b163a1f59ec5d3090fee320ad013700","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __new__(cls, msgid, msgtext\u003dNone, params\u003dNone,"},{"line_number":42,"context_line":"                domain\u003d\u0027oslo\u0027, context\u003dFalse, plural\u003dFalse, *args):"},{"line_number":43,"context_line":"        \"\"\"Create a new Message object."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        In order for translation to work gettext requires a message ID, this"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa32b979_6c8132c3","line":42,"updated":"2015-06-26 21:34:42.000000000","message":"We use the name \"context\" in a lot of places to mean a context object, so I\u0027m afraid this name is going to be confusing. How about more explicitly boolean names like uses_context_form and uses_plural_form? I\u0027m not sure \"form\" is the right word. Maybe mode is better?","commit_id":"201098d0ae000e65c2559b4be6ad1c69fddf5c7e"},{"author":{"_account_id":10105,"name":"Peng Wu","email":"alexepico@gmail.com","username":"epico"},"change_message_id":"1dc4be67868572eeca8fa0c91c8717b1b88cf001","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __new__(cls, msgid, msgtext\u003dNone, params\u003dNone,"},{"line_number":42,"context_line":"                domain\u003d\u0027oslo\u0027, context\u003dFalse, plural\u003dFalse, *args):"},{"line_number":43,"context_line":"        \"\"\"Create a new Message object."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        In order for translation to work gettext requires a message ID, this"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_07bc356b","line":42,"in_reply_to":"fa32b979_6c8132c3","updated":"2015-06-29 06:50:37.000000000","message":"How about to use has_contextual_inform and has_plural_inform as argument names?\n\nAs we may support a message with both contextual and plural information in future.","commit_id":"201098d0ae000e65c2559b4be6ad1c69fddf5c7e"}]}
