Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 373a66be authored by Nicolas Gelot's avatar Nicolas Gelot
Browse files

Fix locale and search language

Locale and search language was always defined with english value.

This patch inits the locale on `pre_request` in order to define the
default value of locale and language preferences.

Plus the `best_match` function provided by flask babel library did not
work as expected. So the function `match_language` provided
by searx is used to detect that the language from Accepted-Language
header can be used in searx project.
parent a818d324
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -243,8 +243,8 @@ class Preferences(object):
        super(Preferences, self).__init__()

        self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']),
                                   'language': SearchLanguageSetting(settings['search']['language'],
                                                                     choices=LANGUAGE_CODES),
                                   'language': SearchLanguageSetting(settings['ui']['default_locale'],
                                                                     choices=list(LANGUAGE_CODES) + ['']),
                                   'locale': EnumStringSetting(settings['ui']['default_locale'],
                                                               choices=list(settings['locales'].keys()) + ['']),
                                   'autocomplete': EnumStringSetting(settings['search']['autocomplete'],
+0 −1
Original line number Diff line number Diff line
@@ -5,7 +5,6 @@ general:
search:
    safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
    autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default
    language : "en-US"
    ban_time_on_fail : 5 # ban time in seconds after engine errors
    max_ban_time_on_fail : 120 # max ban time in seconds after engine errors

+23 −5
Original line number Diff line number Diff line
@@ -152,7 +152,14 @@ outgoing_proxies = settings['outgoing'].get('proxies') or None

@babel.localeselector
def get_locale():
    locale = request.accept_languages.best_match(settings['locales'].keys())
    locale = "en-US"

    for lang in request.headers.get("Accept-Language", locale).split(","):
        locale = match_language(lang, settings['locales'].keys(), fallback=None)
        if locale is not None:
            break

    logger.debug("default locale from browser info is `%s`", locale)

    if request.preferences.get_value('locale') != '':
        locale = request.preferences.get_value('locale')
@@ -164,6 +171,8 @@ def get_locale():
    if locale == 'zh_TW':
        locale = 'zh_Hant_TW'

    logger.debug("selected locale is `%s`", locale)

    return locale


@@ -342,7 +351,9 @@ def render(template_name, override_theme=None, **kwargs):
    if 'autocomplete' not in kwargs:
        kwargs['autocomplete'] = request.preferences.get_value('autocomplete')

    if get_locale() in rtl_locales and 'rtl' not in kwargs:
    locale = request.preferences.get_value('locale')

    if locale in rtl_locales and 'rtl' not in kwargs:
        kwargs['rtl'] = True

    kwargs['searx_version'] = VERSION_STRING
@@ -355,7 +366,7 @@ def render(template_name, override_theme=None, **kwargs):
    if 'current_language' not in kwargs:
        kwargs['current_language'] = match_language(request.preferences.get_value('language'),
                                                    LANGUAGE_CODES,
                                                    fallback=settings['search']['language'])
                                                    fallback=locale)

    # override url_for function in templates
    kwargs['url_for'] = url_for_theme
@@ -423,6 +434,13 @@ def pre_request():
            logger.exception('invalid settings')
            request.errors.append(gettext('Invalid settings'))

    # init search language and locale
    locale = get_locale()
    if not preferences.get_value("language"):
        preferences.parse_dict({"language": locale})
    if not preferences.get_value("locale"):
        preferences.parse_dict({"locale": locale})

    # request.user_plugins
    request.user_plugins = []
    allowed_plugins = preferences.plugins.get_enabled()
@@ -593,7 +611,7 @@ def index():
        unresponsive_engines=result_container.unresponsive_engines,
        current_language=match_language(search_query.lang,
                                        LANGUAGE_CODES,
                                        fallback=settings['search']['language']),
                                        fallback=request.preferences.get_value("language")),
        base_url=get_base_url(),
        theme=get_current_theme_name(),
        favicons=global_favicons[themes.index(get_current_theme_name())]
@@ -702,7 +720,7 @@ def preferences():

    return render('preferences.html',
                  locales=settings['locales'],
                  current_locale=get_locale(),
                  current_locale=request.preferences.get_value("locale"),
                  image_proxy=image_proxy,
                  engines_by_category=categories,
                  stats=stats,