i18n: parseopt: lookup help and argument translations when showing usage
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									a3935e6791
								
							
						
					
					
						commit
						54e6dc7daf
					
				|  | @ -490,7 +490,7 @@ static int usage_argh(const struct option *opts, FILE *outfile) | ||||||
| 			s = literal ? "[%s]" : "[<%s>]"; | 			s = literal ? "[%s]" : "[<%s>]"; | ||||||
| 	else | 	else | ||||||
| 		s = literal ? " %s" : " <%s>"; | 		s = literal ? " %s" : " <%s>"; | ||||||
| 	return fprintf(outfile, s, opts->argh ? opts->argh : "..."); | 	return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("...")); | ||||||
| } | } | ||||||
|  |  | ||||||
| #define USAGE_OPTS_WIDTH 24 | #define USAGE_OPTS_WIDTH 24 | ||||||
|  | @ -508,13 +508,16 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, | ||||||
| 	if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL) | 	if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL) | ||||||
| 		fprintf(outfile, "cat <<\\EOF\n"); | 		fprintf(outfile, "cat <<\\EOF\n"); | ||||||
|  |  | ||||||
| 	fprintf(outfile, "usage: %s\n", *usagestr++); | 	fprintf_ln(outfile, _("usage: %s"), _(*usagestr++)); | ||||||
| 	while (*usagestr && **usagestr) | 	while (*usagestr && **usagestr) | ||||||
| 		fprintf(outfile, "   or: %s\n", *usagestr++); | 		/* TRANSLATORS: the colon here should align with the | ||||||
|  | 		   one in "usage: %s" translation */ | ||||||
|  | 		fprintf_ln(outfile, _("   or: %s"), _(*usagestr++)); | ||||||
| 	while (*usagestr) { | 	while (*usagestr) { | ||||||
| 		fprintf(outfile, "%s%s\n", | 		if (**usagestr) | ||||||
| 				**usagestr ? "    " : "", | 			fprintf_ln(outfile, _("    %s"), _(*usagestr)); | ||||||
| 				*usagestr); | 		else | ||||||
|  | 			putchar('\n'); | ||||||
| 		usagestr++; | 		usagestr++; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -528,7 +531,7 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, | ||||||
| 		if (opts->type == OPTION_GROUP) { | 		if (opts->type == OPTION_GROUP) { | ||||||
| 			fputc('\n', outfile); | 			fputc('\n', outfile); | ||||||
| 			if (*opts->help) | 			if (*opts->help) | ||||||
| 				fprintf(outfile, "%s\n", opts->help); | 				fprintf(outfile, "%s\n", _(opts->help)); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		if (!full && (opts->flags & PARSE_OPT_HIDDEN)) | 		if (!full && (opts->flags & PARSE_OPT_HIDDEN)) | ||||||
|  | @ -558,7 +561,7 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, | ||||||
| 			fputc('\n', outfile); | 			fputc('\n', outfile); | ||||||
| 			pad = USAGE_OPTS_WIDTH; | 			pad = USAGE_OPTS_WIDTH; | ||||||
| 		} | 		} | ||||||
| 		fprintf(outfile, "%*s%s\n", pad + USAGE_GAP, "", opts->help); | 		fprintf(outfile, "%*s%s\n", pad + USAGE_GAP, "", _(opts->help)); | ||||||
| 	} | 	} | ||||||
| 	fputc('\n', outfile); | 	fputc('\n', outfile); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -66,12 +66,14 @@ typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx, | ||||||
|  * |  * | ||||||
|  * `argh`:: |  * `argh`:: | ||||||
|  *   token to explain the kind of argument this option wants. Keep it |  *   token to explain the kind of argument this option wants. Keep it | ||||||
|  *   homogeneous across the repository. |  *   homogeneous across the repository. Should be wrapped by N_() for | ||||||
|  |  *   translation. | ||||||
|  * |  * | ||||||
|  * `help`:: |  * `help`:: | ||||||
|  *   the short help associated to what the option does. |  *   the short help associated to what the option does. | ||||||
|  *   Must never be NULL (except for OPTION_END). |  *   Must never be NULL (except for OPTION_END). | ||||||
|  *   OPTION_GROUP uses this pointer to store the group header. |  *   OPTION_GROUP uses this pointer to store the group header. | ||||||
|  |  *   Should be wrapped by N_() for translation. | ||||||
|  * |  * | ||||||
|  * `flags`:: |  * `flags`:: | ||||||
|  *   mask of parse_opt_option_flags. |  *   mask of parse_opt_option_flags. | ||||||
|  | @ -128,7 +130,7 @@ struct option { | ||||||
| #define OPT_BOOL(s, l, v, h)        OPT_SET_INT(s, l, v, h, 1) | #define OPT_BOOL(s, l, v, h)        OPT_SET_INT(s, l, v, h, 1) | ||||||
| #define OPT_SET_PTR(s, l, v, h, p)  { OPTION_SET_PTR, (s), (l), (v), NULL, \ | #define OPT_SET_PTR(s, l, v, h, p)  { OPTION_SET_PTR, (s), (l), (v), NULL, \ | ||||||
| 				      (h), PARSE_OPT_NOARG, NULL, (p) } | 				      (h), PARSE_OPT_NOARG, NULL, (p) } | ||||||
| #define OPT_INTEGER(s, l, v, h)     { OPTION_INTEGER, (s), (l), (v), "n", (h) } | #define OPT_INTEGER(s, l, v, h)     { OPTION_INTEGER, (s), (l), (v), N_("n"), (h) } | ||||||
| #define OPT_STRING(s, l, v, a, h)   { OPTION_STRING,  (s), (l), (v), (a), (h) } | #define OPT_STRING(s, l, v, a, h)   { OPTION_STRING,  (s), (l), (v), (a), (h) } | ||||||
| #define OPT_STRING_LIST(s, l, v, a, h) \ | #define OPT_STRING_LIST(s, l, v, a, h) \ | ||||||
| 				    { OPTION_CALLBACK, (s), (l), (v), (a), \ | 				    { OPTION_CALLBACK, (s), (l), (v), (a), \ | ||||||
|  | @ -136,7 +138,7 @@ struct option { | ||||||
| #define OPT_UYN(s, l, v, h)         { OPTION_CALLBACK, (s), (l), (v), NULL, \ | #define OPT_UYN(s, l, v, h)         { OPTION_CALLBACK, (s), (l), (v), NULL, \ | ||||||
| 				      (h), PARSE_OPT_NOARG, &parse_opt_tertiary } | 				      (h), PARSE_OPT_NOARG, &parse_opt_tertiary } | ||||||
| #define OPT_DATE(s, l, v, h) \ | #define OPT_DATE(s, l, v, h) \ | ||||||
| 	{ OPTION_CALLBACK, (s), (l), (v), "time",(h), 0, \ | 	{ OPTION_CALLBACK, (s), (l), (v), N_("time"),(h), 0,	\ | ||||||
| 	  parse_opt_approxidate_cb } | 	  parse_opt_approxidate_cb } | ||||||
| #define OPT_CALLBACK(s, l, v, a, h, f) \ | #define OPT_CALLBACK(s, l, v, a, h, f) \ | ||||||
| 	{ OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) } | 	{ OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) } | ||||||
|  | @ -144,21 +146,22 @@ struct option { | ||||||
| 	{ OPTION_NUMBER, 0, NULL, (v), NULL, (h), \ | 	{ OPTION_NUMBER, 0, NULL, (v), NULL, (h), \ | ||||||
| 	  PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) } | 	  PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) } | ||||||
| #define OPT_FILENAME(s, l, v, h)    { OPTION_FILENAME, (s), (l), (v), \ | #define OPT_FILENAME(s, l, v, h)    { OPTION_FILENAME, (s), (l), (v), \ | ||||||
| 				       "file", (h) } | 				       N_("file"), (h) } | ||||||
| #define OPT_COLOR_FLAG(s, l, v, h) \ | #define OPT_COLOR_FLAG(s, l, v, h) \ | ||||||
| 	{ OPTION_CALLBACK, (s), (l), (v), "when", (h), PARSE_OPT_OPTARG, \ | 	{ OPTION_CALLBACK, (s), (l), (v), N_("when"), (h), PARSE_OPT_OPTARG, \ | ||||||
| 		parse_opt_color_flag_cb, (intptr_t)"always" } | 		parse_opt_color_flag_cb, (intptr_t)"always" } | ||||||
|  |  | ||||||
| #define OPT_NOOP_NOARG(s, l) \ | #define OPT_NOOP_NOARG(s, l) \ | ||||||
| 	{ OPTION_CALLBACK, (s), (l), NULL, NULL, \ | 	{ OPTION_CALLBACK, (s), (l), NULL, NULL, \ | ||||||
| 	  "no-op (backward compatibility)", \ | 	  N_("no-op (backward compatibility)"),		\ | ||||||
| 	  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb } | 	  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb } | ||||||
|  |  | ||||||
| /* Deprecated synonym */ | /* Deprecated synonym */ | ||||||
| #define OPT_BOOLEAN OPT_COUNTUP | #define OPT_BOOLEAN OPT_COUNTUP | ||||||
|  |  | ||||||
| /* parse_options() will filter out the processed options and leave the | /* parse_options() will filter out the processed options and leave the | ||||||
|  * non-option arguments in argv[]. |  * non-option arguments in argv[]. usagestr strings should be marked | ||||||
|  |  * for translation with N_(). | ||||||
|  * Returns the number of arguments left in argv[]. |  * Returns the number of arguments left in argv[]. | ||||||
|  */ |  */ | ||||||
| extern int parse_options(int argc, const char **argv, const char *prefix, | extern int parse_options(int argc, const char **argv, const char *prefix, | ||||||
|  | @ -222,15 +225,15 @@ extern int parse_opt_noop_cb(const struct option *, const char *, int); | ||||||
| #define OPT__VERBOSE(var, h)  OPT_BOOLEAN('v', "verbose", (var), (h)) | #define OPT__VERBOSE(var, h)  OPT_BOOLEAN('v', "verbose", (var), (h)) | ||||||
| #define OPT__QUIET(var, h)    OPT_BOOLEAN('q', "quiet",   (var), (h)) | #define OPT__QUIET(var, h)    OPT_BOOLEAN('q', "quiet",   (var), (h)) | ||||||
| #define OPT__VERBOSITY(var) \ | #define OPT__VERBOSITY(var) \ | ||||||
| 	{ OPTION_CALLBACK, 'v', "verbose", (var), NULL, "be more verbose", \ | 	{ OPTION_CALLBACK, 'v', "verbose", (var), NULL, N_("be more verbose"), \ | ||||||
| 	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \ | 	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \ | ||||||
| 	{ OPTION_CALLBACK, 'q', "quiet", (var), NULL, "be more quiet", \ | 	{ OPTION_CALLBACK, 'q', "quiet", (var), NULL, N_("be more quiet"), \ | ||||||
| 	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 } | 	  PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 } | ||||||
| #define OPT__DRY_RUN(var, h)  OPT_BOOLEAN('n', "dry-run", (var), (h)) | #define OPT__DRY_RUN(var, h)  OPT_BOOLEAN('n', "dry-run", (var), (h)) | ||||||
| #define OPT__FORCE(var, h)    OPT_BOOLEAN('f', "force",   (var), (h)) | #define OPT__FORCE(var, h)    OPT_BOOLEAN('f', "force",   (var), (h)) | ||||||
| #define OPT__ABBREV(var)  \ | #define OPT__ABBREV(var)  \ | ||||||
| 	{ OPTION_CALLBACK, 0, "abbrev", (var), "n", \ | 	{ OPTION_CALLBACK, 0, "abbrev", (var), N_("n"),	\ | ||||||
| 	  "use <n> digits to display SHA-1s", \ | 	  N_("use <n> digits to display SHA-1s"),	\ | ||||||
| 	  PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 } | 	  PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 } | ||||||
| #define OPT__COLOR(var, h) \ | #define OPT__COLOR(var, h) \ | ||||||
| 	OPT_COLOR_FLAG(0, "color", (var), (h)) | 	OPT_COLOR_FLAG(0, "color", (var), (h)) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Nguyễn Thái Ngọc Duy
						Nguyễn Thái Ngọc Duy