{"thread":{"id":"45828","subject":"[PATCH] i18n: remove i18n from tag reflog message","startedAt":"2017-04-29T10:03:17Z","lastAt":"2017-05-04T01:38:46Z","messageCount":9,"participants":["Jean-Noel Avila","Junio C Hamano","Ævar Arnfjörð Bjarmason","Jean-Noël AVILA"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"318231","messageId":"20170429100253.4710-1-jn.avila@free.fr","threadId":"45828","inReplyTo":null,"subject":"[PATCH] i18n: remove i18n from tag reflog message","fromName":"Jean-Noel Avila","fromEmail":"jn.avila@free.fr","sentAt":"2017-04-29T10:02:53Z","receivedAt":"2017-04-29T10:03:17Z","isPatch":true,"sender":{"key":"jn.avila@free.fr","avatar":"https://avatars.githubusercontent.com/u/156172?v=4"},"body":"The building of the reflog message is using strbuf, which is not\nfriendly with internationalization frameworks. No other reflog\nmessages are translated right now and switching all the messages to\ni18n would require a major rework of the way the messages are built.\n\nSigned-off-by: Jean-Noel Avila <jn.avila@free.fr>\n---\n builtin/tag.c | 12 ++++++------\n 1 file changed, 6 insertions(+), 6 deletions(-)\n\ndiff --git a/builtin/tag.c b/builtin/tag.c\nindex 222404522..bdf1e88e9 100644\n--- a/builtin/tag.c\n+++ b/builtin/tag.c\n@@ -309,7 +309,7 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n \tif (rla) {\n \t\tstrbuf_addstr(sb, rla);\n \t} else {\n-\t\tstrbuf_addstr(sb, _(\"tag: tagging \"));\n+\t\tstrbuf_addstr(sb, \"tag: tagging \");\n \t\tstrbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);\n \t}\n \n@@ -317,14 +317,14 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n \ttype = sha1_object_info(sha1, NULL);\n \tswitch (type) {\n \tdefault:\n-\t\tstrbuf_addstr(sb, _(\"object of unknown type\"));\n+\t\tstrbuf_addstr(sb, \"object of unknown type\");\n \t\tbreak;\n \tcase OBJ_COMMIT:\n \t\tif ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {\n \t\t\tsubject_len = find_commit_subject(buf, &subject_start);\n \t\t\tstrbuf_insert(sb, sb->len, subject_start, subject_len);\n \t\t} else {\n-\t\t\tstrbuf_addstr(sb, _(\"commit object\"));\n+\t\t\tstrbuf_addstr(sb, \"commit object\");\n \t\t}\n \t\tfree(buf);\n \n@@ -332,13 +332,13 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n \t\t\tstrbuf_addf(sb, \", %s\", show_date(c->date, 0, DATE_MODE(SHORT)));\n \t\tbreak;\n \tcase OBJ_TREE:\n-\t\tstrbuf_addstr(sb, _(\"tree object\"));\n+\t\tstrbuf_addstr(sb, \"tree object\");\n \t\tbreak;\n \tcase OBJ_BLOB:\n-\t\tstrbuf_addstr(sb, _(\"blob object\"));\n+\t\tstrbuf_addstr(sb, \"blob object\");\n \t\tbreak;\n \tcase OBJ_TAG:\n-\t\tstrbuf_addstr(sb, _(\"other tag object\"));\n+\t\tstrbuf_addstr(sb, \"other tag object\");\n \t\tbreak;\n \t}\n \tstrbuf_addch(sb, ')');\n-- \n2.12.0\n\n"},{"id":"318268","messageId":"20170430213248.21638-1-jn.avila@free.fr","threadId":"45828","inReplyTo":"20170429100253.4710-1-jn.avila@free.fr","subject":"[PATCH v2] i18n patches to apply for rc2","fromName":"Jean-Noel Avila","fromEmail":"jn.avila@free.fr","sentAt":"2017-04-30T21:32:46Z","receivedAt":"2017-04-30T21:36:13Z","isPatch":true,"sender":{"key":"jn.avila@free.fr","avatar":"https://avatars.githubusercontent.com/u/156172?v=4"},"body":"Please apply the following patches for rc2 so that the localization\ncan be applied on a cleaned up pot file.\n\n"},{"id":"318269","messageId":"20170430213248.21638-2-jn.avila@free.fr","threadId":"45828","inReplyTo":"20170430213248.21638-1-jn.avila@free.fr","subject":"[PATCH v2 1/2] i18n: remove i18n from tag reflog message","fromName":"Jean-Noel Avila","fromEmail":"jn.avila@free.fr","sentAt":"2017-04-30T21:32:47Z","receivedAt":"2017-04-30T21:36:14Z","isPatch":true,"sender":{"key":"jn.avila@free.fr","avatar":"https://avatars.githubusercontent.com/u/156172?v=4"},"body":"The building of the reflog message is using strbuf, which is not\nfriendly with internationalization frameworks. No other reflog\nmessages are translated right now and switching all the messages to\ni18n would require a major rework of the way the messages are built.\n\nSigned-off-by: Jean-Noel Avila <jn.avila@free.fr>\n---\n builtin/tag.c | 12 ++++++------\n 1 file changed, 6 insertions(+), 6 deletions(-)\n\ndiff --git a/builtin/tag.c b/builtin/tag.c\nindex 222404522..bdf1e88e9 100644\n--- a/builtin/tag.c\n+++ b/builtin/tag.c\n@@ -309,7 +309,7 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n \tif (rla) {\n \t\tstrbuf_addstr(sb, rla);\n \t} else {\n-\t\tstrbuf_addstr(sb, _(\"tag: tagging \"));\n+\t\tstrbuf_addstr(sb, \"tag: tagging \");\n \t\tstrbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);\n \t}\n \n@@ -317,14 +317,14 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n \ttype = sha1_object_info(sha1, NULL);\n \tswitch (type) {\n \tdefault:\n-\t\tstrbuf_addstr(sb, _(\"object of unknown type\"));\n+\t\tstrbuf_addstr(sb, \"object of unknown type\");\n \t\tbreak;\n \tcase OBJ_COMMIT:\n \t\tif ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {\n \t\t\tsubject_len = find_commit_subject(buf, &subject_start);\n \t\t\tstrbuf_insert(sb, sb->len, subject_start, subject_len);\n \t\t} else {\n-\t\t\tstrbuf_addstr(sb, _(\"commit object\"));\n+\t\t\tstrbuf_addstr(sb, \"commit object\");\n \t\t}\n \t\tfree(buf);\n \n@@ -332,13 +332,13 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n \t\t\tstrbuf_addf(sb, \", %s\", show_date(c->date, 0, DATE_MODE(SHORT)));\n \t\tbreak;\n \tcase OBJ_TREE:\n-\t\tstrbuf_addstr(sb, _(\"tree object\"));\n+\t\tstrbuf_addstr(sb, \"tree object\");\n \t\tbreak;\n \tcase OBJ_BLOB:\n-\t\tstrbuf_addstr(sb, _(\"blob object\"));\n+\t\tstrbuf_addstr(sb, \"blob object\");\n \t\tbreak;\n \tcase OBJ_TAG:\n-\t\tstrbuf_addstr(sb, _(\"other tag object\"));\n+\t\tstrbuf_addstr(sb, \"other tag object\");\n \t\tbreak;\n \t}\n \tstrbuf_addch(sb, ')');\n-- \n2.12.0\n\n"},{"id":"318270","messageId":"20170430213248.21638-3-jn.avila@free.fr","threadId":"45828","inReplyTo":"20170430213248.21638-1-jn.avila@free.fr","subject":"[PATCH v2 2/2] i18n: read-cache: Fix typo","fromName":"Jean-Noel Avila","fromEmail":"jn.avila@free.fr","sentAt":"2017-04-30T21:32:48Z","receivedAt":"2017-04-30T21:36:18Z","isPatch":true,"sender":{"key":"jn.avila@free.fr","avatar":"https://avatars.githubusercontent.com/u/156172?v=4"},"body":"From: Peter Krefting <peter@softwolves.pp.se>\n\nSigned-off-by: Peter Krefting <peter@softwolves.pp.se>\nSigned-off-by: Jean-Noel Avila <jn.avila@free.fr>\n---\n read-cache.c | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/read-cache.c b/read-cache.c\nindex b3d0f3c30..0d0081a11 100644\n--- a/read-cache.c\n+++ b/read-cache.c\n@@ -2372,7 +2372,7 @@ static int should_delete_shared_index(const char *shared_index_path)\n \tif (!expiration)\n \t\treturn 0;\n \tif (stat(shared_index_path, &st))\n-\t\treturn error_errno(_(\"could not stat '%s\"), shared_index_path);\n+\t\treturn error_errno(_(\"could not stat '%s'\"), shared_index_path);\n \tif (st.st_mtime > expiration)\n \t\treturn 0;\n \n-- \n2.12.0\n\n"},{"id":"318282","messageId":"xmqqwpa1ic4e.fsf@gitster.mtv.corp.google.com","threadId":"45828","inReplyTo":"20170429100253.4710-1-jn.avila@free.fr","subject":"Re: [PATCH] i18n: remove i18n from tag reflog message","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2017-05-01T01:45:05Z","receivedAt":"2017-05-01T01:45:12Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jean-Noel Avila <jn.avila@free.fr> writes:\n\n> The building of the reflog message is using strbuf, which is not\n> friendly with internationalization frameworks. No other reflog\n> messages are translated right now and switching all the messages to\n> i18n would require a major rework of the way the messages are built.\n\nThanks for spotting.  Before we declare that reflog messages are for\ni18n, we'd need to either drop (or redesign the implementation of)\nthe \"checkout -\" feature, which relies on the exact phrasing of how\nreflog entries from \"git checkout\" looks like.\n\nWill queue and merge down to 'master' quickly.\n\n>\n> Signed-off-by: Jean-Noel Avila <jn.avila@free.fr>\n> ---\n>  builtin/tag.c | 12 ++++++------\n>  1 file changed, 6 insertions(+), 6 deletions(-)\n>\n> diff --git a/builtin/tag.c b/builtin/tag.c\n> index 222404522..bdf1e88e9 100644\n> --- a/builtin/tag.c\n> +++ b/builtin/tag.c\n> @@ -309,7 +309,7 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n>  \tif (rla) {\n>  \t\tstrbuf_addstr(sb, rla);\n>  \t} else {\n> -\t\tstrbuf_addstr(sb, _(\"tag: tagging \"));\n> +\t\tstrbuf_addstr(sb, \"tag: tagging \");\n>  \t\tstrbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);\n>  \t}\n>  \n> @@ -317,14 +317,14 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n>  \ttype = sha1_object_info(sha1, NULL);\n>  \tswitch (type) {\n>  \tdefault:\n> -\t\tstrbuf_addstr(sb, _(\"object of unknown type\"));\n> +\t\tstrbuf_addstr(sb, \"object of unknown type\");\n>  \t\tbreak;\n>  \tcase OBJ_COMMIT:\n>  \t\tif ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {\n>  \t\t\tsubject_len = find_commit_subject(buf, &subject_start);\n>  \t\t\tstrbuf_insert(sb, sb->len, subject_start, subject_len);\n>  \t\t} else {\n> -\t\t\tstrbuf_addstr(sb, _(\"commit object\"));\n> +\t\t\tstrbuf_addstr(sb, \"commit object\");\n>  \t\t}\n>  \t\tfree(buf);\n>  \n> @@ -332,13 +332,13 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n>  \t\t\tstrbuf_addf(sb, \", %s\", show_date(c->date, 0, DATE_MODE(SHORT)));\n>  \t\tbreak;\n>  \tcase OBJ_TREE:\n> -\t\tstrbuf_addstr(sb, _(\"tree object\"));\n> +\t\tstrbuf_addstr(sb, \"tree object\");\n>  \t\tbreak;\n>  \tcase OBJ_BLOB:\n> -\t\tstrbuf_addstr(sb, _(\"blob object\"));\n> +\t\tstrbuf_addstr(sb, \"blob object\");\n>  \t\tbreak;\n>  \tcase OBJ_TAG:\n> -\t\tstrbuf_addstr(sb, _(\"other tag object\"));\n> +\t\tstrbuf_addstr(sb, \"other tag object\");\n>  \t\tbreak;\n>  \t}\n>  \tstrbuf_addch(sb, ')');\n"},{"id":"318355","messageId":"CACBZZX6kVihx43o7AKkb+DZtPUoHOw027VpLcMD-09fN=XnxbA@mail.gmail.com","threadId":"45828","inReplyTo":"20170429100253.4710-1-jn.avila@free.fr","subject":"Re: [PATCH] i18n: remove i18n from tag reflog message","fromName":"Ævar Arnfjörð Bjarmason","fromEmail":"avarab@gmail.com","sentAt":"2017-05-01T09:15:20Z","receivedAt":"2017-05-01T09:15:48Z","isPatch":true,"sender":{"key":"avarab@gmail.com","avatar":"https://avatars.githubusercontent.com/u/45301?v=4"},"body":"On Sat, Apr 29, 2017 at 12:02 PM, Jean-Noel Avila <jn.avila@free.fr> wrote:\n> The building of the reflog message is using strbuf, which is not\n> friendly with internationalization frameworks. No other reflog\n> messages are translated right now and switching all the messages to\n> i18n would require a major rework of the way the messages are built.\n\n[CC'd Cornelius Weig who added the code you're modifying]\n\nIf I'm reading this correctly this is a good patch but quite a bad\nexplanation of what we're changing.\n\nThe problem here is not that it's cumbersome to translate this using\nstrbuf, but that we're injecting i18n'd messages into the reflog, so\ne.g. someone with a Chinese locale creating a tag in a shared repo\nwill cause the Chinese i18n message to be inserted into the reflog,\nand then someone with e.g. a German or English locale will see the\nChinese messages when they run \"git reflog\".\n\nThat's a very bad thing, and in some ways worse than translating\nplumbing messages, because here we're injecting i18n'd messages into\nthe on-disk format.\n\nLuckily this hasn't made it into 2.13 yet. Junio, if the above\ndescription is accurate then this is something we definitely want in\nthe final 2.13.\n\n\n> Signed-off-by: Jean-Noel Avila <jn.avila@free.fr>\n> ---\n>  builtin/tag.c | 12 ++++++------\n>  1 file changed, 6 insertions(+), 6 deletions(-)\n>\n> diff --git a/builtin/tag.c b/builtin/tag.c\n> index 222404522..bdf1e88e9 100644\n> --- a/builtin/tag.c\n> +++ b/builtin/tag.c\n> @@ -309,7 +309,7 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n>         if (rla) {\n>                 strbuf_addstr(sb, rla);\n>         } else {\n> -               strbuf_addstr(sb, _(\"tag: tagging \"));\n> +               strbuf_addstr(sb, \"tag: tagging \");\n>                 strbuf_add_unique_abbrev(sb, sha1, DEFAULT_ABBREV);\n>         }\n>\n> @@ -317,14 +317,14 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n>         type = sha1_object_info(sha1, NULL);\n>         switch (type) {\n>         default:\n> -               strbuf_addstr(sb, _(\"object of unknown type\"));\n> +               strbuf_addstr(sb, \"object of unknown type\");\n>                 break;\n>         case OBJ_COMMIT:\n>                 if ((buf = read_sha1_file(sha1, &type, &size)) != NULL) {\n>                         subject_len = find_commit_subject(buf, &subject_start);\n>                         strbuf_insert(sb, sb->len, subject_start, subject_len);\n>                 } else {\n> -                       strbuf_addstr(sb, _(\"commit object\"));\n> +                       strbuf_addstr(sb, \"commit object\");\n>                 }\n>                 free(buf);\n>\n> @@ -332,13 +332,13 @@ static void create_reflog_msg(const unsigned char *sha1, struct strbuf *sb)\n>                         strbuf_addf(sb, \", %s\", show_date(c->date, 0, DATE_MODE(SHORT)));\n>                 break;\n>         case OBJ_TREE:\n> -               strbuf_addstr(sb, _(\"tree object\"));\n> +               strbuf_addstr(sb, \"tree object\");\n>                 break;\n>         case OBJ_BLOB:\n> -               strbuf_addstr(sb, _(\"blob object\"));\n> +               strbuf_addstr(sb, \"blob object\");\n>                 break;\n>         case OBJ_TAG:\n> -               strbuf_addstr(sb, _(\"other tag object\"));\n> +               strbuf_addstr(sb, \"other tag object\");\n>                 break;\n>         }\n>         strbuf_addch(sb, ')');\n> --\n> 2.12.0\n>\n"},{"id":"318670","messageId":"2070499.EYhsb04HyH@cayenne","threadId":"45828","inReplyTo":"xmqqwpa1ic4e.fsf@gitster.mtv.corp.google.com","subject":"Re: [PATCH] i18n: remove i18n from tag reflog message","fromName":"Jean-Noël AVILA","fromEmail":"jn.avila@free.fr","sentAt":"2017-05-03T16:38:45Z","receivedAt":"2017-05-03T16:38:54Z","isPatch":true,"sender":{"key":"jn.avila@free.fr","avatar":"https://avatars.githubusercontent.com/u/156172?v=4"},"body":"Le dimanche 30 avril 2017, 18:45:05 CEST Junio C Hamano a écrit :\n> Jean-Noel Avila <jn.avila@free.fr> writes:\n> > The building of the reflog message is using strbuf, which is not\n> > friendly with internationalization frameworks. No other reflog\n> > messages are translated right now and switching all the messages to\n> > i18n would require a major rework of the way the messages are built.\n> \n> Thanks for spotting.  Before we declare that reflog messages are for\n> i18n, we'd need to either drop (or redesign the implementation of)\n> the \"checkout -\" feature, which relies on the exact phrasing of how\n> reflog entries from \"git checkout\" looks like.\n> \n> Will queue and merge down to 'master' quickly.\n> \n\nI didn't know this \"side effect\". Maybe adding a test against it would be \nrequiered. Unfortunately, I don't know enough of it.\n"},{"id":"318714","messageId":"xmqqfuglcskt.fsf@gitster.mtv.corp.google.com","threadId":"45828","inReplyTo":"2070499.EYhsb04HyH@cayenne","subject":"Re: [PATCH] i18n: remove i18n from tag reflog message","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2017-05-04T01:35:14Z","receivedAt":"2017-05-04T01:35:24Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jean-Noël AVILA <jn.avila@free.fr> writes:\n\n> Le dimanche 30 avril 2017, 18:45:05 CEST Junio C Hamano a écrit :\n>> Jean-Noel Avila <jn.avila@free.fr> writes:\n>> > The building of the reflog message is using strbuf, which is not\n>> > friendly with internationalization frameworks. No other reflog\n>> > messages are translated right now and switching all the messages to\n>> > i18n would require a major rework of the way the messages are built.\n>> \n>> Thanks for spotting.  Before we declare that reflog messages are for\n>> i18n, we'd need to either drop (or redesign the implementation of)\n>> the \"checkout -\" feature, which relies on the exact phrasing of how\n>> reflog entries from \"git checkout\" looks like.\n>> \n>> Will queue and merge down to 'master' quickly.\n>> \n>\n> I didn't know this \"side effect\". Maybe adding a test against it would be \n> requiered. Unfortunately, I don't know enough of it.\n\nSorry, but I am not sure what \"side effect\" you are referring to.  I\nam saying that in the current codebase not translating tag reflog\nmessage (i.e. your fix) is the right thing to do.\n\nbuiltin/checkout.c does\n\n\t\tstrbuf_addf(&msg, \"checkout: moving from %s to %s\",\n\t\t\told_desc ? old_desc : \"(invalid)\", new->name);\n\nwhen \"git checkout\" is used to switch from old to new branch.  The\nabove phrasing is used by sha1_name.c::grab_nth_branch_switch() to\nknow what branch you were on, and not having _() around the message\nis the right thing to do, at least in the current codebase.\n\nIf somebody wants to i18n the reflog message, that needs to be done\nat the reading/dispaying end, I would think.  Instead of being purely\ntextual records, a new reflog format would have to be a machine\nparsable message-id with parameters, and the code that wants to\nunderstand the reflog record like grab_nth_branch_switch(), as\nopposed to show the record to the humans, would just use the machine\nparsable raw data, while \"git reflog\" and friends that format the\nreflog record would give the message-id to gettext and feed the\nparameters recorded using the result of gettext() as the format\nstring to fprintf(), or something like that.\n\n\n\n\n\n"},{"id":"318715","messageId":"xmqqefw5csf4.fsf@gitster.mtv.corp.google.com","threadId":"45828","inReplyTo":"2070499.EYhsb04HyH@cayenne","subject":"Re: [PATCH] i18n: remove i18n from tag reflog message","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2017-05-04T01:38:39Z","receivedAt":"2017-05-04T01:38:46Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jean-Noël AVILA <jn.avila@free.fr> writes:\n\n> Le dimanche 30 avril 2017, 18:45:05 CEST Junio C Hamano a écrit :\n>> Jean-Noel Avila <jn.avila@free.fr> writes:\n>> > The building of the reflog message is using strbuf, which is not\n>> > friendly with internationalization frameworks. No other reflog\n>> > messages are translated right now and switching all the messages to\n>> > i18n would require a major rework of the way the messages are built.\n>> \n>> Thanks for spotting.  Before we declare that reflog messages are for\n>> i18n, we'd need to either drop (or redesign the implementation of)\n>> the \"checkout -\" feature, which relies on the exact phrasing of how\n>> reflog entries from \"git checkout\" looks like.\n>> \n>> Will queue and merge down to 'master' quickly.\n>> \n>\n> I didn't know this \"side effect\". Maybe adding a test against it would be \n> requiered. Unfortunately, I don't know enough of it.\n\nSorry, but I am not sure what \"side effect\" you are referring to.  I\nam saying that in the current codebase not translating tag reflog\nmessage (i.e. your fix) is the right thing to do.\n\nbuiltin/checkout.c does\n\n\t\tstrbuf_addf(&msg, \"checkout: moving from %s to %s\",\n\t\t\told_desc ? old_desc : \"(invalid)\", new->name);\n\nwhen \"git checkout\" is used to switch from old to new branch.  The\nabove phrasing is used by sha1_name.c::grab_nth_branch_switch() to\nknow what branch you were on, and not having _() around the message\nis the right thing to do, at least in the current codebase.\n\nIf somebody wants to i18n the reflog message, that needs to be done\nat the reading/dispaying end, I would think.  Instead of being purely\ntextual records, a new reflog format would have to be a machine\nparsable message-id with parameters, and the code that wants to\nunderstand the reflog record like grab_nth_branch_switch(), as\nopposed to show the record to the humans, would just use the machine\nparsable raw data, while \"git reflog\" and friends that format the\nreflog record would give the message-id to gettext and feed the\nparameters recorded using the result of gettext() as the format\nstring to fprintf(), or something like that.\n\nThat would solve the issue in multi-user repository Ævar raised,\ntoo.  You'd see Chinese reflog entry not because the person who did\nthe operation that created the reflog entry were writing Chinese,\nbut because your locale is set to show Chinese when you tried to\nread the reflog.  German users would see the reflog entry that\nrecords what the Chinese developer did in German if we follow that\nroute.\n\n\n"}]}