git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/2] object-name: make ambiguous object output translatable

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Oct 4, 2021, 08:26 UTC
Message-ID
<87o885nq4z.fsf@evledraar.gmail.com>
In-Reply-To
<YVqu0aEBMy3mnYoE@coredump.intra.peff.net>
On Mon, Oct 04 2021, Jeff King wrote:
Show 35 quoted lines
> On Mon, Oct 04, 2021 at 03:42:49AM +0200, Ævar Arnfjörð Bjarmason wrote:
>
>> Change the output of show_ambiguous_object() added in [1] and last
>> tweaked in [2] to be more friendly to translators. By being able to
>> customize the sprintf formats we're even ready for RTL languages.
>> 
>> 1. ef9b0370da6 (sha1-name.c: store and use repo in struct
>>    disambiguate_state, 2019-04-16)
>> 2. 5cc044e0257 (get_short_oid: sort ambiguous objects by type,
>>    then SHA-1, 2018-05-10)
>
> I suspect you meant 1ffa26c461 (get_short_sha1: list ambiguous objects
> on error, 2016-09-26) for the first one.
>
> I had to stare at the patch for a while to understand the goal here. I
> think this would have been a bit easier to review if "change" in your
> first sentence was described a bit more. Perhaps:
>
>   The list of candidates output by show_ambiguous_output() is not marked
>   for translation. At the very least we want to allow the text "the
>   candidates are" to be translated. But we also format individual
>   candidate lines like:
>
>       deadbeef commit 2021-01-01 - Some Commit Message
>
>   by formatting the individual components, then using a printf-format to
>   arrange them in the correct order. Even though there's no text here to
>   be translated, the order and spacing is determined by the format
>   string. Allowing that to be translated helps RTL languages.
>
> I have a few comments on the patch itself. The biggest thing is that it
> changes the format to add an extra newline (between "The candidates
> are:" and the actual list). I don't have a strong opinion on including
> that or not, but it seemed unintentional given the comment on the first
> commit (and its lack of mention here).
That was unintentional, sorry. Will fix.
Show 19 quoted lines
> The rest are mostly observations, not criticisms. You can take them with
> the appropriate grain of salt given that I don't do translation work
> myself, nor know any RTL languages.
>
>> @@ -366,18 +373,34 @@ static int show_ambiguous_object(const struct object_id *oid, void *data)
>>  		if (commit) {
>>  			struct pretty_print_context pp = {0};
>>  			pp.date_mode.type = DATE_SHORT;
>> -			format_commit_message(commit, " %ad - %s", &desc, &pp);
>> +			format_commit_message(commit, _(" %ad - %s"), &desc, &pp);
>>  		}
>
> Is it OK to use non-printf expansions with the gettext code? Presumably
> the translated string would have the same set of placeholders in it, but
> my understanding is that gettext may sometimes munge the %-placeholders
> (e.g., allowing numbered ones for re-ordering). I admit I don't know how
> any of that works, but I just wonder if this "%ad" may cause confusion
> (or even if not, if it is even possible to re-order it for an RTL
> language).

It's not, oops. I missed that, blinders on for the "%ad". Will construct it in advance and use %s interpolation separately.

Show 36 quoted lines
>>  	} else if (type == OBJ_TAG) {
>>  		struct tag *tag = lookup_tag(ds->repo, oid);
>>  		if (!parse_tag(tag) && tag->tag)
>> -			strbuf_addf(&desc, " %s", tag->tag);
>> +			strbuf_addf(&desc, _(" %s"), tag->tag);
>>  	}
>
> I wonder whether " %s" is worthwhile as a translatable string. It does
> seem to be unique among strings marked for translation, but there are a
> ton of non-translated instances. Would context ever matter here?
>
> My impression is that this kind of translation-lego is frowned upon, and
> we might be better off repeating ourselves a bit more. I.e., something
> like:
>
>   if (commit) {
> 	  struct strbuf date = STRBUF_INIT;
> 	  struct strbuf subject = STRBUF_INIT;
> 	  format_commit_message(commit, "%ad", &date, &pp);
> 	  format_commit_message(commit, "%s", &subject, &pp);
> 	  strbuf_addf(advice, _("  %s commit %s - %s\n"),
> 		      repo_find_unique_abbrev(...),
> 		      date.buf, subject.buf);
> 	  strbuf_release(&date);
> 	  strbuf_release(&subject);
>   } else if (type == OBJ_TAG) {
>           ...
> 	  strbuf_addf(advice, _("  %s tag %s\n"),
> 	              repo_find_unique_abbrev(...), tag->tag);
>   } else {
> 	  /* TRANSLATORS: the fields are abbreviated oid and type */
>           strbuf_addf(advice, _("  %s %s\n"),
> 	              repo_find_unique_abbrev(...), type_name(type));
>   }
>
> Though that last one similarly has a real lack of context.
Yeah that's better. Will change it to something like that.
Show 27 quoted lines
>> -	advise("  %s %s%s",
>> -	       repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV),
>> -	       type_name(type) ? type_name(type) : "unknown type",
>> -	       desc.buf);
>> +	strbuf_addf(advice,
>> +		    /*
>> +		     * TRANSLATORS: This is a line of ambiguous object
>> +		     * output. E.g.:
>> +		     *
>> +		     *    "deadbeef commit 2021-01-01 - Some Commit Message\n"
>> +		     *    "deadbeef tag Some Tag Message\n"
>> +		     *    "deadbeef tree\n"
>> +		     *
>> +		     * I.e. the first argument is a short OID, the
>> +		     * second is the type name of the object, and the
>> +		     * third a description of the object, if it's a
>> +		     * commit or tag. In that case the " %ad - %s" and
>> +		     * " %s" formats above will be used for the third
>> +		     * argument.
>> +		     */
>> +		    _("  %s %s%s\n"),
>> +		    repo_find_unique_abbrev(ds->repo, oid, DEFAULT_ABBREV),
>> +		    type_name(type) ? type_name(type) : "unknown type",
>> +		    desc.buf);
>
> Would you want to translate "unknown type" here, as well? It's probably
> not that important in practice, but it seems like a funny omission.
Willdo.
Show 34 quoted lines
>> @@ -488,12 +516,19 @@ static enum get_oid_result get_short_oid(struct repository *r,
>>  		if (!ds.ambiguous)
>>  			ds.fn = NULL;
>>  
>> -		advise(_("The candidates are:"));
>>  		repo_for_each_abbrev(r, ds.hex_pfx, collect_ambiguous, &collect);
>>  		sort_ambiguous_oid_array(r, &collect);
>>  
>> -		if (oid_array_for_each(&collect, show_ambiguous_object, &ds))
>> +		if (oid_array_for_each(&collect, show_ambiguous_object, &as))
>>  			BUG("show_ambiguous_object shouldn't return non-zero");
>> +
>> +		/*
>> +		 * TRANSLATORS: The argument is the list of ambiguous
>> +		 * objects composed in show_ambiguous_object(). See
>> +		 * its "TRANSLATORS" comment for details.
>> +		 */
>> +		advise(_("The candidates are:\n\n%s"), sb.buf);
>
> Here's where the extra newline.
>
> I understand why the earlier ones were changed for RTL languages. But
> this one is always line-oriented. Is the point to help bottom-to-top
> languages? I can buy that, though it feels like that would be something
> that the terminal would deal with (because even with this, you're still
> getting the "error:" line printed separately, for example).
>
> I don't think what this is doing is wrong (at first I wondered about the
> "hint:" lines, but because advise() looks for embedded newlines, we're
> OK). But if the translation doesn't need to reorder things across lines,
> this extra format-into-a-strbuf step doesn't seem necessary. We can just
> call advise() directly in show_ambiguous_object(), as before.
>
> If it is necessary, then note that you leak "sb" here.

