Add country name translations from the iso-codes project

This commit is contained in:
Kovid Goyal 2023-07-13 18:28:11 +05:30
parent d9d2e798ca
commit aaeeb51573
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 55 additions and 5 deletions

View File

@ -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:

View File

@ -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