From f7dac7e1fa76bbdd1614810eb937a9dbd9e8d75d Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Thu, 11 Mar 2010 12:14:23 +0100 Subject: [PATCH] - fix language code lookup for fallback languages [bnc#584644] - change solvable_lookup_str_lang interface a bit for libzypp --- examples/solv.c | 14 +++++++++++++- src/pool.h | 2 +- src/solvable.c | 28 ++++++++++------------------ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/examples/solv.c b/examples/solv.c index d0bced4..46aea12 100644 --- a/examples/solv.c +++ b/examples/solv.c @@ -2269,6 +2269,14 @@ main(int argc, char **argv) usage(1); pool = pool_create(); + +#if 0 + { + const char *langs[] = {"de_DE", "de", "en"}; + pool_set_languages(pool, langs, sizeof(langs)/sizeof(*langs)); + } +#endif + #ifdef FEDORA pool->obsoleteusescolors = 1; #endif @@ -2449,7 +2457,11 @@ main(int argc, char **argv) } else { - const char *sum = solvable_lookup_str_lang(s, SOLVABLE_SUMMARY, "de"); +#if 1 + const char *sum = solvable_lookup_str_lang(s, SOLVABLE_SUMMARY, "de", 1); +#else + const char *sum = solvable_lookup_str_poollang(s, SOLVABLE_SUMMARY); +#endif printf(" - %s [%s]\n", solvable2str(pool, s), s->repo->name); if (sum) printf(" %s\n", sum); diff --git a/src/pool.h b/src/pool.h index d82a0d1..7459143 100644 --- a/src/pool.h +++ b/src/pool.h @@ -222,7 +222,7 @@ Id solvable_lookup_id(Solvable *s, Id keyname); unsigned int solvable_lookup_num(Solvable *s, Id keyname, unsigned int notfound); const char *solvable_lookup_str(Solvable *s, Id keyname); const char *solvable_lookup_str_poollang(Solvable *s, Id keyname); -const char *solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang); +const char *solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang, int usebase); int solvable_lookup_bool(Solvable *s, Id keyname); int solvable_lookup_void(Solvable *s, Id keyname); char * solvable_get_location(Solvable *s, unsigned int *medianrp); diff --git a/src/solvable.c b/src/solvable.c index c7f71d8..441af97 100644 --- a/src/solvable.c +++ b/src/solvable.c @@ -74,7 +74,7 @@ solvable_lookup_str(Solvable *s, Id keyname) } static const char * -solvable_lookup_str_base(Solvable *s, Id keyname, Id basekeyname) +solvable_lookup_str_base(Solvable *s, Id keyname, Id basekeyname, int usebase) { Pool *pool; const char *str, *basestr; @@ -94,7 +94,7 @@ solvable_lookup_str_base(Solvable *s, Id keyname, Id basekeyname) /* search for a solvable with same name and same base that has the * translation */ if (!pool->whatprovides) - return basestr; + return usebase ? basestr : 0; /* we do this in two passes, first same vendor, then all other vendors */ for (pass = 0; pass < 2; pass++) { @@ -113,7 +113,7 @@ solvable_lookup_str_base(Solvable *s, Id keyname, Id basekeyname) return str; } } - return basestr; + return usebase ? basestr : 0; } const char * @@ -154,17 +154,8 @@ solvable_lookup_str_poollang(Solvable *s, Id keyname) for (i = 0; i < pool->nlanguages; i++, row++) { if (!*row) - { - char *p; - const char *kn; - - kn = id2str(pool, keyname); - p = sat_malloc(strlen(kn) + strlen(pool->languages[i]) + 2); - sprintf(p, "%s:%s", kn, pool->languages[i]); - *row = str2id(pool, p, 1); - sat_free(p); - } - str = solvable_lookup_str_base(s, *row, keyname); + *row = pool_id2langid(pool, keyname, pool->languages[i], 1); + str = solvable_lookup_str_base(s, *row, keyname, 0); if (str) return str; } @@ -172,14 +163,15 @@ solvable_lookup_str_poollang(Solvable *s, Id keyname) } const char * -solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang) +solvable_lookup_str_lang(Solvable *s, Id keyname, const char *lang, int usebase) { if (s->repo) { - const char *str; Id id = pool_id2langid(s->repo->pool, keyname, lang, 0); - if (id && (str = solvable_lookup_str_base(s, id, keyname)) != 0) - return str; + if (id) + return solvable_lookup_str_base(s, id, keyname, usebase); + if (!usebase) + return 0; } return solvable_lookup_str(s, keyname); } -- 2.7.4