Merge pull request #247 from dalf/remote_settings_locales
settings.yml: remove locales section.
This commit is contained in:
		
						commit
						4e2ec9b8b3
					
				
							
								
								
									
										8
									
								
								docs/src/searx.locales.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								docs/src/searx.locales.rst
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | .. _searx.locales: | ||||||
|  | 
 | ||||||
|  | ======= | ||||||
|  | Locales | ||||||
|  | ======= | ||||||
|  | 
 | ||||||
|  | .. automodule:: searx.locales | ||||||
|  |   :members: | ||||||
							
								
								
									
										75
									
								
								searx/locales.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								searx/locales.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,75 @@ | |||||||
|  | # -*- coding: utf-8 -*- | ||||||
|  | # SPDX-License-Identifier: AGPL-3.0-or-later | ||||||
|  | # lint: pylint | ||||||
|  | """Initialize :py:obj:`LOCALE_NAMES`, :py:obj:`UI_LOCALE_CODES` and | ||||||
|  | :py:obj:`RTL_LOCALES`.""" | ||||||
|  | 
 | ||||||
|  | from typing import List, Set | ||||||
|  | import os | ||||||
|  | import pathlib | ||||||
|  | 
 | ||||||
|  | from babel import Locale | ||||||
|  | 
 | ||||||
|  | LOCALE_NAMES = { | ||||||
|  |     "oc": "Occitan", | ||||||
|  |     "nl_BE": "Vlaams (Dutch, Belgium)", | ||||||
|  | } | ||||||
|  | """Mapping of locales and their description.  Locales e.g. 'fr' or 'pt_BR' | ||||||
|  | (delimiter is *underline* '_')""" | ||||||
|  | 
 | ||||||
|  | UI_LOCALE_CODES: List[str] = [] | ||||||
|  | """List of locales e.g. 'fr' or 'pt-BR' (delimiter is '-')""" | ||||||
|  | 
 | ||||||
|  | RTL_LOCALES: Set[str] = set() | ||||||
|  | """List of *Right-To-Left* locales e.g. 'he' or 'fa_IR' (delimiter is | ||||||
|  | *underline* '_')""" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _get_name(locale, language_code): | ||||||
|  |     language_name = locale.get_language_name(language_code).capitalize() | ||||||
|  |     if language_name and ('a' <= language_name[0] <= 'z'): | ||||||
|  |         language_name = language_name.capitalize() | ||||||
|  |     terrirtory_name = locale.get_territory_name(language_code) | ||||||
|  |     return language_name, terrirtory_name | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def _get_locale_name(locale, locale_name): | ||||||
|  |     """Get locale name e.g. 'Français - fr' or 'Português (Brasil) - pt-BR' | ||||||
|  | 
 | ||||||
|  |     :param locale: instance of :py:class:`Locale` | ||||||
|  |     :param locale_name: name e.g. 'fr'  or 'pt_BR' | ||||||
|  |     """ | ||||||
|  |     native_language, native_territory = _get_name(locale, locale_name) | ||||||
|  |     english_language, english_territory = _get_name(locale, 'en') | ||||||
|  |     if native_territory == english_territory: | ||||||
|  |         english_territory = None | ||||||
|  |     if not native_territory and not english_territory: | ||||||
|  |         if native_language == english_language: | ||||||
|  |             return native_language | ||||||
|  |         return native_language + ' (' + english_language + ')' | ||||||
|  |     result = native_language + ', ' + native_territory + ' (' + english_language | ||||||
|  |     if english_territory: | ||||||
|  |         return result + ', ' + english_territory + ')' | ||||||
|  |     return result + ')' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def initialize_locales(directory): | ||||||
|  |     """Initialize global names :py:obj:`LOCALE_NAMES`, :py:obj:`UI_LOCALE_CODES` and | ||||||
|  |     :py:obj:`RTL_LOCALES`. | ||||||
|  |     """ | ||||||
|  |     global LOCALE_NAMES, UI_LOCALE_CODES, RTL_LOCALES  # pylint: disable=global-statement | ||||||
|  |     for dirname in sorted(os.listdir(directory)): | ||||||
|  |         # Based on https://flask-babel.tkte.ch/_modules/flask_babel.html#Babel.list_translations | ||||||
|  |         if not os.path.isdir( os.path.join(directory, dirname, 'LC_MESSAGES') ): | ||||||
|  |             continue | ||||||
|  |         info = LOCALE_NAMES.get(dirname) | ||||||
|  |         if not info: | ||||||
|  |             locale = Locale.parse(dirname) | ||||||
|  |             LOCALE_NAMES[dirname] = _get_locale_name(locale, dirname) | ||||||
|  |             if locale.text_direction == 'rtl': | ||||||
|  |                 RTL_LOCALES.add(dirname) | ||||||
|  | 
 | ||||||
