def translation(domain, localedir=None, languages=None, _class=None, fallback=False, codeset=None): """Similar to gettext.translation() but also search inside ZIP archives if this module is loaded from one. """ if languages is None: languages = get_languages() archive = __archive__ if (localedir is None or archive is None or not startswith_token(localedir, archive, os.sep)): return _gettext.translation(domain, localedir, languages, _class, fallback, codeset) languages = tuple(unique(get_fallback_languages(languages))) translations = None if languages: assert startswith_token(localedir, archive, dirseps) localedir = strip(localedir, dirseps, start=len(archive) + len(os.sep)) locale_suffix = os.path.join('LC_MESSAGES', os.extsep.join((domain, 'mo'))) with ZipFile(archive) as archive: #archive.debug = 3 for lang in languages: lang_path = os.path.join(localedir, lang, locale_suffix) #print('Trying', lang_path, '...', file=sys.stderr) translation_file = archive.open(lang_path, follow_symlinks=True, fail_missing=False) if translation_file is not None: with translation_file: #print("Found language '{:s}' at '{:s}'.".format(lang, lang_path)) translations = ((_class or GNUTranslations)(translation_file)) break if translations is None: if not fallback: raise OSError("No translation in '{:s}:{:s}' for: {:s}".format( archive, localedir, ', '.join(languages))) translations = NullTranslations() if codeset is not None: translations.set_output_charset(codeset) return translations
def ActivateTranslation(session, config, language, localedir=None): global ACTIVE_TRANSLATION, RECENTLY_TRANSLATED if not language: language = os.getenv('LANG', None) if not localedir: import mailpile.config.paths localedir = mailpile.config.paths.DEFAULT_LOCALE_DIRECTORY() trans = None if (not language) or language[:5].lower() in ('en', 'en_us', 'c'): trans = NullTranslations() elif language: try: trans = translation("mailpile", localedir, [language], codeset="utf-8") except IOError: if session: session.ui.debug('Failed to load language %s' % language) if not trans: trans = translation("mailpile", localedir, codeset='utf-8', fallback=True) if session: session.ui.debug('Failed to configure i18n (%s). ' 'Using fallback.' % language) if trans: with RECENTLY_TRANSLATED_LOCK: RECENTLY_TRANSLATED = [] ACTIVE_TRANSLATION = trans trans.org_gettext = trans.gettext trans.org_ngettext = trans.ngettext trans.gettext = lambda t, g: gettext(g) trans.ngettext = lambda t, s1, s2, n: ngettext(s1, s2, n) trans.set_output_charset("utf-8") if hasattr(config, 'jinja_env'): config.jinja_env.install_gettext_translations(trans, newstyle=True) if session and language and not isinstance(trans, NullTranslations): session.ui.debug(gettext('Loaded language %s') % language) return trans