From: Jiang Xin Date: Tue, 06 Mar 2012 04:16:06 GMT Subject: Re: [PATCH] i18n: Not add stripped contents for translation Message-ID: In-Reply-To: <7vobsb67dn.fsf@alter.siamese.dyndns.org> 2012/3/5 Junio C Hamano : > 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