on master help sign in
fix default locale and language issues
c0006caMarc Abonce Seguin
searx/preferences.py+7−2
@@ -4,6 +4,7 @@ from sys import version
4
4
5from searx import settings, autocomplete
5from searx import settings, autocomplete
6from searx.languages import language_codes as languages
6from searx.languages import language_codes as languages
7+from searx.utils import match_language
7from searx.url_utils import parse_qs, urlencode
8from searx.url_utils import parse_qs, urlencode
8
9
9if version[0] == '3':
10if version[0] == '3':
@@ -11,7 +12,7 @@ if version[0] == '3':
11
12
12
13
13COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5 # 5 years
14COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5 # 5 years
14−LANGUAGE_CODES = [l[0].split('-')[0] for l in languages]
15+LANGUAGE_CODES = [l[0] for l in languages]
15LANGUAGE_CODES.append('all')
16LANGUAGE_CODES.append('all')
16DISABLED = 0
17DISABLED = 0
17ENABLED = 1
18ENABLED = 1
@@ -132,6 +133,10 @@ class SetSetting(Setting):
132class SearchLanguageSetting(EnumStringSetting):
133class SearchLanguageSetting(EnumStringSetting):
133 """Available choices may change, so user's value may not be in choices anymore"""
134 """Available choices may change, so user's value may not be in choices anymore"""
134
135
136+ def _validate_selection(self, selection):
137+ if not match_language(selection, self.choices, fallback=None) and selection != "":
138+ raise ValidationException('Invalid language code: "{0}"'.format(selection))
139+
135 def parse(self, data):
140 def parse(self, data):
136 if data not in self.choices and data != self.value:
141 if data not in self.choices and data != self.value:
137 # hack to give some backwards compatibility with old language cookies
142 # hack to give some backwards compatibility with old language cookies
@@ -268,7 +273,7 @@ class Preferences(object):
268 super(Preferences, self).__init__()
273 super(Preferences, self).__init__()
269
274
270 self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']),
275 self.key_value_settings = {'categories': MultipleChoiceSetting(['general'], choices=categories + ['none']),
271− 'language': SearchLanguageSetting(settings['ui']['default_locale'],
276+ 'language': SearchLanguageSetting(settings['search']['default_lang'],
272 choices=list(LANGUAGE_CODES) + ['']),
277 choices=list(LANGUAGE_CODES) + ['']),
273 'locale': EnumStringSetting(settings['ui']['default_locale'],
278 'locale': EnumStringSetting(settings['ui']['default_locale'],
274 choices=list(settings['locales'].keys()) + ['']),
279 choices=list(settings['locales'].keys()) + ['']),
searx/settings.yml+1
@@ -5,6 +5,7 @@ general:
5search:
5search:
6 safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
6 safe_search : 0 # Filter results. 0: None, 1: Moderate, 2: Strict
7 autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default
7 autocomplete : "" # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "startpage", "wikipedia" - leave blank to turn it off by default
8+ default_lang : "" # Default search language - leave blank to detect from browser information or use codes from 'languages.py'
8 ban_time_on_fail : 5 # ban time in seconds after engine errors
9 ban_time_on_fail : 5 # ban time in seconds after engine errors
9 max_ban_time_on_fail : 120 # max ban time in seconds after engine errors
10 max_ban_time_on_fail : 120 # max ban time in seconds after engine errors
10
11
searx/webapp.py+11−11
@@ -157,14 +157,16 @@ _category_names = (gettext('files'),
157outgoing_proxies = settings['outgoing'].get('proxies') or None
157outgoing_proxies = settings['outgoing'].get('proxies') or None
158
158
159
159
160+def _get_browser_language(request, lang_list):
161+ for lang in request.headers.get("Accept-Language", "en").split(","):
162+ locale = match_language(lang, lang_list, fallback=None)
163+ if locale is not None:
164+ return locale
165+
166+
160@babel.localeselector
167@babel.localeselector
161def get_locale():
168def get_locale():
162− locale = "en-US"
169+ locale = _get_browser_language(request, settings['locales'].keys())
163−
164− for lang in request.headers.get("Accept-Language", locale).split(","):
165− locale = match_language(lang, settings['locales'].keys(), fallback=None)
166− if locale is not None:
167− break
168
170
169 logger.debug("default locale from browser info is `%s`", locale)
171 logger.debug("default locale from browser info is `%s`", locale)
170
172
@@ -372,8 +374,7 @@ def render(template_name, override_theme=None, **kwargs):
372 kwargs['language_codes'] = languages
374 kwargs['language_codes'] = languages
373 if 'current_language' not in kwargs:
375 if 'current_language' not in kwargs:
374 kwargs['current_language'] = match_language(request.preferences.get_value('language'),
376 kwargs['current_language'] = match_language(request.preferences.get_value('language'),
375− LANGUAGE_CODES,
377+ LANGUAGE_CODES)
376− fallback=locale)
377
378
378 # override url_for function in templates
379 # override url_for function in templates
379 kwargs['url_for'] = url_for_theme
380 kwargs['url_for'] = url_for_theme
@@ -444,11 +445,10 @@ def pre_request():
444 request.errors.append(gettext('Invalid settings'))
445 request.errors.append(gettext('Invalid settings'))
445
446
446 # init search language and locale
447 # init search language and locale
447− locale = get_locale()
448 if not preferences.get_value("language"):
448 if not preferences.get_value("language"):
449− preferences.parse_dict({"language": locale})
449+ preferences.parse_dict({"language": _get_browser_language(request, LANGUAGE_CODES)})
450 if not preferences.get_value("locale"):
450 if not preferences.get_value("locale"):
451− preferences.parse_dict({"locale": locale})
451+ preferences.parse_dict({"locale": get_locale()})
452
452
453 # request.user_plugins
453 # request.user_plugins
454 request.user_plugins = []
454 request.user_plugins = []