diff --git a/setup/translations.py b/setup/translations.py index 53e5adf4a9..1cd5aea09a 100644 --- a/setup/translations.py +++ b/setup/translations.py @@ -370,7 +370,7 @@ class Translations(POT): # {{{ files = [] skip_iso = { 'si', 'te', 'km', 'en_GB', 'en_AU', 'en_CA', 'yi', 'ku', 'my', 'uz@Latn', 'fil', 'hy', 'ltg', 'km_KH', 'km', - 'ur', 'ml', 'fo', 'ug', 'nds', 'jv' + 'ur', 'ml', 'fo', 'ug', 'jv' } def handle_stats(f, data): @@ -394,6 +394,26 @@ class Translations(POT): # {{{ self.compile_group(files, make_translated_strings_unique=True, handle_stats=handle_stats, keyfunc=lambda x: os.path.join(self.d(self.SRC), 'iso639', os.path.basename(x))) + self.info('Compiling ISO3166 files...') + files = [] + skip_iso = { + 'en_GB', 'en_AU', 'en_CA', 'yi', 'ku', 'uz@Latn', 'ltg', 'nds', 'jv' + } + with tempfile.TemporaryDirectory() as tdir: + iso_data.extract_po_files('iso_3166-1', tdir) + for f, (locale, dest) in iteritems(fmap): + pofile = self.j(tdir, f'{locale}.po') + if os.path.exists(pofile): + files.append((pofile, self.j(self.d(dest), 'iso3166.mo'))) + else: + pofile = self.j(tdir, f'{locale.partition("_")[0]}.po') + if os.path.exists(pofile): + files.append((pofile, self.j(self.d(dest), 'iso3166.mo'))) + elif locale not in skip_iso: + self.warn('No ISO 3166 translations for locale:', locale) + self.compile_group(files, make_translated_strings_unique=True, handle_stats=lambda f,d:None, + keyfunc=lambda x: os.path.join(self.d(self.SRC), 'iso3166', os.path.basename(x))) + dest = self.stats base = self.d(dest) try: diff --git a/src/calibre/utils/localization.py b/src/calibre/utils/localization.py index d2f6066d8a..6d75050f04 100644 --- a/src/calibre/utils/localization.py +++ b/src/calibre/utils/localization.py @@ -122,7 +122,7 @@ def zf_exists(): allow_user_override=False)) -_lang_trans = None +_lang_trans = _country_trans = None def get_all_translators(): @@ -211,7 +211,7 @@ def load_po(path): def translator_for_lang(lang): - t = buf = iso639 = lcdata = None + t = buf = iso639 = iso3166 = lcdata = None if 'CALIBRE_TEST_TRANSLATION' in os.environ: buf = load_po(os.path.expanduser(os.environ['CALIBRE_TEST_TRANSLATION'])) @@ -232,6 +232,11 @@ def translator_for_lang(lang): iso639 = io.BytesIO(zf.read(isof)) except: pass # No iso639 translations for this lang + isof = mpath + '/iso3166.mo' + try: + iso3166 = io.BytesIO(zf.read(isof)) + except: + pass # No iso3166 translations for this lang if buf is not None: from calibre.utils.serialize import msgpack_loads try: @@ -254,11 +259,19 @@ def translator_for_lang(lang): else: if t is not None: t.add_fallback(iso639) + if iso3166 is not None: + try: + iso3166 = GNUTranslations(iso3166) + except Exception: + iso3166 = None + else: + if t is not None: + t.add_fallback(iso3166) if t is None: t = NullTranslations() - return {'translator': t, 'iso639_translator': iso639, 'lcdata': lcdata} + return {'translator': t, 'iso639_translator': iso639, 'iso3166_translator': iso3166, 'lcdata': lcdata} default_translator = NullTranslations() @@ -281,7 +294,7 @@ def pgettext(context: str, msg: str) -> str: def set_translators(): - global _lang_trans, lcdata, default_translator + global _lang_trans, _country_trans, lcdata, default_translator # To test different translations invoke as # CALIBRE_OVERRIDE_LANG=de_DE.utf8 program lang = get_lang() @@ -290,6 +303,7 @@ def set_translators(): q = translator_for_lang(lang) default_translator = q['translator'] _lang_trans = q['iso639_translator'] + _country_trans = q['iso3166_translator'] if q['lcdata']: lcdata = q['lcdata'] else: @@ -456,6 +470,22 @@ def calibre_langcode_to_name(lc, localize=True): return lc +def countrycode_to_name(cc, localize=True): + iso3166 = load_iso3166() + q = cc.upper() + if len(q) == 3: + q = iso3166['three_map'].get(q, q) + try: + name = iso3166['names'][q] + except Exception: + return cc + translate = _ if localize else lambda x: x + try: + return translate(name) + except Exception: + return name + + def canonicalize_lang(raw): if not raw: return None