示例#1
0
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
示例#2
0
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