Also write lang names to website locales zip file

This commit is contained in:
Kovid Goyal 2017-08-23 10:57:21 +05:30
parent a66cf0f185
commit b6ef1092ce
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 50 additions and 22 deletions

View File

@ -454,6 +454,7 @@ class Translations(POT): # {{{
def compile_website_translations(self): def compile_website_translations(self):
from calibre.utils.zipfile import ZipFile, ZipInfo, ZIP_STORED from calibre.utils.zipfile import ZipFile, ZipInfo, ZIP_STORED
from calibre.ptempfile import TemporaryDirectory from calibre.ptempfile import TemporaryDirectory
from calibre.utils.localization import get_iso639_translator, get_language, get_iso_language
self.info('Compiling website translations...') self.info('Compiling website translations...')
srcbase = self.j(self.d(self.SRC), 'translations', 'website') srcbase = self.j(self.d(self.SRC), 'translations', 'website')
fmap = {} fmap = {}
@ -471,6 +472,9 @@ class Translations(POT): # {{{
for f in os.listdir(srcbase): for f in os.listdir(srcbase):
if f.endswith('.po'): if f.endswith('.po'):
l = f.partition('.')[0] l = f.partition('.')[0]
pf = l.split('_')[0]
if pf in {'en'}:
continue
d = os.path.join(tdir, l + '.mo') d = os.path.join(tdir, l + '.mo')
f = os.path.join(srcbase, f) f = os.path.join(srcbase, f)
fmap[f] = l fmap[f] = l
@ -485,6 +489,19 @@ class Translations(POT): # {{{
zi.compress_type = ZIP_STORED zi.compress_type = ZIP_STORED
zf.writestr(zi, raw) zf.writestr(zi, raw)
done.append(locale) done.append(locale)
dl = done + ['en']
lang_names = {}
for l in dl:
if l == 'en':
t = get_language
else:
t = get_iso639_translator(l).ugettext
t = partial(get_iso_language, t)
lang_names[l] = {x: t(x) for x in dl}
zi = ZipInfo('lang-names.json')
zi.compress_type = ZIP_STORED
zf.writestr(zi, json.dumps(lang_names, ensure_ascii=False).encode('utf-8'))
dest = self.j(self.d(self.stats), 'website-languages.txt') dest = self.j(self.d(self.stats), 'website-languages.txt')
with open(dest, 'wb') as f: with open(dest, 'wb') as f:
f.write(' '.join(sorted(done))) f.write(' '.join(sorted(done)))

View File

@ -60,6 +60,18 @@ def get_system_locale():
return lang return lang
def sanitize_lang(lang):
if lang:
match = re.match('[a-z]{2,3}(_[A-Z]{2}){0,1}', lang)
if match:
lang = match.group()
if lang == 'zh':
lang = 'zh_CN'
if not lang:
lang = 'en'
return lang
def get_lang(): def get_lang():
'Try to figure out what language to display the interface in' 'Try to figure out what language to display the interface in'
from calibre.utils.config_base import prefs from calibre.utils.config_base import prefs
@ -73,15 +85,7 @@ def get_lang():
import traceback import traceback
traceback.print_exc() traceback.print_exc()
lang = None lang = None
if lang: return sanitize_lang(lang)
match = re.match('[a-z]{2,3}(_[A-Z]{2}){0,1}', lang)
if match:
lang = match.group()
if lang == 'zh':
lang = 'zh_CN'
if not lang:
lang = 'en'
return lang
def is_rtl(): def is_rtl():
@ -118,13 +122,19 @@ def get_all_translators():
yield lang, GNUTranslations(buf) yield lang, GNUTranslations(buf)
def get_single_translator(mpath): def get_single_translator(mpath, which='messages'):
from zipfile import ZipFile from zipfile import ZipFile
with ZipFile(P('localization/locales.zip', allow_user_override=False), 'r') as zf: with ZipFile(P('localization/locales.zip', allow_user_override=False), 'r') as zf:
buf = cStringIO.StringIO(zf.read(mpath + '/messages.mo')) buf = cStringIO.StringIO(zf.read(mpath + '/%s.mo' % which))
return GNUTranslations(buf) return GNUTranslations(buf)
def get_iso639_translator(lang):
lang = sanitize_lang(lang)
mpath = get_lc_messages_path(lang) if lang else None
return get_single_translator(mpath, 'iso639') if mpath else None
def get_translator(bcp_47_code): def get_translator(bcp_47_code):
parts = bcp_47_code.replace('-', '_').split('_')[:2] parts = bcp_47_code.replace('-', '_').split('_')[:2]
parts[0] = lang_as_iso639_1(parts[0].lower()) or 'en' parts[0] = lang_as_iso639_1(parts[0].lower()) or 'en'
@ -334,13 +344,7 @@ def _load_iso639():
return _iso639 return _iso639
def get_language(lang): def get_iso_language(lang_trans, lang):
translate = _
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])
iso639 = _load_iso639() iso639 = _load_iso639()
ans = lang ans = lang
lang = lang.split('_')[0].lower() lang = lang.split('_')[0].lower()
@ -351,10 +355,17 @@ def get_language(lang):
ans = iso639['by_3b'][lang] ans = iso639['by_3b'][lang]
else: else:
ans = iso639['by_3t'].get(lang, ans) ans = iso639['by_3t'].get(lang, ans)
try: return lang_trans(ans)
return _lang_trans.ugettext(ans)
except AttributeError:
return translate(ans) def get_language(lang):
translate = _
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])
return get_iso_language(getattr(_lang_trans, 'ugettext', translate), lang)
def calibre_langcode_to_name(lc, localize=True): def calibre_langcode_to_name(lc, localize=True):