From 7176dc8137a74d12c1514b85b36df20c9a710b60 Mon Sep 17 00:00:00 2001 From: Eryg Kai Date: Mon, 24 Apr 2023 21:47:15 -0800 Subject: [PATCH] Support flask-babel 3.0 --- requirements.txt | 4 +-- searx/webapp.py | 70 ++++++++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/requirements.txt b/requirements.txt index b0b9789b..5f3ed4d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ Brotli==1.0.9 -babel==2.11.0 +babel==2.12.1 certifi==2022.12.7 -flask-babel==2.0.0 +flask-babel==3.1.0 flask==2.2.2 jinja2==3.1.2 langdetect==1.0.9 diff --git a/searx/webapp.py b/searx/webapp.py index 2027e72d..2658860e 100755 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -141,11 +141,47 @@ if not werkzeug_reloader\ or (werkzeug_reloader and os.environ.get("WERKZEUG_RUN_MAIN") == "true"): search_initialize(enable_checker=True) -babel = Babel(app) +ui_locale_codes = [l.replace('_', '-') for l in settings['locales'].keys()] + + +def get_locale(): + if 'locale' in request.form\ + and request.form['locale'] in settings['locales']: + # use locale from the form + locale = request.form['locale'] + locale_source = 'form' + elif request.preferences.get_value('locale') != '': + # use locale from the preferences + locale = request.preferences.get_value('locale') + locale_source = 'preferences' + else: + # use local from the browser + locale = _get_browser_or_settings_language(request, ui_locale_codes) + locale = locale.replace('-', '_') + locale_source = 'browser' + + # see _get_translations function + # and https://github.com/searx/searx/pull/1863 + if locale == 'oc': + request.form['use-translation'] = 'oc' + locale = 'fr_FR' + + logger.debug( + "%s uses locale `%s` from %s", urllib.parse.quote(request.url), locale, locale_source + ) + + return locale + + +babel = Babel() +if hasattr(babel, "localeselector"): + babel.init_app(app) + babel.localeselector(get_locale) +else: + babel.init_app(app, locale_selector=get_locale) rtl_locales = ['ar', 'arc', 'bcc', 'bqi', 'ckb', 'dv', 'fa', 'fa_IR', 'glk', 'he', 'ku', 'mzn', 'pnb', 'ps', 'sd', 'ug', 'ur', 'yi'] -ui_locale_codes = [l.replace('_', '-') for l in settings['locales'].keys()] # used when translating category names _category_names = (gettext('files'), @@ -188,36 +224,6 @@ def _get_browser_or_settings_language(request, lang_list): return settings['search']['default_lang'] or 'en' -@babel.localeselector -def get_locale(): - if 'locale' in request.form\ - and request.form['locale'] in settings['locales']: - # use locale from the form - locale = request.form['locale'] - locale_source = 'form' - elif request.preferences.get_value('locale') != '': - # use locale from the preferences - locale = request.preferences.get_value('locale') - locale_source = 'preferences' - else: - # use local from the browser - locale = _get_browser_or_settings_language(request, ui_locale_codes) - locale = locale.replace('-', '_') - locale_source = 'browser' - - # see _get_translations function - # and https://github.com/searx/searx/pull/1863 - if locale == 'oc': - request.form['use-translation'] = 'oc' - locale = 'fr_FR' - - logger.debug( - "%s uses locale `%s` from %s", urllib.parse.quote(request.url), locale, locale_source - ) - - return locale - - # code-highlighter @app.template_filter('code_highlighter') def code_highlighter(codelines, language=None):