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

Commit c9cd3761 authored by Markus Heiser's avatar Markus Heiser
Browse files

[mod] replace searx.languages by searx.sxng_locales



With the language and region tags from the EngineTraitsMap the handling of
SearXNG's tags of languages and regions has been normalized and is no longer
a *mystery*.  The "languages" became "locales" that are supported by babel and
by this, the update_engine_traits.py can be simplified a lot.

Other code places can be simplified as well, but these simplifications
should (respectively can) only be done when none of the engines work with the
deprecated EngineTraits.supported_languages interface anymore.

This commit replaces searx.languages by searx.sxng_locales and fix the naming of
some names from "language" to "locale" (e.g. language_codes --> sxng_locales).

Signed-off-by: default avatarMarkus Heiser <markus.heiser@darmarit.de>
parent 7daf4f95
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -4,5 +4,17 @@
Locales
=======

.. contents:: Contents
   :depth: 2
   :local:
   :backlinks: entry

.. automodule:: searx.locales
  :members:


SearXNG's locale codes
======================

.. automodule:: searx.sxng_locales
  :members:
+3 −3
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ from abc import abstractmethod, ABC
import re

from searx import settings
from searx.languages import language_codes
from searx.sxng_locales import sxng_locales
from searx.engines import categories, engines, engine_shortcuts
from searx.external_bang import get_bang_definition_and_autocomplete
from searx.search import EngineRef
@@ -84,7 +84,7 @@ class LanguageParser(QueryPartParser):
        found = False
        # check if any language-code is equal with
        # declared language-codes
        for lc in language_codes:
        for lc in sxng_locales:
            lang_id, lang_name, country, english_name, _flag = map(str.lower, lc)

            # if correct language-code is found
@@ -125,7 +125,7 @@ class LanguageParser(QueryPartParser):
                    self.raw_text_query.autocomplete_list.append(lang)
            return

        for lc in language_codes:
        for lc in sxng_locales:
            if lc[0] not in settings['search']['languages']:
                continue
            lang_id, lang_name, country, english_name, _flag = map(str.lower, lc)
+4 −4
Original line number Diff line number Diff line
@@ -12,13 +12,13 @@ import logging
from base64 import b64decode
from os.path import dirname, abspath

from searx.languages import language_codes as languages
from .sxng_locales import sxng_locales

searx_dir = abspath(dirname(__file__))

