Junio C Hamano <gitster@xxxxxxxxx> writes: > Pranit Bauva <pranit.bauva@xxxxxxxxx> 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 ;-). 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. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html