* [PATCH/RESEND] transport.c: mark push status strings for translation
@ 2013-12-03 10:26 Nguyễn Thái Ngọc Duy
2013-12-03 20:08 ` Jonathan Nieder
0 siblings, 1 reply; 2+ messages in thread
From: Nguyễn Thái Ngọc Duy @ 2013-12-03 10:26 UTC (permalink / raw)
To: git; +Cc: Junio C Hamano, Nguyễn Thái Ngọc Duy
Mark strings like "[up to date]" passed to print_ref_status() for
translation with N_() instead of _() so they can remain untranslated
in porcelain mode.
While at there, mark some error strings in git push for translation
too.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
---
builtin/push.c | 8 +++---
transport.c | 81 ++++++++++++++++++++++++++++++++++------------------------
2 files changed, 52 insertions(+), 37 deletions(-)
diff --git a/builtin/push.c b/builtin/push.c
index 7b1b66c..22e2d4c 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -319,7 +319,7 @@ static int push_with_options(struct transport *transport, int flags)
if (!is_empty_cas(&cas)) {
if (!transport->smart_options)
- die("underlying transport does not support --%s option",
+ die(_("underlying transport does not support --%s option"),
CAS_OPT_NAME);
transport->smart_options->cas = &cas;
}
@@ -426,7 +426,7 @@ static int option_parse_recurse_submodules(const struct option *opt,
if (*flags & (TRANSPORT_RECURSE_SUBMODULES_CHECK |
TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND))
- die("%s can only be used once.", opt->long_name);
+ die(_("%s can only be used once."), opt->long_name);
if (arg) {
if (!strcmp(arg, "check"))
@@ -434,9 +434,9 @@ static int option_parse_recurse_submodules(const struct option *opt,
else if (!strcmp(arg, "on-demand"))
*flags |= TRANSPORT_RECURSE_SUBMODULES_ON_DEMAND;
else
- die("bad %s argument: %s", opt->long_name, arg);
+ die(_("bad %s argument: %s"), opt->long_name, arg);
} else
- die("option %s needs an argument (check|on-demand)",
+ die(_("option %s needs an argument (check|on-demand)"),
opt->long_name);
return 0;
diff --git a/transport.c b/transport.c
index 7202b77..1fb92a1 100644
--- a/transport.c
+++ b/transport.c
@@ -14,6 +14,7 @@
#include "url.h"
#include "submodule.h"
#include "string-list.h"
+#include "utf8.h"
/* rsync support */
@@ -627,16 +628,23 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
else
fprintf(stdout, "%s\n", summary);
} else {
- fprintf(stderr, " %c %-*s ", flag, TRANSPORT_SUMMARY_WIDTH, summary);
+ int width = TRANSPORT_SUMMARY_WIDTH;
+ const char *localized_summary = _(summary);
+ /*
+ * Compensate for the invisible bytes in utf-8
+ * strings. The expression below is guaranteed always
+ * positive (or zero in case of ascii strings) because
+ * none of the doublewidth characters are ASCII
+ * characters.
+ */
+ width += strlen(localized_summary) - utf8_strwidth(localized_summary);
+ fprintf(stderr, " %c %-*s ", flag, width, localized_summary);
if (from)
fprintf(stderr, "%s -> %s", prettify_refname(from->name), prettify_refname(to->name));
else
fputs(prettify_refname(to->name), stderr);
- if (msg) {
- fputs(" (", stderr);
- fputs(msg, stderr);
- fputc(')', stderr);
- }
+ if (msg)
+ fprintf(stderr, " (%s)", _(msg));
fputc('\n', stderr);
}
}
@@ -649,11 +657,11 @@ static const char *status_abbrev(unsigned char sha1[20])
static void print_ok_ref_status(struct ref *ref, int porcelain)
{
if (ref->deletion)
- print_ref_status('-', "[deleted]", ref, NULL, NULL, porcelain);
+ print_ref_status('-', N_("[deleted]"), ref, NULL, NULL, porcelain);
else if (is_null_sha1(ref->old_sha1))
print_ref_status('*',
- (!prefixcmp(ref->name, "refs/tags/") ? "[new tag]" :
- "[new branch]"),
+ (!prefixcmp(ref->name, "refs/tags/") ? N_("[new tag]") :
+ N_("[new branch]")),
ref, ref->peer_ref, NULL, porcelain);
else {
char quickref[84];
@@ -664,7 +672,7 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
if (ref->forced_update) {
strcat(quickref, "...");
type = '+';
- msg = "forced update";
+ msg = N_("forced update");
} else {
strcat(quickref, "..");
type = ' ';
@@ -678,50 +686,57 @@ static void print_ok_ref_status(struct ref *ref, int porcelain)
static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
{
- if (!count)
- fprintf(porcelain ? stdout : stderr, "To %s\n", dest);
+ if (!count) {
+ if (porcelain)
+ fprintf(stdout, "To %s\n", dest);
+ else
+ fprintf_ln(stderr, _("To %s"), dest);
+ }
switch(ref->status) {
case REF_STATUS_NONE:
- print_ref_status('X', "[no match]", ref, NULL, NULL, porcelain);
+ print_ref_status('X', N_("[no match]"), ref, NULL,
+ NULL, porcelain);
break;
case REF_STATUS_REJECT_NODELETE:
- print_ref_status('!', "[rejected]", ref, NULL,
- "remote does not support deleting refs", porcelain);
+ print_ref_status('!', N_("[rejected]"), ref, NULL,
+ N_("remote does not support deleting refs"),
+ porcelain);
break;
case REF_STATUS_UPTODATE:
- print_ref_status('=', "[up to date]", ref,
- ref->peer_ref, NULL, porcelain);
+ print_ref_status('=', N_("[up to date]"), ref,
+ ref->peer_ref, NULL, porcelain);
break;
case REF_STATUS_REJECT_NONFASTFORWARD:
- print_ref_status('!', "[rejected]", ref, ref->peer_ref,
- "non-fast-forward", porcelain);
+ print_ref_status('!', N_("[rejected]"), ref, ref->peer_ref,
+ N_("non-fast-forward"), porcelain);
break;
case REF_STATUS_REJECT_ALREADY_EXISTS:
- print_ref_status('!', "[rejected]", ref, ref->peer_ref,
- "already exists", porcelain);
+ print_ref_status('!', N_("[rejected]"), ref, ref->peer_ref,
+ N_("already exists"), porcelain);
break;
case REF_STATUS_REJECT_FETCH_FIRST:
- print_ref_status('!', "[rejected]", ref, ref->peer_ref,
- "fetch first", porcelain);
+ print_ref_status('!', N_("[rejected]"), ref, ref->peer_ref,
+ N_("fetch first"), porcelain);
break;
case REF_STATUS_REJECT_NEEDS_FORCE:
- print_ref_status('!', "[rejected]", ref, ref->peer_ref,
- "needs force", porcelain);
+ print_ref_status('!', N_("[rejected]"), ref, ref->peer_ref,
+ N_("needs force"), porcelain);
break;
case REF_STATUS_REJECT_STALE:
- print_ref_status('!', "[rejected]", ref, ref->peer_ref,
- "stale info", porcelain);
+ print_ref_status('!', N_("[rejected]"), ref, ref->peer_ref,
+ N_("stale info"), porcelain);
break;
case REF_STATUS_REMOTE_REJECT:
- print_ref_status('!', "[remote rejected]", ref,
- ref->deletion ? NULL : ref->peer_ref,
- ref->remote_status, porcelain);
+ print_ref_status('!', N_("[remote rejected]"), ref,
+ ref->deletion ? NULL : ref->peer_ref,
+ ref->remote_status, porcelain);
break;
case REF_STATUS_EXPECTING_REPORT:
- print_ref_status('!', "[remote failure]", ref,
- ref->deletion ? NULL : ref->peer_ref,
- "remote failed to report status", porcelain);
+ print_ref_status('!', N_("[remote failure]"), ref,
+ ref->deletion ? NULL : ref->peer_ref,
+ N_("remote failed to report status"),
+ porcelain);
break;
case REF_STATUS_OK:
print_ok_ref_status(ref, porcelain);
--
1.8.2.83.gc99314b
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH/RESEND] transport.c: mark push status strings for translation
2013-12-03 10:26 [PATCH/RESEND] transport.c: mark push status strings for translation Nguyễn Thái Ngọc Duy
@ 2013-12-03 20:08 ` Jonathan Nieder
0 siblings, 0 replies; 2+ messages in thread
From: Jonathan Nieder @ 2013-12-03 20:08 UTC (permalink / raw)
To: Nguyễn Thái Ngọc Duy; +Cc: git, Junio C Hamano
Nguyễn Thái Ngọc Duy wrote:
> Mark strings like "[up to date]" passed to print_ref_status() for
> translation with N_() instead of _() so they can remain untranslated
> in porcelain mode.
Makes sense.
[...]
> --- a/builtin/push.c
> +++ b/builtin/push.c
Perhaps it would make sense to send these as a separate patch, since
they are simpler than the rest.
[...]
> --- a/transport.c
> +++ b/transport.c
> @@ -14,6 +14,7 @@
> #include "url.h"
> #include "submodule.h"
> #include "string-list.h"
> +#include "utf8.h"
>
> /* rsync support */
>
> @@ -627,16 +628,23 @@ static void print_ref_status(char flag, const char *summary, struct ref *to, str
> else
> fprintf(stdout, "%s\n", summary);
> } else {
> - fprintf(stderr, " %c %-*s ", flag, TRANSPORT_SUMMARY_WIDTH, summary);
> + int width = TRANSPORT_SUMMARY_WIDTH;
> + const char *localized_summary = _(summary);
The summary arg comes from one of a few places:
(a) [deleted] etc from print_ok_ref_status, which you marked
with N_ (good)
(b) deadbe... from status_abbrev via print_ok_ref_status. Can we
avoid passing it to gettext()?
(c) [no match] etc from print_one_push_status, marked with
N_ (good)
I am tempted to suggest something like
const char *localized_summary;
if (*summary != '[')
/* Leave abbreviated sha1 from status_abbrev() alone */
localized_summary = summary;
else
localized_summary = _(summary);
but that's kind of ugly. Is there a simpler way? Should the summary
arg be passed in already localized (with 'porcelain' handling higher
up)?
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-12-03 20:09 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-03 10:26 [PATCH/RESEND] transport.c: mark push status strings for translation Nguyễn Thái Ngọc Duy
2013-12-03 20:08 ` Jonathan Nieder
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).