コード例 #1
0
ファイル: i18n.py プロジェクト: jingru97/securedrop
def get_locale(config: SDConfig) -> str:
    """
    Return the best supported locale for a request.

    Get the locale as follows, by order of precedence:
    - l request argument or session['locale']
    - browser suggested locale, from the Accept-Languages header
    - config.DEFAULT_LOCALE
    """
    # Default to any locale set in the session.
    locale = session.get("locale")

    # A valid locale specified in request.args takes precedence.
    if request.args.get("l"):
        negotiated = negotiate_locale([request.args["l"]], LOCALES.keys())
        if negotiated:
            locale = negotiated

    # If the locale is not in the session or request.args, negotiate
    # the best supported option from the browser's accepted languages.
    if not locale:
        locale = negotiate_locale(get_accepted_languages(), LOCALES.keys())

    # Finally, fall back to the default locale if necessary.
    return locale or config.DEFAULT_LOCALE
コード例 #2
0
ファイル: i18n.py プロジェクト: freedomofpress/securedrop
def get_locale(config: SDConfig) -> str:
    """
    Return the best supported locale for a request.

    Get the locale as follows, by order of precedence:
    - l request argument or session['locale']
    - browser suggested locale, from the Accept-Languages header
    - config.DEFAULT_LOCALE
    - config.FALLBACK_LOCALE
    """
    preferences = []
    if session.get("locale"):
        preferences.append(session.get("locale"))
    if request.args.get("l"):
        preferences.insert(0, request.args.get("l"))
    if not preferences:
        preferences.extend(get_accepted_languages())
    preferences.append(config.DEFAULT_LOCALE)
    preferences.append(FALLBACK_LOCALE)

    negotiated = negotiate_locale(preferences, LOCALES.keys())

    if not negotiated:
        raise ValueError("No usable locale")

    return negotiated
コード例 #3
0
def get_locale():
    if current_user is not None and not current_user.is_anonymous:
        return current_user.lang
    preferred = [
        x.replace('-', '_') for x in request.accept_languages.values()
    ]
    return negotiate_locale(preferred, Config.LANGUAGES.keys())
コード例 #4
0
def gettext_from_dict(catalog, locale, default_locale):
    """Get translation string from a dictionary."""
    # First try with negotiate_locale. Negotiate locale will not properly
    # negotiate e.g "en" when the available locales are "en_GB" and "da", even
    # though "en_GB" could be used.
    selected = negotiate_locale([str(locale)], catalog.keys())
    if selected:
        return catalog[selected]

    # In situations where negotiate locale doesn't work, we check if the
    # language itself might be found.

    # Extract language keys only.
    catalog_langs = {
        Locale.parse(l).language: l
        for (l, msg) in catalog.items()
    }
    if isinstance(locale, str):
        locale = Locale.parse(locale)
    if locale.language in catalog_langs:
        # If primary language match, use that
        catalog_key = catalog_langs[locale.language]
        return catalog[catalog_key]
    # If not, use default locale (must be defined it is defined)
    # "en" is set as fallback lng.
    return catalog.get(str(default_locale), "en")
コード例 #5
0
ファイル: main.py プロジェクト: tsdicloud/otc_alexa_command
def get_current_locale():
    if hasattr(ask_request, 'locale'):
        #preferred = [x.replace('-', '_') for x in ask_request.locale.values()]
        preferred = [ ask_request.locale.replace('-', '_')]
    else:
        preferred = [app.config['BABEL_DEFAULT_LOCALE']]
    language = negotiate_locale(preferred, app.config['BABEL_ASK_LOCALES'])
    app.logger.debug("Selected language={}".format(language))
    app.logger.debug(app.config['BABEL_TRANSLATION_DIRECTORIES'])
    return language
コード例 #6
0
ファイル: test_core.py プロジェクト: nickretallack/babel
def test_negotiate_locale():
    assert core.negotiate_locale(["de_DE", "en_US"], ["de_DE", "de_AT"]) == "de_DE"
    assert core.negotiate_locale(["de_DE", "en_US"], ["en", "de"]) == "de"
    assert core.negotiate_locale(["de_DE", "en_US"], ["de_de", "de_at"]) == "de_DE"
    assert core.negotiate_locale(["de_DE", "en_US"], ["de_de", "de_at"]) == "de_DE"
    assert core.negotiate_locale(["ja", "en_US"], ["ja_JP", "en_US"]) == "ja_JP"
    assert core.negotiate_locale(["no", "sv"], ["nb_NO", "sv_SE"]) == "nb_NO"
