git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 01/65] i18n: parseopt: lookup help and argument translations when showing usage

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
May 6, 2012, 14:23 UTC
Message-ID
<1336314232-21002-2-git-send-email-pclouds@gmail.com>
In-Reply-To
<1336314232-21002-1-git-send-email-pclouds@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 parse-options.c |   19 +++++++++++--------
 parse-options.h |   25 ++++++++++++++-----------
 2 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/parse-options.c b/parse-options.c
index 850cfa7..ab70c29 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -490,7 +490,7 @@ static int usage_argh(const struct option *opts, FILE *outfile)
 			s = literal ? "[%s]" : "[<%s>]";
 	else
 		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
@@ -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)
 		fprintf(outfile, "cat <<\\EOF\n");
 
-	fprintf(outfile, "usage: %s\n", *usagestr++);
+	fprintf_ln(outfile, _("usage: %s"), _(*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) {
-		fprintf(outfile, "%s%s\n",
-				**usagestr ? "    " : "",
-				*usagestr);
+		if (**usagestr)
+			fprintf_ln(outfile, _("    %s"), _(*usagestr));
+		else
+			putchar('\n');
 		usagestr++;
 	}
 
@@ -528,7 +531,7 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx,
 		if (opts->type == OPTION_GROUP) {
 			fputc('\n', outfile);
 			if (*opts->help)
-				fprintf(outfile, "%s\n", opts->help);
+				fprintf(outfile, "%s\n", _(opts->help));
 			continue;
 		}
 		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);
 			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);
 
