Hey Junio,
On Sat, Aug 13, 2016 at 12:19 AM, Junio C Hamano <[email protected]> wrote:
> Junio C Hamano <[email protected]> writes:
>
>> Pranit Bauva <[email protected]> writes:
>>
>>> +static int bisect_next_check(const struct bisect_terms *terms,
>>> + const char *current_term)
>>> +{
>>> + ....
>>> + fprintf(stderr, N_("Warning: bisecting only with a %s
>>> commit\n"),
>>> + terms->term_bad.buf);
>>
>> Hmph, is this N_() and not _()?
>
> I recall you saying that you are not familiar with i18n. As it is a
> good skill to have outside the context of this project, let's do a
> quick primer. GSoC is a learning experience ;-).
True! :)
> There is a runtime function "gettext()" that takes a string, which
> is typically a printf format string, and gives another string. You
> feed your message in the original language, meant to be used in the
> C locale, and the function gives it translated into the end-user's
> language, specified by environment variables like $LC_MESSAGES.
>
> Since it is too cumbersome to write gettext() all the time, _()
> exists as a short-hand for it. So running this
>
> printf(_("Hello, world\n"));
>
> would look up "Hello world\n" in database for the end-user's
> language, and shows the translated message instead.
>
> By scanning the source text, you can extract these constant strings
> passed to gettext() or _(). This is done by the i18n coordinator
> with the "msgmerge" program. By doing so, we learn "Hello, world\n"
> must be translated, and then ask i18n team to translate it to their
> language. The result is what we have in the l10n database. They
> are in po/*.po files in our source tree.
>
> Sometimes, the message you want to be translated may be in a
> variable, e.g.
>
> void greeting(const char *message)
> {
> printf(_(message));
> }
>
> int main(int ac, char **av)
> {
> int i;
> const char *message[] = {
> "Hello, world\n",
> "Goodbye, everybody\n",
> };
> for (i = 0; i < ARRAY_SIZE(message); i++)
> greeting(message[i]);
> }
>
> And scanning the source would not find "Hello, world\n" or "Goodby,
> everybody\n" must be translated. We do not want to do this:
>
> ...
> const char *message[] = {
> *BAD* _("Hello, world\n"),
> *BAD* _("Goodbye, everybody\n"),
> };
> ...
>
> because we do *NOT* want to call gettext() there (we call the
> function at runtime inside greeting() instead). We use N_()
> to mark such messages, like so:
>
> ...
> const char *message[] = {
> *GOOD* N_("Hello, world\n"),
> *GOOD* N_("Goodbye, everybody\n"),
> };
> ...
>
> The N_() macro is a no-op at runtime. It just is there so that
> "msgmerge" can notice that the constant string there is something
> that needs to be thrown into the l10n database.
>
> As a concrete example:
>
>> @@ -24,6 +25,7 @@ static const char * const git_bisect_helper_usage[] = {
>> N_("git bisect--helper --bisect-reset [<commit>]"),
>> N_("git bisect--helper --bisect-write <state> <revision> <TERM_GOOD>
>> <TERM_BAD> [<nolog>]"),
>> N_("git bisect--helper --bisect-check-and-set-terms <command>
>> <TERM_GOOD> <TERM_BAD>"),
>> + N_("git bisect--helper --bisect-next-check [<term>] <TERM_GOOD>
>> <TERM_BAD"),
>> NULL
>> };
>
> this is such a use of N_(). You want to keep untranslated message
> in the git_bisect_helper_usage[] array, to be given to gettext(), or
> more likely its short-hand _(), when these usage strings are used,
> and make sure these strings will be in the l10n database so that
> translators will give you translations to them to be used at
> runtime.
>
>> + /*
>> + * have bad (or new) but not good (or old). We could bisect
>> + * although this is less optimum.
>> + */
>> + fprintf(stderr, N_("Warning: bisecting only with a %s
>> commit\n"),
>> + terms->term_bad.buf);
>
> This one wants to call gettext() function to give fprintf() the
> translated warning message. It should be _().
>
>> + /*
>> + * TRANSLATORS: Make sure to include [Y] and [n] in your
>> + * translation. The program will only accept English input
>> + * at this point.
>> + */
>> + yesno = git_prompt(_("Are you sure [Y/n]? "), PROMPT_ECHO);
>
> Just like this one.
Thanks a lot for taking time to explain this. I had searched a bit but
couldn't find the difference between _() and N_()!
Regards,
Pranit Bauva
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html