2012/3/5 Junio C Hamano <gitster@xxxxxxxxx>: > This is a tangent and I am just showing aloud my ignorance, but I wonder > if there is a reasonably generic and "best current practice" way to > structure code to show an enumeration in human languages, for example, > > A, B, C and D. > > in an easier-to-translate way. > > I suspect that it might be sufficiently generic if we can make it possible > to allow the first and the last inter-word-separation and the token after > all the items to be different from other inter-word-separation tokens. > > E.g. in English, the first one and all the "other" are ", ", the last > inter-word token is " and ", and the token at the very end is ".". In > Japanese some translators may want to say "AやBとCとD。", meaning the > first one is "や", "。" is used at the very end, and all the others may be > "と". I write a function for this. /* * Make list of items easy for l10n translation. * * 1. Input list of items one by one through the 2nd argument, * but leave the 1st argument as NULL. * * 2. Get the output joint string from the 1st argument. * * According to the number of items input. The joint string maybe: * * a * a and b * a, b and c * a, b, c and d * */ #define MAX_L10N_LIST_ITEMS_COUNT 128 void append_l10n_list_items(struct strbuf *ret, const char *item) { static const char **itemlist = NULL; static int count = 0; int i = 0; if (itemlist == NULL) itemlist = xmalloc(MAX_L10N_LIST_ITEMS_COUNT * sizeof(char*)); if(item != NULL && count < MAX_L10N_LIST_ITEMS_COUNT ) itemlist[count++] = item; if (ret != NULL) { if (count == 1) { strbuf_addstr(ret, itemlist[0]); } else if (count == 2) { strbuf_addf(ret, _("%s and %s"), itemlist[0], itemlist[1]); } else if (count > 2) { strbuf_addf(ret, _("%s, "), itemlist[0]); for (i=1; i<count-2; i++) { strbuf_addstr(ret, itemlist[i]); strbuf_addstr(ret, _(", ")); } strbuf_addf(ret, _("%s and %s"), itemlist[count-2], itemlist[count-1]); } free(itemlist); itemlist = NULL; count = 0; } } ... strbuf_addstr(&extra, " (")) if (a) append_l10n_list_items(NULL, _("msg a")); if (b) append_l10n_list_items(NULL, _("msg b")); if (c) append_l10n_list_items(NULL, _("msg c")); append_l10n_list_items(&extra, NULL); ... -- Jiang Xin -- 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