git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Cc: git@vger.kernel.org, Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH 2/2] object-name: make ambiguous object output translatable
Date: Mon, 4 Oct 2021 03:35:45 -0400	[thread overview]
Message-ID: <YVqu0aEBMy3mnYoE@coredump.intra.peff.net> (raw)
In-Reply-To: <patch-2.2-b6136380c28-20211004T013611Z-avarab@gmail.com>

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).

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).

>  	} 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.

> -	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.

> @@ -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.

-Peff

  reply	other threads:[~2021-10-04  7:36 UTC|newest]

Thread overview: 90+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-04  1:42 [PATCH 0/2] i18n: improve translatability of ambiguous object output Ævar Arnfjörð Bjarmason
2021-10-04  1:42 ` [PATCH 1/2] object-name tests: tighten up advise() output test Ævar Arnfjörð Bjarmason
2021-10-04  2:52   ` Eric Sunshine
2021-10-04  7:05   ` Jeff King
2021-10-04  1:42 ` [PATCH 2/2] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2021-10-04  7:35   ` Jeff King [this message]
2021-10-04  8:26     ` Ævar Arnfjörð Bjarmason
2021-10-04  9:29       ` Jeff King
2021-10-04 11:16         ` Ævar Arnfjörð Bjarmason
2021-10-04 12:07           ` Jeff King
2021-10-04 14:27 ` [PATCH v2 0/2] i18n: improve translatability of ambiguous object output Ævar Arnfjörð Bjarmason
2021-10-04 14:27   ` [PATCH v2 1/2] object.[ch]: mark object type names for translation Ævar Arnfjörð Bjarmason
2021-10-04 18:54     ` Eric Sunshine
2021-10-05  9:37     ` Bagas Sanjaya
2021-10-05 15:52       ` Ævar Arnfjörð Bjarmason
2021-10-06 19:05     ` Jeff King
2021-10-06 19:46       ` Junio C Hamano
2021-10-06 20:38         ` Jeff King
2021-10-07 18:06           ` Junio C Hamano
2021-10-04 14:27   ` [PATCH v2 2/2] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2021-10-06 19:11     ` Jeff King
2021-10-08 19:34   ` [PATCH v3 0/3] i18n: improve translatability of ambiguous object output Ævar Arnfjörð Bjarmason
2021-10-08 19:34     ` [PATCH v3 1/3] object-name: remove unreachable "unknown type" handling Ævar Arnfjörð Bjarmason
2021-10-08 19:34     ` [PATCH v3 2/3] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2021-10-08 19:34     ` [PATCH v3 3/3] object-name: show date for ambiguous tag objects Ævar Arnfjörð Bjarmason
2021-11-22 17:53     ` [PATCH v2 0/3] object-name: make ambiguous object output translatable + show tag date Ævar Arnfjörð Bjarmason
2021-11-22 17:53       ` [PATCH v4 1/3] object-name: remove unreachable "unknown type" handling Ævar Arnfjörð Bjarmason
2021-11-22 22:37         ` Jeff King
2021-11-22 17:53       ` [PATCH v4 2/3] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2021-11-22 17:53       ` [PATCH v4 3/3] object-name: show date for ambiguous tag objects Ævar Arnfjörð Bjarmason
2021-11-25 22:03       ` [PATCH v5 0/6] object-name: make ambiguous object output translatable + show tag date Ævar Arnfjörð Bjarmason
2021-11-25 22:03         ` [PATCH v5 1/6] object-name tests: add tests for ambiguous object blind spots Ævar Arnfjörð Bjarmason
2021-12-23 21:51           ` Josh Steadmon
2021-11-25 22:03         ` [PATCH v5 2/6] object-name: explicitly handle OBJ_BAD in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2021-12-23 21:51           ` Josh Steadmon
2021-12-23 22:42           ` Junio C Hamano
2021-11-25 22:03         ` [PATCH v5 3/6] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2021-12-23 21:54           ` [PATCH] fixup! " Josh Steadmon
2021-12-23 22:48             ` Junio C Hamano
2021-11-25 22:03         ` [PATCH v5 4/6] object-name: show date for ambiguous tag objects Ævar Arnfjörð Bjarmason
2021-11-25 22:03         ` [PATCH v5 5/6] object-name: iterate ambiguous objects before showing header Ævar Arnfjörð Bjarmason
2021-11-25 22:03         ` [PATCH v5 6/6] object-name: re-use "struct strbuf" in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2021-12-28 14:34         ` [PATCH v6 0/6] object-name: make ambiguous object output translatable + show tag date Ævar Arnfjörð Bjarmason
2021-12-28 14:34           ` [PATCH v6 1/6] object-name tests: add tests for ambiguous object blind spots Ævar Arnfjörð Bjarmason
2021-12-30 23:36             ` Junio C Hamano
2021-12-28 14:34           ` [PATCH v6 2/6] object-name: explicitly handle OBJ_BAD in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2021-12-28 14:34           ` [PATCH v6 3/6] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2021-12-30 23:46             ` Junio C Hamano
2021-12-28 14:35           ` [PATCH v6 4/6] object-name: show date for ambiguous tag objects Ævar Arnfjörð Bjarmason
2021-12-30 21:43             ` Junio C Hamano
2021-12-28 14:35           ` [PATCH v6 5/6] object-name: iterate ambiguous objects before showing header Ævar Arnfjörð Bjarmason
2021-12-28 14:35           ` [PATCH v6 6/6] object-name: re-use "struct strbuf" in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2021-12-28 15:18           ` [PATCH v8 0/7] progress: test fixes / cleanup Ævar Arnfjörð Bjarmason
2021-12-28 15:18             ` [PATCH v8 1/7] leak tests: fix a memory leak in "test-progress" helper Ævar Arnfjörð Bjarmason
2021-12-28 15:18             ` [PATCH v8 2/7] progress.c test helper: add missing braces Ævar Arnfjörð Bjarmason
2021-12-28 15:18             ` [PATCH v8 3/7] progress.c tests: make start/stop commands on stdin Ævar Arnfjörð Bjarmason
2021-12-28 16:25               ` Johannes Altmanninger
2021-12-28 15:19             ` [PATCH v8 4/7] progress.c tests: test some invalid usage Ævar Arnfjörð Bjarmason
2021-12-28 16:33               ` Johannes Altmanninger
2021-12-28 15:19             ` [PATCH v8 5/7] progress.c: add temporary variable from progress struct Ævar Arnfjörð Bjarmason
2021-12-28 16:05               ` René Scharfe
2021-12-28 16:13               ` Johannes Altmanninger
2021-12-28 15:19             ` [PATCH v8 6/7] pack-bitmap-write.c: don't return without stop_progress() Ævar Arnfjörð Bjarmason
2021-12-28 15:19             ` [PATCH v8 7/7] *.c: use isatty(0|2), not isatty(STDIN_FILENO|STDERR_FILENO) Ævar Arnfjörð Bjarmason
2021-12-28 16:47               ` René Scharfe
2021-12-28 23:56                 ` Ævar Arnfjörð Bjarmason
2022-01-08  0:45             ` [PATCH v8 0/7] progress: test fixes / cleanup Junio C Hamano
2022-01-12 12:39           ` [PATCH v7 0/6] object-name: make ambiguous object output translatable + show tag date Ævar Arnfjörð Bjarmason
2022-01-12 12:39             ` [PATCH v7 1/6] object-name tests: add tests for ambiguous object blind spots Ævar Arnfjörð Bjarmason
2022-01-13 22:39               ` Junio C Hamano
2022-01-14 12:07                 ` Ævar Arnfjörð Bjarmason
2022-01-14 18:45                   ` Junio C Hamano
2022-01-12 12:39             ` [PATCH v7 2/6] object-name: explicitly handle OBJ_BAD in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2022-01-12 12:39             ` [PATCH v7 3/6] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2022-01-12 12:39             ` [PATCH v7 4/6] object-name: show date for ambiguous tag objects Ævar Arnfjörð Bjarmason
2022-01-13 22:46               ` Junio C Hamano
2022-01-14 12:05                 ` Ævar Arnfjörð Bjarmason
2022-01-14 19:04                   ` Junio C Hamano
2022-01-14 19:35                     ` Ævar Arnfjörð Bjarmason
2022-01-12 12:39             ` [PATCH v7 5/6] object-name: iterate ambiguous objects before showing header Ævar Arnfjörð Bjarmason
2022-01-12 12:39             ` [PATCH v7 6/6] object-name: re-use "struct strbuf" in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2022-01-27  5:26             ` [PATCH v8 0/7] object-name: make ambiguous object output translatable + show tag date Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 1/7] object-name tests: add tests for ambiguous object blind spots Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 2/7] object-name: explicitly handle OBJ_BAD in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 3/7] object-name: explicitly handle bad tags " Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 4/7] object-name: make ambiguous object output translatable Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 5/7] object-name: show date for ambiguous tag objects Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 6/7] object-name: iterate ambiguous objects before showing header Ævar Arnfjörð Bjarmason
2022-01-27  5:26               ` [PATCH v8 7/7] object-name: re-use "struct strbuf" in show_ambiguous_object() Ævar Arnfjörð Bjarmason
2022-01-27 20:14               ` [PATCH v8 0/7] object-name: make ambiguous object output translatable + show tag date Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YVqu0aEBMy3mnYoE@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=avarab@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).