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 Original line Diff line number Diff line
@@ -117,7 +117,17 @@ class SearchLanguageSetting(EnumStringSetting):
            elif lang in self.choices:
            elif lang in self.choices:
                data = lang
                data = lang
            else:
            else:
                res = None
                for lg in self.choices:
                    if data == lg.split('-')[0]:
                        res = lg
                        break

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

        self.value = data
        self.value = data




@@ -243,8 +253,8 @@ class Preferences(object):
        super(Preferences, self).__init__()
        super(Preferences, self).__init__()


        self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']),
        self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']),
                                   'language': SearchLanguageSetting(settings['search']['language'],
                                   'language': SearchLanguageSetting(settings['ui']['default_locale'],
                                                                     choices=LANGUAGE_CODES),
                                                                     choices=list(LANGUAGE_CODES) + ['']),
                                   'locale': EnumStringSetting(settings['ui']['default_locale'],
                                   'locale': EnumStringSetting(settings['ui']['default_locale'],
                                                               choices=list(settings['locales'].keys()) + ['']),
                                                               choices=list(settings['locales'].keys()) + ['']),
                                   'autocomplete': EnumStringSetting(settings['search']['autocomplete'],
                                   'autocomplete': EnumStringSetting(settings['search']['autocomplete'],
+0 −1
Original line number Original line Diff line number Diff line
@@ -5,7 +5,6 @@ general:
search:
search:
    safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
    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
    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
    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
    max_ban_time_on_fail : 120 # max ban time in seconds after engine errors


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


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


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


    if request.preferences.get_value('locale') != '':
    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
# code-highlighter
@@ -346,7 +347,9 @@ def render(template_name, override_theme=None, **kwargs):
    if 'autocomplete' not in kwargs:
    if 'autocomplete' not in kwargs:
        kwargs['autocomplete'] = request.preferences.get_value('autocomplete')
        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['rtl'] = True


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


    # override url_for function in templates
    # override url_for function in templates
    kwargs['url_for'] = url_for_theme
    kwargs['url_for'] = url_for_theme
@@ -429,6 +432,13 @@ def pre_request():
            logger.exception('invalid settings')
            logger.exception('invalid settings')
            request.errors.append(gettext('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
    request.user_plugins = []
    request.user_plugins = []
    allowed_plugins = preferences.plugins.get_enabled()
    allowed_plugins = preferences.plugins.get_enabled()
@@ -635,7 +645,7 @@ def index():
        unresponsive_engines=result_container.unresponsive_engines,
        unresponsive_engines=result_container.unresponsive_engines,
        current_language=match_language(search_query.lang,
        current_language=match_language(search_query.lang,
                                        LANGUAGE_CODES,
                                        LANGUAGE_CODES,
                                        fallback=settings['search']['language']),
                                        fallback=request.preferences.get_value("language")),
        base_url=get_base_url(),
        base_url=get_base_url(),
        theme=get_current_theme_name(),
        theme=get_current_theme_name(),
        favicons=global_favicons[themes.index(get_current_theme_name())],
        favicons=global_favicons[themes.index(get_current_theme_name())],
@@ -748,7 +758,7 @@ def preferences():


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