コード例 #7
0
 def get_locale():
     translations = set(
         [str(locale) for locale in self.babel.list_translations()])
     translations.add(BABEL_DEFAULT_LOCALE)
     logger.debug('Available translations: %s', translations)
     logger.debug('accept_languages: %s', request.accept_languages)
     preferred = [
         locale.replace('-', '_')
         for locale in request.accept_languages.values()
     ]
     best_match = negotiate_locale(preferred, translations)
     logger.debug('Best locale match: %s', best_match)
     return best_match
コード例 #8
0
ファイル: i18n.py プロジェクト: freedomofpress/securedrop
def get_locale(config):
    """
    Get the locale as follows, by order of precedence:
    - l request argument or session['locale']
    - browser suggested locale, from the Accept-Languages header
    - config.DEFAULT_LOCALE
    - 'en_US'
    """
    locale = None
    accept_languages = []
    for l in request.accept_languages.values():
        if '-' in l:
            sep = '-'
        else:
            sep = '_'
        try:
            accept_languages.append(str(core.Locale.parse(l, sep)))
        except:
            pass
    if 'l' in request.args:
        if len(request.args['l']) == 0:
            if 'locale' in session:
                del session['locale']
            locale = core.negotiate_locale(accept_languages, LOCALES)
        else:
            locale = core.negotiate_locale([request.args['l']], LOCALES)
            session['locale'] = locale
    else:
        if 'locale' in session:
            locale = session['locale']
        else:
            locale = core.negotiate_locale(accept_languages, LOCALES)

    if locale:
        return locale
    else:
        return getattr(config, 'DEFAULT_LOCALE', 'en_US')
コード例 #9
0
def get_locale():
    """
    Get the locale as follows, by order of precedence:
    - l request argument or session['locale']
    - browser suggested locale, from the Accept-Languages header
    - config.DEFAULT_LOCALE
    - 'en_US'
    """
    locale = None
    accept_languages = []
    for l in request.accept_languages.values():
        if '-' in l:
            sep = '-'
        else:
            sep = '_'
        try:
            accept_languages.append(str(core.Locale.parse(l, sep)))
        except:
            pass
    if 'l' in request.args:
        if len(request.args['l']) == 0:
            if 'locale' in session:
                del session['locale']
            locale = core.negotiate_locale(accept_languages, LOCALES)
        else:
            locale = core.negotiate_locale([request.args['l']], LOCALES)
            session['locale'] = locale
    else:
        if 'locale' in session:
            locale = session['locale']
        else:
            locale = core.negotiate_locale(accept_languages, LOCALES)

    if locale:
        return locale
    else:
        return getattr(config, 'DEFAULT_LOCALE', 'en_US')
コード例 #10
0
def test_negotiate_locale():
    assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) ==
            'de_DE')
    assert core.negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) == 'de'
    assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) ==
            'de_DE')
    assert (core.negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) ==
            'de_DE')
    assert (core.negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US']) ==
            'ja_JP')
    assert core.negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE']) == 'nb_NO'
コード例 #11
0
    def localized_page(self):
        """The current localized page

        This is the flatpage of the first available locale from
        :py:func:`~sipa.babel.locale_preferences`, or
        :py:attr:`default_page`.

        :returns: The localized page
        :rtype: Whatever has been added, hopefully :py:class:`Page`
        """
        available_locales = list(self.localized_pages.keys())

        user_locale = str(get_user_locale_setting())
        if user_locale is None:
            preferred_locales = []
        else:
            preferred_locales = [user_locale]
        preferred_locales.extend(request.accept_languages.values())

        negotiated_locale = negotiate_locale(
            preferred_locales, available_locales, sep='-')
        if negotiated_locale is not None:
            return self.localized_pages[negotiated_locale]
        return self.default_page