I'll keep that bit as-is, it's not strictly necessary, but it gives translators a bit more context.

Previous: Jeff KingNext: Jeff King
Message 7 of 90 in “i18n: improve translatability of ambiguous object output”
  1. 0/2 i18n: improve translatability of ambiguous object outputÆvar Arnfjörð Bjarmason, Oct 4, 2021
  2. 1/2 object-name tests: tighten up advise() output testÆvar Arnfjörð Bjarmason, Oct 4, 2021
  3. Eric SunshineOct 4, 2021
  4. Jeff KingOct 4, 2021
  5. 2/2 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Oct 4, 2021
  6. Jeff KingOct 4, 2021
  7. Ævar Arnfjörð BjarmasonOct 4, 2021
  8. Jeff KingOct 4, 2021
  9. Ævar Arnfjörð BjarmasonOct 4, 2021
  10. Jeff KingOct 4, 2021
  11. 0/2 i18n: improve translatability of ambiguous object outputÆvar Arnfjörð Bjarmason, Oct 4, 2021
  12. 1/2 object.[ch]: mark object type names for translationÆvar Arnfjörð Bjarmason, Oct 4, 2021
  13. Eric SunshineOct 4, 2021
  14. Bagas SanjayaOct 5, 2021
  15. Ævar Arnfjörð BjarmasonOct 5, 2021
  16. Jeff KingOct 6, 2021
  17. Junio C HamanoOct 6, 2021
  18. Jeff KingOct 6, 2021
  19. Junio C HamanoOct 7, 2021
  20. 2/2 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Oct 4, 2021
  21. Jeff KingOct 6, 2021
  22. 0/3 i18n: improve translatability of ambiguous object outputÆvar Arnfjörð Bjarmason, Oct 8, 2021
  23. 1/3 object-name: remove unreachable "unknown type" handlingÆvar Arnfjörð Bjarmason, Oct 8, 2021
  24. 2/3 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Oct 8, 2021
  25. 3/3 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Oct 8, 2021
  26. 0/3 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Nov 22, 2021
  27. 3/3 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Nov 22, 2021
  28. 1/3 object-name: remove unreachable "unknown type" handlingÆvar Arnfjörð Bjarmason, Nov 22, 2021
  29. Jeff KingNov 22, 2021
  30. 2/3 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Nov 22, 2021
  31. 0/6 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Nov 25, 2021
  32. 1/6 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Nov 25, 2021
  33. Josh SteadmonDec 23, 2021
  34. 2/6 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Nov 25, 2021
  35. Josh SteadmonDec 23, 2021
  36. Junio C HamanoDec 23, 2021
  37. 3/6 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Nov 25, 2021
  38. fixup! object-name: make ambiguous object output translatableJosh Steadmon, Dec 23, 2021
  39. Junio C HamanoDec 23, 2021
  40. 4/6 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Nov 25, 2021
  41. 5/6 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Nov 25, 2021
  42. 6/6 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Nov 25, 2021
  43. 0/6 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Dec 28, 2021
  44. 1/6 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Dec 28, 2021
  45. Junio C HamanoDec 30, 2021
  46. 3/6 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Dec 28, 2021
  47. Junio C HamanoDec 30, 2021
  48. 2/6 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Dec 28, 2021
  49. 4/6 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Dec 28, 2021
  50. Junio C HamanoDec 30, 2021
  51. 5/6 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Dec 28, 2021
  52. 6/6 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Dec 28, 2021
  53. 0/7 progress: test fixes / cleanupÆvar Arnfjörð Bjarmason, Dec 28, 2021
  54. 1/7 leak tests: fix a memory leak in "test-progress" helperÆvar Arnfjörð Bjarmason, Dec 28, 2021
  55. 2/7 progress.c test helper: add missing bracesÆvar Arnfjörð Bjarmason, Dec 28, 2021
  56. 3/7 progress.c tests: make start/stop commands on stdinÆvar Arnfjörð Bjarmason, Dec 28, 2021
  57. Johannes AltmanningerDec 28, 2021
  58. 4/7 progress.c tests: test some invalid usageÆvar Arnfjörð Bjarmason, Dec 28, 2021
  59. Johannes AltmanningerDec 28, 2021
  60. 6/7 pack-bitmap-write.c: don't return without stop_progress()Ævar Arnfjörð Bjarmason, Dec 28, 2021
  61. 5/7 progress.c: add temporary variable from progress structÆvar Arnfjörð Bjarmason, Dec 28, 2021
  62. René ScharfeDec 28, 2021
  63. Johannes AltmanningerDec 28, 2021
  64. 7/7 *.c: use isatty(0|2), not isatty(STDIN_FILENO|STDERR_FILENO)Ævar Arnfjörð Bjarmason, Dec 28, 2021
  65. René ScharfeDec 28, 2021
  66. Ævar Arnfjörð BjarmasonDec 28, 2021
  67. Junio C HamanoJan 8, 2022
  68. 0/6 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Jan 12, 2022
  69. 1/6 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Jan 12, 2022
  70. Junio C HamanoJan 13, 2022
  71. Ævar Arnfjörð BjarmasonJan 14, 2022
  72. Junio C HamanoJan 14, 2022
  73. 2/6 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 12, 2022
  74. 3/6 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Jan 12, 2022
  75. 4/6 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Jan 12, 2022
  76. Junio C HamanoJan 13, 2022
  77. Ævar Arnfjörð BjarmasonJan 14, 2022
  78. Junio C HamanoJan 14, 2022
  79. Ævar Arnfjörð BjarmasonJan 14, 2022
  80. 5/6 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Jan 12, 2022
  81. 6/6 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 12, 2022
  82. 0/7 object-name: make ambiguous object output translatable + show tag dateÆvar Arnfjörð Bjarmason, Jan 27, 2022
  83. 1/7 object-name tests: add tests for ambiguous object blind spotsÆvar Arnfjörð Bjarmason, Jan 27, 2022
  84. 2/7 object-name: explicitly handle OBJ_BAD in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 27, 2022
  85. 3/7 object-name: explicitly handle bad tags in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 27, 2022
  86. 4/7 object-name: make ambiguous object output translatableÆvar Arnfjörð Bjarmason, Jan 27, 2022
  87. 6/7 object-name: iterate ambiguous objects before showing headerÆvar Arnfjörð Bjarmason, Jan 27, 2022
  88. 5/7 object-name: show date for ambiguous tag objectsÆvar Arnfjörð Bjarmason, Jan 27, 2022
  89. 7/7 object-name: re-use "struct strbuf" in show_ambiguous_object()Ævar Arnfjörð Bjarmason, Jan 27, 2022
  90. Junio C HamanoJan 27, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.