Fix #1860831 [Two Portuguese when to choose the language](https://bugs.launchpad.net/calibre/+bug/1860831)

This commit is contained in:
Kovid Goyal 2020-04-04 17:26:47 +05:30
parent 5c54239ade
commit 28c7e43940
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 50 additions and 39 deletions

View File

@ -555,7 +555,7 @@ class Translations(POT): # {{{
def _compile_website_translations(self, name='website', threshold=50):
from calibre.utils.zipfile import ZipFile, ZipInfo, ZIP_STORED
from calibre.ptempfile import TemporaryDirectory
from calibre.utils.localization import get_iso639_translator, get_language, get_iso_language
from calibre.utils.localization import get_language, translator_for_lang
self.info('Compiling', name, 'translations...')
srcbase = self.j(self.d(self.SRC), 'translations', name)
if not os.path.exists(srcbase):
@ -596,11 +596,9 @@ class Translations(POT): # {{{
lang_names = {}
for l in dl:
if l == 'en':
t = get_language
else:
t = getattr(get_iso639_translator(l), 'gettext' if ispy3 else 'ugettext')
t = partial(get_iso_language, t)
translator = translator_for_lang(l)['translator']
t = getattr(translator, 'gettext' if ispy3 else 'ugettext')
t = partial(get_language, gettext_func=t)
lang_names[l] = {x: t(x) for x in dl}
zi = ZipInfo('lang-names.json')
zi.compress_type = ZIP_STORED

View File

@ -209,50 +209,61 @@ def load_po(path):
return buf
def set_translators():
global _lang_trans, lcdata
# To test different translations invoke as
# CALIBRE_OVERRIDE_LANG=de_DE.utf8 program
lang = get_lang()
t = buf = iso639 = None
def translator_for_lang(lang):
t = buf = iso639 = lcdata = None
if 'CALIBRE_TEST_TRANSLATION' in os.environ:
buf = load_po(os.path.expanduser(os.environ['CALIBRE_TEST_TRANSLATION']))
if lang:
mpath = get_lc_messages_path(lang)
if buf is None and mpath and os.access(mpath + '.po', os.R_OK):
buf = load_po(mpath + '.po')
mpath = get_lc_messages_path(lang)
if buf is None and mpath and os.access(mpath + '.po', os.R_OK):
buf = load_po(mpath + '.po')
if mpath is not None:
from zipfile import ZipFile
with ZipFile(P('localization/locales.zip',
allow_user_override=False), 'r') as zf:
if buf is None:
buf = io.BytesIO(zf.read(mpath + '/messages.mo'))
if mpath == 'nds':
mpath = 'de'
isof = mpath + '/iso639.mo'
if mpath is not None:
from zipfile import ZipFile
with ZipFile(P('localization/locales.zip',
allow_user_override=False), 'r') as zf:
if buf is None:
buf = io.BytesIO(zf.read(mpath + '/messages.mo'))
if mpath == 'nds':
mpath = 'de'
isof = mpath + '/iso639.mo'
try:
iso639 = io.BytesIO(zf.read(isof))
except:
pass # No iso639 translations for this lang
if buf is not None:
from calibre.utils.serialize import msgpack_loads
try:
iso639 = io.BytesIO(zf.read(isof))
lcdata = msgpack_loads(zf.read(mpath + '/lcdata.calibre_msgpack'))
except:
pass # No iso639 translations for this lang
if buf is not None:
from calibre.utils.serialize import msgpack_loads
try:
lcdata = msgpack_loads(zf.read(mpath + '/lcdata.calibre_msgpack'))
except:
pass # No lcdata
pass # No lcdata
if buf is not None:
t = GNUTranslations(buf)
if iso639 is not None:
iso639 = _lang_trans = GNUTranslations(iso639)
iso639 = GNUTranslations(iso639)
t.add_fallback(iso639)
if t is None:
t = NullTranslations()
return {'translator': t, 'iso639_translator': iso639, 'lcdata': lcdata}
def set_translators():
global _lang_trans, lcdata
# To test different translations invoke as
# CALIBRE_OVERRIDE_LANG=de_DE.utf8 program
lang = get_lang()
if lang:
q = translator_for_lang(lang)
t = q['translator']
_lang_trans = q['iso639_translator']
if q['lcdata']:
lcdata = q['lcdata']
else:
t = NullTranslations()
try:
set_translators.lang = t.info().get('language')
except Exception:
@ -386,15 +397,17 @@ def get_iso_language(lang_trans, lang):
return lang_trans(ans)
def get_language(lang):
translate = _
def get_language(lang, gettext_func=None):
translate = gettext_func or _
lang = _lcase_map.get(lang, lang)
if lang in _extra_lang_codes:
# The translator was not active when _extra_lang_codes was defined, so
# re-translate
return translate(_extra_lang_codes[lang])
attr = 'gettext' if sys.version_info.major > 2 else 'ugettext'
return get_iso_language(getattr(_lang_trans, attr, translate), lang)
if gettext_func is None:
attr = 'gettext' if sys.version_info.major > 2 else 'ugettext'
gettext_func = getattr(_lang_trans, attr, translate)
return get_iso_language(gettext_func, lang)
def calibre_langcode_to_name(lc, localize=True):