logger = logging.getLogger('searx')
OUTPUT_FORMATS = ['html', 'csv', 'json', 'rss']
LANGUAGE_CODES = ['all', 'auto'] + list(l[0] for l in languages)
SXNG_LOCALE_TAGS = ['all', 'auto'] + list(l[0] for l in sxng_locales)
SIMPLE_STYLE = ('auto', 'light', 'dark')
CATEGORIES_AS_TABS = {
    'general': {},
@@ -156,8 +156,8 @@ SCHEMA = {
        'safe_search': SettingsValue((0, 1, 2), 0),
        'autocomplete': SettingsValue(str, ''),
        'autocomplete_min': SettingsValue(int, 4),
        'default_lang': SettingsValue(tuple(LANGUAGE_CODES + ['']), ''),
        'languages': SettingSublistValue(LANGUAGE_CODES, LANGUAGE_CODES),
        'default_lang': SettingsValue(tuple(SXNG_LOCALE_TAGS + ['']), ''),
        'languages': SettingSublistValue(SXNG_LOCALE_TAGS, SXNG_LOCALE_TAGS),
        'ban_time_on_fail': SettingsValue(numbers.Real, 5),
        'max_ban_time_on_fail': SettingsValue(numbers.Real, 120),
        'suspended_times': {
+69 −14
Original line number Diff line number Diff line
# -*- coding: utf-8 -*-
# list of language codes
# this file is generated automatically by utils/fetch_languages.py
language_codes = (
    ('af-ZA', 'Afrikaans', 'Suid-Afrika', 'Afrikaans', '\U0001f1ff\U0001f1e6'),
'''List of SearXNG's locale codes.

This file is generated automatically by::

   ./manage pyenv.cmd searxng_extra/update/update_engine_traits.py
'''

sxng_locales = (
    ('ar', 'العربية', '', 'Arabic', '\U0001f310'),
    ('ar-EG', 'العربية', 'مصر', 'Arabic', '\U0001f1ea\U0001f1ec'),
    ('be-BY', 'Беларуская', 'Беларусь', 'Belarusian', '\U0001f1e7\U0001f1fe'),
    ('ar-SA', 'العربية', 'المملكة العربية السعودية', 'Arabic', '\U0001f1f8\U0001f1e6'),
    ('bg', 'Български', '', 'Bulgarian', '\U0001f310'),
    ('bg-BG', 'Български', 'България', 'Bulgarian', '\U0001f1e7\U0001f1ec'),
    ('ca', 'Català', '', 'Catalan', '\U0001f310'),
    ('ca-ES', 'Català', 'Espanya', 'Catalan', '\U0001f1ea\U0001f1f8'),
    ('cs', 'Čeština', '', 'Czech', '\U0001f310'),
    ('cs-CZ', 'Čeština', 'Česko', 'Czech', '\U0001f1e8\U0001f1ff'),
    ('da', 'Dansk', '', 'Danish', '\U0001f310'),
    ('da-DK', 'Dansk', 'Danmark', 'Danish', '\U0001f1e9\U0001f1f0'),
    ('de', 'Deutsch', '', 'German', '\U0001f310'),
    ('de-AT', 'Deutsch', 'Österreich', 'German', '\U0001f1e6\U0001f1f9'),
    ('de-CH', 'Deutsch', 'Schweiz', 'German', '\U0001f1e8\U0001f1ed'),
    ('de-DE', 'Deutsch', 'Deutschland', 'German', '\U0001f1e9\U0001f1ea'),
    ('el', 'Ελληνικά', '', 'Greek', '\U0001f310'),
    ('el-GR', 'Ελληνικά', 'Ελλάδα', 'Greek', '\U0001f1ec\U0001f1f7'),
    ('en', 'English', '', 'English', '\U0001f310'),
    ('en-AU', 'English', 'Australia', 'English', '\U0001f1e6\U0001f1fa'),
    ('en-CA', 'English', 'Canada', 'English', '\U0001f1e8\U0001f1e6'),
    ('en-GB', 'English', 'United Kingdom', 'English', '\U0001f1ec\U0001f1e7'),
    ('en-IE', 'English', 'Ireland', 'English', '\U0001f1ee\U0001f1ea'),
    ('en-MY', 'English', 'Malaysia', 'English', '\U0001f1f2\U0001f1fe'),
    ('en-IN', 'English', 'India', 'English', '\U0001f1ee\U0001f1f3'),
    ('en-NZ', 'English', 'New Zealand', 'English', '\U0001f1f3\U0001f1ff'),
    ('en-PH', 'English', 'Philippines', 'English', '\U0001f1f5\U0001f1ed'),
    ('en-PK', 'English', 'Pakistan', 'English', '\U0001f1f5\U0001f1f0'),
    ('en-SG', 'English', 'Singapore', 'English', '\U0001f1f8\U0001f1ec'),
    ('en-US', 'English', 'United States', 'English', '\U0001f1fa\U0001f1f8'),
    ('en-ZA', 'English', 'South Africa', 'English', '\U0001f1ff\U0001f1e6'),
    ('es', 'Español', '', 'Spanish', '\U0001f310'),
    ('es-AR', 'Español', 'Argentina', 'Spanish', '\U0001f1e6\U0001f1f7'),
    ('es-CL', 'Español', 'Chile', 'Spanish', '\U0001f1e8\U0001f1f1'),
    ('es-CO', 'Español', 'Colombia', 'Spanish', '\U0001f1e8\U0001f1f4'),
    ('es-ES', 'Español', 'España', 'Spanish', '\U0001f1ea\U0001f1f8'),
    ('es-MX', 'Español', 'México', 'Spanish', '\U0001f1f2\U0001f1fd'),
    ('es-PE', 'Español', 'Perú', 'Spanish', '\U0001f1f5\U0001f1ea'),
    ('et', 'Eesti', '', 'Estonian', '\U0001f310'),
    ('et-EE', 'Eesti', 'Eesti', 'Estonian', '\U0001f1ea\U0001f1ea'),
    ('fa-IR', 'فارسی', 'ایران', 'Persian', '\U0001f1ee\U0001f1f7'),
    ('fi', 'Suomi', '', 'Finnish', '\U0001f310'),
    ('fi-FI', 'Suomi', 'Suomi', 'Finnish', '\U0001f1eb\U0001f1ee'),
    ('fil-PH', 'Filipino', 'Pilipinas', 'Filipino', '\U0001f1f5\U0001f1ed'),
    ('fr', 'Français', '', 'French', '\U0001f310'),
    ('fr-BE', 'Français', 'Belgique', 'French', '\U0001f1e7\U0001f1ea'),
    ('fr-CA', 'Français', 'Canada', 'French', '\U0001f1e8\U0001f1e6'),
    ('fr-CH', 'Français', 'Suisse', 'French', '\U0001f1e8\U0001f1ed'),
    ('fr-FR', 'Français', 'France', 'French', '\U0001f1eb\U0001f1f7'),
    ('he-IL', 'עברית', 'ישראל', 'Hebrew', '\U0001f1ee\U0001f1f1'),
    ('hi-IN', 'हिन्दी', 'भारत', 'Hindi', '\U0001f1ee\U0001f1f3'),
    ('he', 'עברית', '', 'Hebrew', '\U0001f1ee\U0001f1f7'),
    ('hr', 'Hrvatski', '', 'Croatian', '\U0001f310'),
    ('hr-HR', 'Hrvatski', 'Hrvatska', 'Croatian', '\U0001f1ed\U0001f1f7'),
    ('hu', 'Magyar', '', 'Hungarian', '\U0001f310'),
    ('hu-HU', 'Magyar', 'Magyarország', 'Hungarian', '\U0001f1ed\U0001f1fa'),
    ('id', 'Indonesia', '', 'Indonesian', '\U0001f310'),
    ('id-ID', 'Indonesia', 'Indonesia', 'Indonesian', '\U0001f1ee\U0001f1e9'),
    ('is-IS', 'Íslenska', 'Ísland', 'Icelandic', '\U0001f1ee\U0001f1f8'),
    ('it', 'Italiano', '', 'Italian', '\U0001f310'),
    ('it-CH', 'Italiano', 'Svizzera', 'Italian', '\U0001f1e8\U0001f1ed'),
    ('it-IT', 'Italiano', 'Italia', 'Italian', '\U0001f1ee\U0001f1f9'),
    ('ja', '日本語', '', 'Japanese', '\U0001f310'),
    ('ja-JP', '日本語', '日本', 'Japanese', '\U0001f1ef\U0001f1f5'),
    ('ko', '한국어', '', 'Korean', '\U0001f310'),
    ('ko-KR', '한국어', '대한민국', 'Korean', '\U0001f1f0\U0001f1f7'),
    ('lt', 'Lietuvių', '', 'Lithuanian', '\U0001f310'),
    ('lt-LT', 'Lietuvių', 'Lietuva', 'Lithuanian', '\U0001f1f1\U0001f1f9'),
    ('lv', 'Latviešu', '', 'Latvian', '\U0001f310'),
    ('lv-LV', 'Latviešu', 'Latvija', 'Latvian', '\U0001f1f1\U0001f1fb'),
    ('nb', 'Norsk Bokmål', '', 'Norwegian Bokmål', '\U0001f310'),
    ('nb-NO', 'Norsk Bokmål', 'Norge', 'Norwegian Bokmål', '\U0001f1f3\U0001f1f4'),
    ('nl', 'Nederlands', '', 'Dutch', '\U0001f310'),
    ('nl-BE', 'Nederlands', 'België', 'Dutch', '\U0001f1e7\U0001f1ea'),
    ('nl-NL', 'Nederlands', 'Nederland', 'Dutch', '\U0001f1f3\U0001f1f1'),
    ('no-NO', 'Norsk', '', 'Norwegian (Bokmål)', '\U0001f1f3\U0001f1f4'),
    ('pl', 'Polski', '', 'Polish', '\U0001f310'),
    ('pl-PL', 'Polski', 'Polska', 'Polish', '\U0001f1f5\U0001f1f1'),
    ('pt', 'Português', '', 'Portuguese', '\U0001f310'),
    ('pt-BR', 'Português', 'Brasil', 'Portuguese', '\U0001f1e7\U0001f1f7'),
    ('pt-PT', 'Português', 'Portugal', 'Portuguese', '\U0001f1f5\U0001f1f9'),
    ('ro', 'Română', '', 'Romanian', '\U0001f310'),
    ('ro-RO', 'Română', 'România', 'Romanian', '\U0001f1f7\U0001f1f4'),
    ('ru', 'Русский', '', 'Russian', '\U0001f310'),
    ('ru-RU', 'Русский', 'Россия', 'Russian', '\U0001f1f7\U0001f1fa'),
    ('sk', 'Slovenčina', '', 'Slovak', '\U0001f310'),
    ('sk-SK', 'Slovenčina', 'Slovensko', 'Slovak', '\U0001f1f8\U0001f1f0'),
    ('sl', 'Slovenščina', '', 'Slovenian', '\U0001f310'),
    ('sl-SI', 'Slovenščina', 'Slovenija', 'Slovenian', '\U0001f1f8\U0001f1ee'),
    ('sr-RS', 'Српски', 'Србија', 'Serbian', '\U0001f1f7\U0001f1f8'),
    ('sv', 'Svenska', '', 'Swedish', '\U0001f310'),
    ('sv-SE', 'Svenska', 'Sverige', 'Swedish', '\U0001f1f8\U0001f1ea'),
    ('sw-TZ', 'Kiswahili', 'Tanzania', 'Swahili', '\U0001f1f9\U0001f1ff'),
    ('th', 'ไทย', '', 'Thai', '\U0001f310'),
    ('th-TH', 'ไทย', 'ไทย', 'Thai', '\U0001f1f9\U0001f1ed'),
    ('tr', 'Türkçe', '', 'Turkish', '\U0001f310'),
    ('tr-TR', 'Türkçe', 'Türkiye', 'Turkish', '\U0001f1f9\U0001f1f7'),
    ('uk', 'Українська', '', 'Ukrainian', '\U0001f310'),
    ('uk-UA', 'Українська', 'Україна', 'Ukrainian', '\U0001f1fa\U0001f1e6'),
    ('vi', 'Tiếng Việt', '', 'Vietnamese', '\U0001f310'),
    ('vi-VN', 'Tiếng Việt', 'Việt Nam', 'Vietnamese', '\U0001f1fb\U0001f1f3'),
    ('zh', '中文', '', 'Chinese', '\U0001f310'),
    ('zh-CN', '中文', '中国', 'Chinese', '\U0001f1e8\U0001f1f3'),
    ('zh-HK', '中文', '中國香港', 'Chinese', '\U0001f1ed\U0001f1f0'),
    ('zh-TW', '中文', '台灣', 'Chinese', '\U0001f1f9\U0001f1fc'),
)
'''
A list of five-digit tuples:

0. SearXNG's internal locale tag (a language or region tag)
1. Name of the language (:py:obj:`babel.core.Locale.get_language_name`)
2. For region tags the name of the region (:py:obj:`babel.core.Locale.get_territory_name`).
   Empty string for language tags.
3. English language name (from :py:obj:`babel.core.Locale.english_name`)
4. Unicode flag (emoji) that fits to SearXNG's internal region tag. Languages
   are represented by a globe (🌐)

.. code:: python

   ('en',    'English', '',              'English', '🌐'),
   ('en-CA', 'English', 'Canada',        'English', '🇨🇦'),
   ('en-US', 'English', 'United States', 'English', '🇺🇸'),
   ..
   ('fr',    'Français', '',             'French',  '🌐'),
   ('fr-BE', 'Français', 'Belgique',     'French',  '🇧🇪'),
   ('fr-CA', 'Français', 'Canada',       'French',  '🇨🇦'),

:meta hide-value:
'''
+4 −4
Original line number Diff line number Diff line
<select class="language" id="language" name="language" aria-label="{{ _('Search language') }}">{{- '' -}}
	<option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Default language') }}</option>
	<option value="all" {% if current_language == 'all' %}selected="selected"{% endif %}>{{ _('Default language') }} [all]</option>
	<option value="auto" {% if current_language == 'auto' %}selected="selected"{% endif %}>
		{{- _('Auto-detect') -}}
		{%- if current_language == 'auto' %} ({{ search_language }}){%- endif -%}
	</option>
	{%- for lang_id,lang_name,country_name,english_name,flag in language_codes | sort(attribute=1) -%}
	<option value="{{ lang_id }}" {% if lang_id == current_language %}selected="selected"{% endif %}>
		{% if flag %}{{ flag }} {% endif%} {{- lang_name }} {% if country_name %}({{ country_name }}) {% endif %}
	{%- for sxng_tag,lang_name,country_name,english_name,flag in sxng_locales | sort(attribute=1) -%}
	<option value="{{ sxng_tag }}" {% if sxng_tag == current_language %}selected="selected"{% endif %}>
		{% if flag %}{{ flag }} {% endif%} {{- lang_name }} {% if country_name %} - {{ country_name }} {% endif %} [{{sxng_tag}}]
	</option>
	{%- endfor -%}
</select>
Loading