|  |     UI_LOCALE_CODES = [l.replace('_', '-') for l in LOCALE_NAMES] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | initialize_locales(pathlib.Path(__file__).parent / 'translations') | ||||||
| @ -11,6 +11,7 @@ from urllib.parse import parse_qs, urlencode | |||||||
| 
 | 
 | ||||||
| from searx import settings, autocomplete | from searx import settings, autocomplete | ||||||
| from searx.languages import language_codes as languages | from searx.languages import language_codes as languages | ||||||
|  | from searx.locales import LOCALE_NAMES | ||||||
| from searx.webutils import VALID_LANGUAGE_CODE | from searx.webutils import VALID_LANGUAGE_CODE | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -340,7 +341,7 @@ class Preferences: | |||||||
|             'locale': EnumStringSetting( |             'locale': EnumStringSetting( | ||||||
|                 settings['ui']['default_locale'], |                 settings['ui']['default_locale'], | ||||||
|                 is_locked('locale'), |                 is_locked('locale'), | ||||||
|                 choices=list(settings['locales'].keys()) + [''] |                 choices=list(LOCALE_NAMES.keys()) + [''] | ||||||
|             ), |             ), | ||||||
|             'autocomplete': EnumStringSetting( |             'autocomplete': EnumStringSetting( | ||||||
|                 settings['search']['autocomplete'], |                 settings['search']['autocomplete'], | ||||||
|  | |||||||
| @ -1651,53 +1651,6 @@ engines: | |||||||
| #        chars: ' ' | #        chars: ' ' | ||||||
| #        keys: ['line'] | #        keys: ['line'] | ||||||
| 
 | 
 | ||||||
| locales: |  | ||||||
|   en: English |  | ||||||
|   ar: العَرَبِيَّة (Arabic) |  | ||||||
|   bg: Български (Bulgarian) |  | ||||||
|   bo: བོད་སྐད་ (Tibetian) |  | ||||||
|   ca: Català (Catalan) |  | ||||||
|   cs: Čeština (Czech) |  | ||||||
|   cy: Cymraeg (Welsh) |  | ||||||
|   da: Dansk (Danish) |  | ||||||
|   de: Deutsch (German) |  | ||||||
|   el_GR: Ελληνικά (Greek_Greece) |  | ||||||
|   eo: Esperanto (Esperanto) |  | ||||||
|   es: Español (Spanish) |  | ||||||
|   et: Eesti (Estonian) |  | ||||||
|   eu: Euskara (Basque) |  | ||||||
|   fa_IR: (fārsī) فارسى (Persian) |  | ||||||
|   fi: Suomi (Finnish) |  | ||||||
|   fil: Wikang Filipino (Filipino) |  | ||||||
|   fr: Français (French) |  | ||||||
|   gl: Galego (Galician) |  | ||||||
|   he: עברית (Hebrew) |  | ||||||
|   hr: Hrvatski (Croatian) |  | ||||||
|   hu: Magyar (Hungarian) |  | ||||||
|   ia: Interlingua (Interlingua) |  | ||||||
|   it: Italiano (Italian) |  | ||||||
|   ja: 日本語 (Japanese) |  | ||||||
|   lt: Lietuvių (Lithuanian) |  | ||||||
|   nl: Nederlands (Dutch) |  | ||||||
|   nl_BE: Vlaams (Dutch_Belgium) |  | ||||||
|   oc: Lenga D'òc (Occitan) |  | ||||||
|   pl: Polski (Polish) |  | ||||||
|   pt: Português (Portuguese) |  | ||||||
|   pt_BR: Português (Portuguese_Brazil) |  | ||||||
|   ro: Română (Romanian) |  | ||||||
|   ru: Русский (Russian) |  | ||||||
|   sk: Slovenčina (Slovak) |  | ||||||
|   sl: Slovenski (Slovene) |  | ||||||
|   sr: српски (Serbian) |  | ||||||
|   sv: Svenska (Swedish) |  | ||||||
|   te: తెలుగు (telugu) |  | ||||||
|   ta: தமிழ் (Tamil) |  | ||||||
|   tr: Türkçe (Turkish) |  | ||||||
|   uk: українська мова (Ukrainian) |  | ||||||
|   vi: tiếng việt (Vietnamese) |  | ||||||
|   zh: 中文 (Chinese) |  | ||||||
|   zh_TW: 國語 (Taiwanese Mandarin) |  | ||||||
| 
 |  | ||||||
| doi_resolvers: | doi_resolvers: | ||||||
|   oadoi.org: 'https://oadoi.org/' |   oadoi.org: 'https://oadoi.org/' | ||||||
|   doi.org: 'https://doi.org/' |   doi.org: 'https://doi.org/' | ||||||
|  | |||||||
| @ -79,7 +79,7 @@ class SearxRobotLayer(): | |||||||
| def run_robot_tests(tests): | def run_robot_tests(tests): | ||||||
|     print('Running {0} tests'.format(len(tests))) |     print('Running {0} tests'.format(len(tests))) | ||||||
|     for test in tests: |     for test in tests: | ||||||
|         with Browser('firefox', headless=True) as browser: |         with Browser('firefox', headless=True, profile_preferences={'intl.accept_languages': 'en'}) as browser: | ||||||
|             test(browser) |             test(browser) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -106,6 +106,7 @@ from searx.flaskfix import patch_application | |||||||
| 
 | 
 | ||||||
| from searx.autocomplete import search_autocomplete, backends as autocomplete_backends | from searx.autocomplete import search_autocomplete, backends as autocomplete_backends | ||||||
| from searx.languages import language_codes as languages | from searx.languages import language_codes as languages | ||||||
|  | from searx.locales import LOCALE_NAMES, UI_LOCALE_CODES, RTL_LOCALES | ||||||
| from searx.search import SearchWithPlugins, initialize as search_initialize | from searx.search import SearchWithPlugins, initialize as search_initialize | ||||||
| from searx.network import stream as http_stream | from searx.network import stream as http_stream | ||||||
| from searx.search.checker import get_result as checker_get_result | from searx.search.checker import get_result as checker_get_result | ||||||
| @ -176,12 +177,6 @@ if (not werkzeug_reloader | |||||||
| 
 | 
 | ||||||
| babel = Babel(app) | babel = Babel(app) | ||||||
| 
 | 
 | ||||||
| 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 | # used when translating category names | ||||||
| _category_names = ( | _category_names = ( | ||||||
|     gettext('files'), |     gettext('files'), | ||||||
| @ -258,7 +253,7 @@ def _get_browser_or_settings_language(req, lang_list): | |||||||
| @babel.localeselector | @babel.localeselector | ||||||
| def get_locale(): | def get_locale(): | ||||||
|     if 'locale' in request.form\ |     if 'locale' in request.form\ | ||||||
|        and request.form['locale'] in settings['locales']: |        and request.form['locale'] in LOCALE_NAMES: | ||||||
|         # use locale from the form |         # use locale from the form | ||||||
|         locale = request.form['locale'] |         locale = request.form['locale'] | ||||||
|         locale_source = 'form' |         locale_source = 'form' | ||||||
| @ -268,7 +263,7 @@ def get_locale(): | |||||||
|         locale_source = 'preferences' |         locale_source = 'preferences' | ||||||
|     else: |     else: | ||||||
|         # use local from the browser |         # use local from the browser | ||||||
|         locale = _get_browser_or_settings_language(request, ui_locale_codes) |         locale = _get_browser_or_settings_language(request, UI_LOCALE_CODES) | ||||||
|         locale = locale.replace('-', '_') |         locale = locale.replace('-', '_') | ||||||
|         locale_source = 'browser' |         locale_source = 'browser' | ||||||
| 
 | 
 | ||||||
| @ -463,7 +458,7 @@ def render(template_name, override_theme=None, **kwargs): | |||||||
|     kwargs['translations'] = json.dumps(get_translations(), separators=(',', ':')) |     kwargs['translations'] = json.dumps(get_translations(), separators=(',', ':')) | ||||||
| 
 | 
 | ||||||
|     locale = request.preferences.get_value('locale') |     locale = request.preferences.get_value('locale') | ||||||
|     if locale in rtl_locales and 'rtl' not in kwargs: |     if locale in RTL_LOCALES and 'rtl' not in kwargs: | ||||||
|         kwargs['rtl'] = True |         kwargs['rtl'] = True | ||||||
|     if 'current_language' not in kwargs: |     if 'current_language' not in kwargs: | ||||||
|         kwargs['current_language'] = match_language( |         kwargs['current_language'] = match_language( | ||||||
| @ -1042,7 +1037,7 @@ def preferences(): | |||||||
|     return render( |     return render( | ||||||
|         'preferences.html', |         'preferences.html', | ||||||
|         selected_categories = get_selected_categories(request.preferences, request.form), |         selected_categories = get_selected_categories(request.preferences, request.form), | ||||||
|         locales = settings['locales'], |         locales = LOCALE_NAMES, | ||||||
|         current_locale = request.preferences.get_value("locale"), |         current_locale = request.preferences.get_value("locale"), | ||||||
|         image_proxy = image_proxy, |         image_proxy = image_proxy, | ||||||
|         engines_by_category = engines_by_category, |         engines_by_category = engines_by_category, | ||||||
| @ -1315,7 +1310,7 @@ def config(): | |||||||
|         'engines': _engines, |         'engines': _engines, | ||||||
|         'plugins': _plugins, |         'plugins': _plugins, | ||||||
|         'instance_name': settings['general']['instance_name'], |         'instance_name': settings['general']['instance_name'], | ||||||
|         'locales': settings['locales'], |         'locales': LOCALE_NAMES, | ||||||
|         'default_locale': settings['ui']['default_locale'], |         'default_locale': settings['ui']['default_locale'], | ||||||
|         'autocomplete': settings['search']['autocomplete'], |         'autocomplete': settings['search']['autocomplete'], | ||||||
|         'safe_search': settings['search']['safe_search'], |         'safe_search': settings['search']['safe_search'], | ||||||
|  | |||||||
| @ -8,7 +8,8 @@ import json | |||||||
| from sys import path | from sys import path | ||||||
| from os.path import realpath, dirname, join | from os.path import realpath, dirname, join | ||||||
| 
 | 
 | ||||||
| from searx import searx_dir, settings | from searx import searx_dir | ||||||
|  | from searx.locales import LOCALE_NAMES | ||||||
| from searx.engines.wikidata import send_wikidata_query | from searx.engines.wikidata import send_wikidata_query | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -44,7 +45,7 @@ ORDER BY ?iso4217 ?article_name | |||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| LANGUAGES = settings['locales'].keys() | LANGUAGES = LOCALE_NAMES.keys() | ||||||
| LANGUAGES_SPARQL = ', '.join(set(map(lambda l: repr(l.split('_')[0]), LANGUAGES))) | LANGUAGES_SPARQL = ', '.join(set(map(lambda l: repr(l.split('_')[0]), LANGUAGES))) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -8,6 +8,7 @@ from lxml.html import fromstring | |||||||
| 
 | 
 | ||||||
| from searx.engines.wikidata import send_wikidata_query | from searx.engines.wikidata import send_wikidata_query | ||||||
| from searx.utils import extract_text | from searx.utils import extract_text | ||||||
|  | from searx.locales import LOCALE_NAMES | ||||||
| import searx | import searx | ||||||
| import searx.search | import searx.search | ||||||
| import searx.network | import searx.network | ||||||
| @ -35,7 +36,7 @@ WHERE { | |||||||
| ORDER BY ?itemLang | ORDER BY ?itemLang | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| LANGUAGES = searx.settings['locales'].keys() | LANGUAGES = LOCALE_NAMES.keys() | ||||||
| LANGUAGES_SPARQL = ', '.join(set(map(lambda l: repr(l.split('_')[0]), LANGUAGES))) | LANGUAGES_SPARQL = ', '.join(set(map(lambda l: repr(l.split('_')[0]), LANGUAGES))) | ||||||
| IDS = None | IDS = None | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -41,7 +41,6 @@ class TestDefaultSettings(SearxTestCase): | |||||||
|         self.assertTrue(isinstance(settings['server']['port'], int)) |         self.assertTrue(isinstance(settings['server']['port'], int)) | ||||||
|         self.assertTrue(isinstance(settings['server']['bind_address'], str)) |         self.assertTrue(isinstance(settings['server']['bind_address'], str)) | ||||||
|         self.assertTrue(isinstance(settings['engines'], list)) |         self.assertTrue(isinstance(settings['engines'], list)) | ||||||
|         self.assertTrue(isinstance(settings['locales'], dict)) |  | ||||||
|         self.assertTrue(isinstance(settings['doi_resolvers'], dict)) |         self.assertTrue(isinstance(settings['doi_resolvers'], dict)) | ||||||
|         self.assertTrue(isinstance(settings['default_doi_resolver'], str)) |         self.assertTrue(isinstance(settings['default_doi_resolver'], str)) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user