--- rpm-5.3.13/rpmdb/hdrfmt.c 2011-03-26 15:57:24.000000000 +0300 +++ rpm-5.3.13/rpmdb/hdrfmt.c 2012-04-16 12:32:50.588475008 +0400 @@ -2096,102 +2096,34 @@ /*@globals rpmGlobalMacroContext, h_errno, internalState @*/ /*@modifies he, rpmGlobalMacroContext, internalState @*/ { - char * dstring = rpmExpand(_macro_i18ndomains, NULL); - int rc = 1; /* assume failure */ - + int rc = headerGet(h, he, HEADERGET_NOEXTENSION); he->t = RPM_STRING_TYPE; - he->p.str = NULL; - he->c = 0; - he->freeData = 0; - - if (dstring && *dstring) { - char *domain, *de; - const char * langval; - const char * msgkey; - const char * msgid; - - { HE_t nhe = (HE_t) memset(alloca(sizeof(*nhe)), 0, sizeof(*nhe)); - const char * tn; - char * mk; - size_t nb = sizeof("()"); - int xx; - - nhe->tag = RPMTAG_NAME; - xx = headerGet(h, nhe, 0); - /* - * XXX Ick, tagName() is called by headerGet(), and the tagName() - * buffer is valid only until next tagName() call. - * For now, do the tagName() lookup after headerGet(). - */ - tn = tagName(he->tag); - if (tn) nb += strlen(tn); - if (nhe->p.str) nb += strlen(nhe->p.str); - mk = alloca(nb); - (void) snprintf(mk, nb, "%s(%s)", - (nhe->p.str ? nhe->p.str : ""), (tn ? tn : "")); - mk[nb-1] = '\0'; - nhe->p.ptr = _free(nhe->p.ptr); - msgkey = mk; - } - - /* change to en_US for msgkey -> msgid resolution */ - langval = getenv(language); - (void) setenv(language, "en_US", 1); -#if defined(ENABLE_NLS) -/*@i@*/ ++_nl_msg_cat_cntr; -#endif - - msgid = NULL; + if (rc){ + char *de, *domain, *dstring = rpmExpand(_macro_i18ndomains, NULL); + const char *msgid = he->p.str; + const char *msg; + for (domain = dstring; domain != NULL; domain = de) { de = strchr(domain, ':'); if (de) *de++ = '\0'; -/*@-unrecog@*/ - msgid = dgettext(domain, msgkey); -/*@=unrecog@*/ - if (msgid != msgkey) break; - } - - /* restore previous environment for msgid -> msgstr resolution */ - if (langval) - (void) setenv(language, langval, 1); - else - unsetenv(language); -#if defined(ENABLE_NLS) -/*@i@*/ ++_nl_msg_cat_cntr; -#endif - - if (domain && msgid) { -/*@-unrecog@*/ - const char * s = dgettext(domain, msgid); -/*@=unrecog@*/ - if (s) { - rc = 0; - he->p.str = xstrdup(s); - he->c = 1; - he->freeData = 1; + msg = dgettext(domain, msgid); + if (msg != msgid){ + he->p.str = xstrdup(msg); + he->c = 1; + he->freeData = 1; + + break; } } + + dstring = _free(dstring); + return 0; } -/*@-dependenttrans@*/ - dstring = _free(dstring); -/*@=dependenttrans@*/ - if (!rc) - return rc; - - rc = headerGet(h, he, HEADERGET_NOEXTENSION); - if (rc) { - rc = 0; - he->p.str = xstrtolocale(he->p.str); - he->freeData = 1; - return rc; - } - - he->t = RPM_STRING_TYPE; he->p.str = NULL; he->c = 0; he->freeData = 0; - + return 1; }