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

Commit 443c45a9 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.

Close: https://github.com/asciimoo/searx/issues/844
Close: #35, #42
parent 4e5430a1
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -117,7 +117,17 @@ class SearchLanguageSetting(EnumStringSetting):
            elif lang in self.choices:
                data = lang
            else:
                res = None
                for lg in self.choices:
                    if data == lg.split('-')[0]:
                        res = lg
                        break

                if res is None:
                    data = self.value
                else:
                    data = res

        self.value = data


@@ -243,8 +253,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

+22 −12
Original line number Diff line number Diff line
@@ -157,18 +157,19 @@ outgoing_proxies = settings['outgoing'].get('proxies') or None

@babel.localeselector
def get_locale():
    if 'locale' in request.form\
       and request.form['locale'] in settings['locales']:
        return request.form['locale']
    locale = "en-US"

    if 'locale' in request.args\
       and request.args['locale'] in settings['locales']:
        return request.args['locale']
    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

    if request.preferences.get_value('locale') != '':
        return request.preferences.get_value('locale')
        locale = request.preferences.get_value('locale')

    return request.accept_languages.best_match(settings['locales'].keys())
    logger.debug("selected locale is `%s`", locale)

    return locale


# code-highlighter
@@ -346,7 +347,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
@@ -359,7 +362,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
@@ -429,6 +432,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()
@@ -635,7 +645,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())],
@@ -748,7 +758,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,