diff --git a/parse-options.h b/parse-options.h
index da999f8..77a4a8b 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -66,12 +66,14 @@ typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
  *
  * `argh`::
  *   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`::
  *   the short help associated to what the option does.
  *   Must never be NULL (except for OPTION_END).
  *   OPTION_GROUP uses this pointer to store the group header.
+ *   Should be wrapped by N_() for translation.
  *
  * `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_SET_PTR(s, l, v, h, p)  { OPTION_SET_PTR, (s), (l), (v), NULL, \
 				      (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_LIST(s, l, v, a, h) \
 				    { 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, \
 				      (h), PARSE_OPT_NOARG, &parse_opt_tertiary }
 #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 }
 #define OPT_CALLBACK(s, l, v, a, h, f) \
 	{ OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
@@ -144,21 +146,22 @@ struct option {
 	{ OPTION_NUMBER, 0, NULL, (v), NULL, (h), \
 	  PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) }
 #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) \
-	{ 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" }
 
 #define OPT_NOOP_NOARG(s, l) \
 	{ 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 }
 
 /* Deprecated synonym */
 #define OPT_BOOLEAN OPT_COUNTUP
 
 /* 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[].
  */
 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__QUIET(var, h)    OPT_BOOLEAN('q', "quiet",   (var), (h))
 #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 }, \
-	{ 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 }
 #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__ABBREV(var)  \
-	{ OPTION_CALLBACK, 0, "abbrev", (var), "n", \
-	  "use <n> digits to display SHA-1s", \
+	{ OPTION_CALLBACK, 0, "abbrev", (var), N_("n"),	\
+	  N_("use <n> digits to display SHA-1s"),	\
 	  PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
 #define OPT__COLOR(var, h) \
 	OPT_COLOR_FLAG(0, "color", (var), (h))
-- 
1.7.8.36.g69ee2
Previous: Nguyễn Thái Ngọc DuyNext: Nguyễn Thái Ngọc Duy
Message 2 of 87 in “Mark parseopt strings for translation”
  1. 00/65 Mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 6, 2012
  2. 01/65 i18n: parseopt: lookup help and argument translations when showing usageNguyễn Thái Ngọc Duy, May 6, 2012
  3. 02/65 i18n: apply: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 6, 2012
  4. 03/65 i18n: archive: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  5. 04/65 i18n: add: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  6. 05/65 i18n: bisect--helper: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  7. 06/65 i18n: blame: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  8. 07/65 i18n: branch: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  9. 08/65 i18n: cat-file: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  10. 09/65 i18n: check-attr: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  11. 10/65 i18n: checkout-index: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  12. 11/65 i18n: checkout: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  13. 12/65 i18n: cherry: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  14. 13/65 i18n: clean: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  15. 14/65 i18n: clone: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  16. 15/65 i18n: column: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  17. 16/65 i18n: commit: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  18. 17/65 i18n: config: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  19. 18/65 i18n: count-objects: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  20. 19/65 i18n: describe: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  21. 20/65 i18n: fast-export: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  22. 21/65 i18n: fetch: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  23. 22/65 i18n: fmt-merge-msg: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  24. 23/65 i18n: for-each-ref: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  25. 24/65 i18n: format-patch: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  26. 25/65 i18n: fsck: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  27. 26/65 i18n: gc: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  28. 27/65 i18n: grep: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  29. 28/65 i18n: hash-object: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  30. 29/65 i18n: help: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  31. 30/65 i18n: init-db: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  32. 31/65 i18n: log: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  33. 32/65 i18n: ls-files: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  34. 33/65 i18n: ls-tree: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  35. 34/65 i18n: merge-base: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  36. 35/65 i18n: merge-file: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  37. 36/65 i18n: merge: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  38. 37/65 i18n: mktree: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  39. 38/65 i18n: mv: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  40. 39/65 i18n: name-rev: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  41. 40/65 i18n: notes: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  42. 41/65 i18n: pack-objects: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  43. 42/65 i18n: pack-refs: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  44. 43/65 i18n: prune-packed: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  45. 44/65 i18n: prune: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  46. 45/65 i18n: push: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  47. 46/65 i18n: read-tree: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  48. 47/65 i18n: remote: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  49. 48/65 i18n: replace: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  50. 49/65 i18n: status: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  51. 50/65 i18n: rerere: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  52. 51/65 i18n: reset: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  53. 52/65 i18n: rev-parse: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  54. 53/65 i18n: revert, cherry-pick: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  55. 54/65 i18n: rm: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  56. 55/65 i18n: shortlog: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  57. 56/65 i18n: show-branch: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  58. 57/65 i18n: show-ref: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  59. 58/65 i18n: symbolic-ref: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  60. 59/65 i18n: tag: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  61. 60/65 i18n: update-index: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  62. 61/65 i18n: update-ref: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  63. 62/65 i18n: update-server-info: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  64. 63/65 i18n: verify-pack: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  65. 64/65 i18n: verify-tag: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  66. 65/65 i18n: write-tree: mark parseopt strings for translationNguyễn Thái Ngọc Duy, May 28, 2012
  67. Jonathan NiederMay 28, 2012
  68. Nguyen Thai Ngoc DuyMay 29, 2012
  69. Jonathan NiederMay 29, 2012
  70. Junio C HamanoMay 29, 2012
  71. Nguyen Thai Ngoc DuyMay 30, 2012
  72. Jonathan NiederMay 30, 2012
  73. Nguyen Thai Ngoc DuyMay 30, 2012
  74. Nguyen Thai Ngoc DuyMay 30, 2012
  75. Junio C HamanoMay 29, 2012
  76. Jonathan NiederMay 29, 2012
  77. Junio C HamanoMay 29, 2012
  78. Nguyen Thai Ngoc DuyMay 30, 2012
  79. Nguyen Thai Ngoc DuyJun 2, 2012
  80. Jonathan NiederJun 2, 2012
  81. Nguyen Thai Ngoc DuyJun 7, 2012
  82. Jonathan NiederJun 7, 2012
  83. Nguyen Thai Ngoc DuyJun 7, 2012
  84. Jonathan NiederJun 7, 2012
  85. Junio C HamanoJun 7, 2012
  86. Junio C HamanoMay 8, 2012
  87. Nguyen Thai Ngoc DuyMay 18, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.