At Thu, 15 Oct 2020 14:28:57 +0900, Masahiko Sawada 
<masahiko.saw...@2ndquadrant.com> wrote in 
> > ereport(..(errmsg("%s", _("hogehoge")))) results in
> > fprintf((translated("%s")), translate("hogehoge")).
> >
> > So your change (errmsg("%s", gettext_noop("hogehoge")) results in
> >
> > fprintf((translated("%s")), DONT_translate("hogehoge")).
> >
> > which leads to a translation problem.
> >
> > (errmsg(gettext_noop("hogehoge"))
> 
> This seems equivalent to (errmsg("hogehoge")), right?

Yes and no.  However eventually the two works the same way,
"(errmsg(gettext_noop("hogehoge"))" is a shorthand of

1: char *msg = gettext_noop("hogehoge");
...
2: .. (errmsg(msg));

That is, the line 1 only registers a message id "hogehoge" and doesn't
translate. The line 2 tries to translate the content of msg and it
finds the translation for the message id "hogehoge".

> I think I could understand translation stuff. Given we only report the
> const string returned from get_recovery_conflict_desc() without
> placeholders, the patch needs to use errmsg_internal() instead while
> not changing _() part. (errmsg(get_recovery_conflict_desc())) is not
> good (warned by -Wformat-security).

Ah, right. we get a complain if no value parameters added. We can
silence it by adding a dummy parameter to errmsg, but I'm not sure
which is preferable.

regards.


-- 
Kyotaro Horiguchi
NTT Open Source Software Center


Reply via email to