コード例 #12
0
def main(args):
    try:
        domain, source_file = args
    except:
        raise ScriptError('Usage: %s DOMAIN POFILE' %
                          os.path.basename(sys.argv[0]))
    domains = _get_domains()
    locales = _get_locales(domain)
    if not domains:
        raise ScriptError('No trac/locale/*.pot files.')
    if domain not in domains:
        raise ScriptError('Domain parameter should be one of %s.' %
                          ', '.join(domains))
    if not locales:
        raise ScriptError('No trac/locale/*/LC_MESSAGES/*.po files.')
    source = _open_pofile(source_file)
    preferred_locales = [
        value.split(None, 1)[0]
        for value in (source.locale and str(source.locale),
                      source.language_team) if value
    ]
    locale = negotiate_locale(preferred_locales, locales)
    if not locale or locale == 'en_US':
        sys.stderr.write('No available *.po file for %s.\n' %
                         ', '.join(preferred_locales))
        return 1
    target_file = os.path.join('trac', 'locale', locale, 'LC_MESSAGES',
                               domain + '.po')
    target = _open_pofile(target_file)
    pot = _open_pofile(os.path.join('trac', 'locale', domain + '.pot'))
    n = 0
    for source_msg in source:
        msgid = source_msg.id
        if msgid == '':
            continue
        if not _has_msgstr(source_msg):
            continue
        if msgid in target:
            target_msg = target[msgid]
        elif msgid in pot:
            target_msg = pot[msgid]
        else:
            continue
        if target_msg.string == source_msg.string:
            continue
        if not _has_msgstr(source_msg):
            continue
        if _has_msgstr(target_msg) and not _is_fuzzy(target_msg):
            continue
        if msgid not in target:
            target_msg = target_msg.clone()
            target[msgid] = target_msg
        target_msg.string = source_msg.string
        target_msg.flags = source_msg.flags
        n += 1
    if n > 0:
        with open(target_file, 'w') as f:
            write_po(f, target)
            del f
        print('Merged %d messages from %s and updated %s' %
              (n, source_file, target_file))
    else:
        print('Merged no messages from %s' % source_file)
コード例 #13
0
ファイル: app.py プロジェクト: GliderGeek/proSoar
def get_locale():
    preferred = map(lambda x: x.replace('-', '_'),
                    request.accept_languages.values())
    return negotiate_locale(preferred, AVAILABLE_LOCALES)
コード例 #14
0
ファイル: merge_catalog.py プロジェクト: wataash/trac
def main():
    """Merge translated strings from another PO file.

    $ src=../trac-1.2-stable/trac/locale/de/LC_MESSAGES
    $ PYTHONPATH=. contrib/%(prog)s messages $src/messages.po [locale]
    """
    domains = _get_domains()
    if not domains:
        raise ScriptError('No trac/locale/*.pot files.')
    parser = argparse.ArgumentParser(usage=main.__doc__)
    parser.add_argument('domain',
                        choices=domains,
                        help="Name of catalog to merge")
    parser.add_argument('pofile', help="Path of the catalog to merge from")
    parser.add_argument('locale',
                        help="Locale of the catalog to merge from",
                        nargs='?',
                        default=None)
    args = parser.parse_args()

    domain, source_file, locale = args.domain, args.pofile, args.locale
    locales = _get_locales(domain)
    if not locales:
        raise ScriptError('No trac/locale/*/LC_MESSAGES/*.po files.')
    pot = _open_pofile(os.path.join('trac', 'locale', domain + '.pot'))
    source = _open_pofile(source_file)
    if locale:
        preferred_locales = [locale]
    else:
        preferred_locales = [
            value.split(None, 1)[0]
            for value in (source.locale and str(source.locale),
                          source.language_team) if value
        ]
    locale = negotiate_locale(preferred_locales, locales)
    if not locale or locale == 'en_US':
        raise ScriptError('No available *.po file for %s.\n' %
                          ', '.join(preferred_locales))
    target_file = os.path.join('trac', 'locale', locale, 'LC_MESSAGES',
                               domain + '.po')
    target = _open_pofile(target_file)
    pot = _open_pofile(os.path.join('trac', 'locale', domain + '.pot'))
    n = 0
    for source_msg in source:
        msgid = source_msg.id
        if msgid == '':
            continue
        if not _has_msgstr(source_msg):
            continue
        if msgid in target:
            target_msg = target[msgid]
        elif msgid in pot:
            target_msg = pot[msgid]
        else:
            continue
        if target_msg.string == source_msg.string:
            continue
        if not _has_msgstr(source_msg):
            continue
        if _has_msgstr(target_msg) and not _is_fuzzy(target_msg):
            continue
        if msgid not in target:
            target_msg = target_msg.clone()
            target[msgid] = target_msg
        target_msg.string = source_msg.string
        target_msg.flags = source_msg.flags
        n += 1
    if n > 0:
        target.msgid_bugs_address = pot.msgid_bugs_address
        target.revision_date = datetime.utcnow()
        target.locale = locale
        target.language_team = '%s <%s>' % (locale, pot.msgid_bugs_address)
        target.fuzzy = False  # clear fuzzy flag of the header
        with open(target_file, 'w') as f:
            write_po(f, target)
            del f
        print('Merged %d messages from %s and updated %s' %
              (n, source_file, target_file))
    else:
        print('Merged no messages from %s' % source_file)
コード例 #15
0
def get_locale():
    preferred = map(lambda x: x.replace('-', '_'),
                    request.accept_languages.values())
    return negotiate_locale(preferred, AVAILABLE_LOCALES)