From d0f465e6fa364805bcc7848d22860068c0a27be4 Mon Sep 17 00:00:00 2001 From: Markus Heiser Date: Sat, 15 Oct 2022 21:17:39 +0200 Subject: [PATCH] [mod] bing: add time_range support & upgrade to data_type: traits_v1 Signed-off-by: Markus Heiser --- searx/data/engine_traits.json | 1966 +++------------------------------ searx/engines/bing.py | 280 ++--- searx/engines/bing_images.py | 23 +- searx/engines/bing_news.py | 25 +- searx/engines/bing_videos.py | 22 +- searx/sxng_locales.py | 18 +- 6 files changed, 366 insertions(+), 1968 deletions(-) diff --git a/searx/data/engine_traits.json b/searx/data/engine_traits.json index c97134f8b..8d4806c90 100644 --- a/searx/data/engine_traits.json +++ b/searx/data/engine_traits.json @@ -2,2018 +2,366 @@ "bing": { "all_locale": null, "custom": {}, - "data_type": "supported_languages", + "data_type": "traits_v1", "languages": { - "af": "af", - "am": "am", "ar": "ar", - "as": "as", - "az": "az", - "be": "be", "bg": "bg", "bn": "bn", - "bs": "bs", "ca": "ca", - "chr": "chr", "cs": "cs", - "cy": "cy", "da": "da", "de": "de", - "el": "el", "en": "en", "es": "es", "et": "et", "eu": "eu", - "fa": "fa", "fi": "fi", - "fil": "fil", "fr": "fr", - "ga": "ga", - "gd": "gd", "gl": "gl", "gu": "gu", - "ha": "ha", "he": "he", "hi": "hi", "hr": "hr", "hu": "hu", - "hy": "hy", - "id": "id", - "ig": "ig", "is": "is", "it": "it", - "ja": "ja", - "ka": "ka", - "kk": "kk", - "km": "km", + "ja": "jp", "kn": "kn", "ko": "ko", - "kok": "kok", - "ku": "ku", - "ky": "ky", - "lb": "lb", - "lo": "lo", "lt": "lt", "lv": "lv", - "mi": "mi", - "mk": "mk", "ml": "ml", - "mn": "MN", "mr": "mr", "ms": "ms", - "mt": "mt", "nb": "nb", - "ne": "ne", "nl": "nl", - "nn": "nn", - "or": "or", "pa": "pa", - "pa_Arab": "pa-Arab", "pl": "pl", - "pt": "pt", - "qu": "quz", + "pt": "pt-pt", "ro": "ro", "ru": "ru", - "rw": "rw", - "sd": "sd", - "si": "si", "sk": "sk", "sl": "sl", - "sq": "sq", "sr": "sr", - "sr_Latn": "sr_latn", "sv": "sv", - "sw": "sw", "ta": "ta", "te": "te", - "tg": "tg", "th": "th", - "ti": "ti", - "tk": "tk", "tr": "tr", - "tt": "tt", - "ug": "ug", "uk": "uk", - "ur": "ur", - "uz": "uz", "vi": "vi", - "wo": "wo", - "xh": "xh", - "yo": "yo", - "zh": "zh_Hans", - "zh_Hans": "zh_Hans", - "zh_Hant": "zh_Hant", - "zu": "zu" + "zh": "zh-hans", + "zh_Hans": "zh-hans", + "zh_Hant": "zh-hant" }, "regions": { - "am-ET": "et", - "ar-AE": "ae", - "ar-BH": "bh", - "ar-DJ": "dj", - "ar-DZ": "dz", - "ar-EG": "eg", - "ar-ER": "er", - "ar-IL": "il", - "ar-IQ": "iq", - "ar-JO": "jo", - "ar-KM": "km", - "ar-KW": "kw", - "ar-LB": "lb", - "ar-LY": "ly", - "ar-MA": "ma", - "ar-MR": "mr", - "ar-OM": "om", - "ar-PS": "ps", - "ar-QA": "qa", - "ar-SA": "sa", - "ar-SD": "sd", - "ar-SO": "so", - "ar-SY": "sy", - "ar-TD": "td", - "ar-TN": "tn", - "ar-YE": "ye", - "az-AZ": "az", - "be-BY": "by", - "bg-BG": "bg", - "bn-BD": "bd", - "bs-BA": "ba", - "ca-AD": "ad", - "cs-CZ": "cz", - "da-DK": "dk", - "de-AT": "at", - "de-BE": "be", - "de-CH": "ch", - "de-DE": "de", - "de-LI": "li", - "de-LU": "lu", - "el-CY": "cy", - "el-GR": "gr", - "en-AG": "ag", - "en-AI": "ai", - "en-AS": "as", - "en-AU": "au", - "en-BB": "bb", - "en-BI": "bi", - "en-BM": "bm", - "en-BS": "bs", - "en-BW": "bw", - "en-BZ": "bz", - "en-CA": "ca", - "en-CC": "cc", - "en-CK": "ck", - "en-CM": "cm", - "en-CX": "cx", - "en-DM": "dm", - "en-ER": "er", - "en-FJ": "fj", - "en-FK": "fk", - "en-FM": "fm", - "en-GB": "gb", - "en-GD": "gd", - "en-GG": "gg", - "en-GH": "gh", - "en-GI": "gi", - "en-GM": "gm", - "en-GU": "gu", - "en-GY": "gy", - "en-HK": "hk", - "en-IE": "ie", - "en-IN": "in", - "en-JE": "je", - "en-JM": "jm", - "en-KE": "ke", - "en-KI": "ki", - "en-KN": "kn", - "en-KY": "ky", - "en-LC": "lc", - "en-LR": "lr", - "en-LS": "ls", - "en-MG": "mg", - "en-MH": "mh", - "en-MP": "mp", - "en-MS": "ms", - "en-MT": "mt", - "en-MU": "mu", - "en-MW": "mw", - "en-NA": "na", - "en-NF": "nf", - "en-NG": "ng", - "en-NR": "nr", - "en-NU": "nu", - "en-NZ": "nz", - "en-PG": "pg", - "en-PH": "ph", - "en-PK": "pk", - "en-PN": "pn", - "en-PR": "pr", - "en-PW": "pw", - "en-RW": "rw", - "en-SB": "sb", - "en-SC": "sc", - "en-SD": "sd", - "en-SG": "sg", - "en-SH": "sh", - "en-SL": "sl", - "en-SS": "ss", - "en-SX": "sx", - "en-SZ": "sz", - "en-TC": "tc", - "en-TK": "tk", - "en-TO": "to", - "en-TT": "tt", - "en-TV": "tv", - "en-TZ": "tz", - "en-UG": "ug", - "en-US": "us", - "en-VC": "vc", - "en-VG": "vg", - "en-VI": "vi", - "en-VU": "vu", - "en-WS": "ws", - "en-ZA": "za", - "en-ZM": "zm", - "en-ZW": "zw", - "es-AR": "ar", - "es-BO": "bo", - "es-CL": "cl", - "es-CO": "co", - "es-CR": "cr", - "es-DO": "do", - "es-EC": "ec", - "es-ES": "es", - "es-GQ": "gq", - "es-GT": "gt", - "es-HN": "hn", - "es-MX": "mx", - "es-NI": "ni", - "es-PA": "pa", - "es-PE": "pe", - "es-PR": "pr", - "es-PY": "py", - "es-SV": "sv", - "es-UY": "uy", - "es-VE": "ve", - "et-EE": "ee", - "fa-AF": "af", - "fa-IR": "ir", - "fi-FI": "fi", - "fil-PH": "ph", - "fr-BE": "be", - "fr-BF": "bf", - "fr-BI": "bi", - "fr-BJ": "bj", - "fr-BL": "bl", - "fr-CA": "ca", - "fr-CD": "cd", - "fr-CF": "cf", - "fr-CG": "cg", - "fr-CH": "ch", - "fr-CI": "ci", - "fr-CM": "cm", - "fr-DJ": "dj", - "fr-DZ": "dz", - "fr-FR": "fr", - "fr-GA": "ga", - "fr-GF": "gf", - "fr-GN": "gn", - "fr-GP": "gp", - "fr-GQ": "gq", - "fr-HT": "ht", - "fr-KM": "km", - "fr-LU": "lu", - "fr-MA": "ma", - "fr-MC": "mc", - "fr-MF": "mf", - "fr-MG": "mg", - "fr-ML": "ml", - "fr-MQ": "mq", - "fr-MU": "mu", - "fr-NC": "nc", - "fr-NE": "ne", - "fr-PF": "pf", - "fr-PM": "pm", - "fr-RE": "re", - "fr-RW": "rw", - "fr-SC": "sc", - "fr-SN": "sn", - "fr-SY": "sy", - "fr-TD": "td", - "fr-TG": "tg", - "fr-TN": "tn", - "fr-VU": "vu", - "fr-WF": "wf", - "fr-YT": "yt", - "ga-IE": "ie", - "he-IL": "il", - "hi-IN": "in", - "hr-BA": "ba", - "hr-HR": "hr", - "hu-HU": "hu", - "hy-AM": "am", - "id-ID": "id", - "is-IS": "is", - "it-CH": "ch", - "it-IT": "it", - "it-SM": "sm", - "it-VA": "va", - "ja-JP": "jp", - "ka-GE": "ge", - "kk-KZ": "kz", - "km-KH": "kh", - "ko-KR": "kr", - "ky-KG": "kg", - "lb-LU": "lu", - "lo-LA": "la", - "lt-LT": "lt", - "lv-LV": "lv", - "mi-NZ": "nz", - "mk-MK": "mk", - "mn-MN": "mn", - "ms-BN": "bn", - "ms-MY": "my", - "ms-SG": "sg", - "mt-MT": "mt", - "nb-NO": "no", - "ne-NP": "np", - "nl-AW": "aw", - "nl-BE": "be", - "nl-CW": "cw", - "nl-NL": "nl", - "nl-SR": "sr", - "nl-SX": "sx", - "nn-NO": "no", - "pl-PL": "pl", - "pt-AO": "ao", - "pt-BR": "br", - "pt-CV": "cv", - "pt-GQ": "gq", - "pt-GW": "gw", - "pt-MO": "mo", - "pt-MZ": "mz", - "pt-PT": "pt", - "pt-ST": "st", - "qu-BO": "bo", - "qu-EC": "ec", - "qu-PE": "pe", - "ro-MD": "md", - "ro-RO": "ro", - "ru-BY": "by", - "ru-KG": "kg", - "ru-KZ": "kz", - "ru-RU": "ru", - "ru-UA": "ua", - "rw-RW": "rw", - "si-LK": "lk", - "sk-SK": "sk", - "sl-SI": "si", - "sq-AL": "al", - "sr-BA": "ba", - "sr-ME": "me", - "sr-RS": "rs", - "sv-FI": "fi", - "sv-SE": "se", - "sw-KE": "ke", - "sw-TZ": "tz", - "sw-UG": "ug", - "ta-LK": "lk", - "ta-SG": "sg", - "tg-TJ": "tj", - "th-TH": "th", - "ti-ER": "er", - "tk-TM": "tm", - "tr-CY": "cy", - "tr-TR": "tr", - "uk-UA": "ua", - "ur-PK": "pk", - "uz-UZ": "uz", - "vi-VN": "vn", - "wo-SN": "sn", - "yo-NG": "ng", - "zh-CN": "cn", - "zh-HK": "hk", - "zh-MO": "mo", - "zh-SG": "sg", - "zh-TW": "tw" + "da-DK": "da-DK", + "de-AT": "de-AT", + "de-CH": "de-CH", + "de-DE": "de-DE", + "en-AU": "en-AU", + "en-CA": "en-CA", + "en-GB": "en-GB", + "en-IN": "en-IN", + "en-MY": "en-MY", + "en-NZ": "en-NZ", + "en-PH": "en-PH", + "en-US": "en-US", + "en-ZA": "en-ZA", + "es-AR": "es-AR", + "es-CL": "es-CL", + "es-ES": "es-ES", + "es-MX": "es-MX", + "es-US": "es-US", + "fi-FI": "fi-FI", + "fr-BE": "fr-BE", + "fr-CA": "fr-CA", + "fr-CH": "fr-CH", + "fr-FR": "fr-FR", + "id-ID": "en-ID", + "it-IT": "it-IT", + "ja-JP": "ja-JP", + "ko-KR": "ko-KR", + "nb-NO": "no-NO", + "nl-BE": "nl-BE", + "nl-NL": "nl-NL", + "pl-PL": "pl-PL", + "pt-BR": "pt-BR", + "ru-RU": "ru-RU", + "sv-SE": "sv-SE", + "tr-TR": "tr-TR", + "zh-CN": "zh-CN", + "zh-HK": "zh-HK", + "zh-TW": "zh-TW" }, - "supported_languages": [ - "af", - "am", - "ar", - "as", - "az-latn", - "be", - "bg", - "bn", - "bs-latn", - "ca", - "ca-es-valencia", - "chr-cher", - "cs", - "cy", - "da", - "de", - "el", - "en", - "es", - "et", - "eu", - "fa", - "fi", - "fil", - "fr", - "ga", - "gd", - "gl", - "gu", - "ha-latn", - "he", - "hi", - "hr", - "hu", - "hy", - "id", - "ig", - "is", - "it", - "ja", - "ka", - "kk", - "km", - "kn", - "ko", - "kok", - "ku-arab", - "ky", - "lb", - "lo", - "lt", - "lv", - "mi", - "mk", - "ml", - "mn-Cyrl-MN", - "mr", - "ms", - "mt", - "nb", - "ne", - "nl", - "nn", - "nso", - "or", - "pa-arab", - "pa-guru", - "pl", - "prs", - "pt-BR", - "pt-PT", - "quc", - "quz", - "ro", - "ru", - "rw", - "sd-arab", - "si", - "sk", - "sl", - "sq", - "sr-cyrl", - "sr-latn", - "sv", - "sw", - "ta", - "te", - "tg-cyrl", - "th", - "ti", - "tk", - "tn", - "tr", - "tt", - "ug", - "uk", - "ur", - "uz-latn", - "vi", - "wo", - "xh", - "yo", - "zh-Hans", - "zh-Hant", - "zu" - ] + "supported_languages": {} }, "bing images": { "all_locale": null, "custom": {}, - "data_type": "supported_languages", + "data_type": "traits_v1", "languages": { - "af": "af", - "am": "am", "ar": "ar", - "as": "as", - "az": "az", - "be": "be", "bg": "bg", "bn": "bn", - "bs": "bs", "ca": "ca", - "chr": "chr", "cs": "cs", - "cy": "cy", "da": "da", "de": "de", - "el": "el", "en": "en", "es": "es", "et": "et", "eu": "eu", - "fa": "fa", "fi": "fi", - "fil": "fil", "fr": "fr", - "ga": "ga", - "gd": "gd", "gl": "gl", "gu": "gu", - "ha": "ha", "he": "he", "hi": "hi", "hr": "hr", "hu": "hu", - "hy": "hy", - "id": "id", - "ig": "ig", "is": "is", "it": "it", - "ja": "ja", - "ka": "ka", - "kk": "kk", - "km": "km", + "ja": "jp", "kn": "kn", "ko": "ko", - "kok": "kok", - "ku": "ku", - "ky": "ky", - "lb": "lb", - "lo": "lo", "lt": "lt", "lv": "lv", - "mi": "mi", - "mk": "mk", "ml": "ml", - "mn": "MN", "mr": "mr", "ms": "ms", - "mt": "mt", "nb": "nb", - "ne": "ne", "nl": "nl", - "nn": "nn", - "or": "or", "pa": "pa", - "pa_Arab": "pa-Arab", "pl": "pl", - "pt": "pt", - "qu": "quz", + "pt": "pt-pt", "ro": "ro", "ru": "ru", - "rw": "rw", - "sd": "sd", - "si": "si", "sk": "sk", "sl": "sl", - "sq": "sq", "sr": "sr", - "sr_Latn": "sr_latn", "sv": "sv", - "sw": "sw", "ta": "ta", "te": "te", - "tg": "tg", "th": "th", - "ti": "ti", - "tk": "tk", "tr": "tr", - "tt": "tt", - "ug": "ug", "uk": "uk", - "ur": "ur", - "uz": "uz", "vi": "vi", - "wo": "wo", - "xh": "xh", - "yo": "yo", - "zh": "zh_Hans", - "zh_Hans": "zh_Hans", - "zh_Hant": "zh_Hant", - "zu": "zu" + "zh": "zh-hans", + "zh_Hans": "zh-hans", + "zh_Hant": "zh-hant" }, "regions": { - "am-ET": "et", - "ar-AE": "ae", - "ar-BH": "bh", - "ar-DJ": "dj", - "ar-DZ": "dz", - "ar-EG": "eg", - "ar-ER": "er", - "ar-IL": "il", - "ar-IQ": "iq", - "ar-JO": "jo", - "ar-KM": "km", - "ar-KW": "kw", - "ar-LB": "lb", - "ar-LY": "ly", - "ar-MA": "ma", - "ar-MR": "mr", - "ar-OM": "om", - "ar-PS": "ps", - "ar-QA": "qa", - "ar-SA": "sa", - "ar-SD": "sd", - "ar-SO": "so", - "ar-SY": "sy", - "ar-TD": "td", - "ar-TN": "tn", - "ar-YE": "ye", - "az-AZ": "az", - "be-BY": "by", - "bg-BG": "bg", - "bn-BD": "bd", - "bs-BA": "ba", - "ca-AD": "ad", - "cs-CZ": "cz", - "da-DK": "dk", - "de-AT": "at", - "de-BE": "be", - "de-CH": "ch", - "de-DE": "de", - "de-LI": "li", - "de-LU": "lu", - "el-CY": "cy", - "el-GR": "gr", - "en-AG": "ag", - "en-AI": "ai", - "en-AS": "as", - "en-AU": "au", - "en-BB": "bb", - "en-BI": "bi", - "en-BM": "bm", - "en-BS": "bs", - "en-BW": "bw", - "en-BZ": "bz", - "en-CA": "ca", - "en-CC": "cc", - "en-CK": "ck", - "en-CM": "cm", - "en-CX": "cx", - "en-DM": "dm", - "en-ER": "er", - "en-FJ": "fj", - "en-FK": "fk", - "en-FM": "fm", - "en-GB": "gb", - "en-GD": "gd", - "en-GG": "gg", - "en-GH": "gh", - "en-GI": "gi", - "en-GM": "gm", - "en-GU": "gu", - "en-GY": "gy", - "en-HK": "hk", - "en-IE": "ie", - "en-IN": "in", - "en-JE": "je", - "en-JM": "jm", - "en-KE": "ke", - "en-KI": "ki", - "en-KN": "kn", - "en-KY": "ky", - "en-LC": "lc", - "en-LR": "lr", - "en-LS": "ls", - "en-MG": "mg", - "en-MH": "mh", - "en-MP": "mp", - "en-MS": "ms", - "en-MT": "mt", - "en-MU": "mu", - "en-MW": "mw", - "en-NA": "na", - "en-NF": "nf", - "en-NG": "ng", - "en-NR": "nr", - "en-NU": "nu", - "en-NZ": "nz", - "en-PG": "pg", - "en-PH": "ph", - "en-PK": "pk", - "en-PN": "pn", - "en-PR": "pr", - "en-PW": "pw", - "en-RW": "rw", - "en-SB": "sb", - "en-SC": "sc", - "en-SD": "sd", - "en-SG": "sg", - "en-SH": "sh", - "en-SL": "sl", - "en-SS": "ss", - "en-SX": "sx", - "en-SZ": "sz", - "en-TC": "tc", - "en-TK": "tk", - "en-TO": "to", - "en-TT": "tt", - "en-TV": "tv", - "en-TZ": "tz", - "en-UG": "ug", - "en-US": "us", - "en-VC": "vc", - "en-VG": "vg", - "en-VI": "vi", - "en-VU": "vu", - "en-WS": "ws", - "en-ZA": "za", - "en-ZM": "zm", - "en-ZW": "zw", - "es-AR": "ar", - "es-BO": "bo", - "es-CL": "cl", - "es-CO": "co", - "es-CR": "cr", - "es-DO": "do", - "es-EC": "ec", - "es-ES": "es", - "es-GQ": "gq", - "es-GT": "gt", - "es-HN": "hn", - "es-MX": "mx", - "es-NI": "ni", - "es-PA": "pa", - "es-PE": "pe", - "es-PR": "pr", - "es-PY": "py", - "es-SV": "sv", - "es-UY": "uy", - "es-VE": "ve", - "et-EE": "ee", - "fa-AF": "af", - "fa-IR": "ir", - "fi-FI": "fi", - "fil-PH": "ph", - "fr-BE": "be", - "fr-BF": "bf", - "fr-BI": "bi", - "fr-BJ": "bj", - "fr-BL": "bl", - "fr-CA": "ca", - "fr-CD": "cd", - "fr-CF": "cf", - "fr-CG": "cg", - "fr-CH": "ch", - "fr-CI": "ci", - "fr-CM": "cm", - "fr-DJ": "dj", - "fr-DZ": "dz", - "fr-FR": "fr", - "fr-GA": "ga", - "fr-GF": "gf", - "fr-GN": "gn", - "fr-GP": "gp", - "fr-GQ": "gq", - "fr-HT": "ht", - "fr-KM": "km", - "fr-LU": "lu", - "fr-MA": "ma", - "fr-MC": "mc", - "fr-MF": "mf", - "fr-MG": "mg", - "fr-ML": "ml", - "fr-MQ": "mq", - "fr-MU": "mu", - "fr-NC": "nc", - "fr-NE": "ne", - "fr-PF": "pf", - "fr-PM": "pm", - "fr-RE": "re", - "fr-RW": "rw", - "fr-SC": "sc", - "fr-SN": "sn", - "fr-SY": "sy", - "fr-TD": "td", - "fr-TG": "tg", - "fr-TN": "tn", - "fr-VU": "vu", - "fr-WF": "wf", - "fr-YT": "yt", - "ga-IE": "ie", - "he-IL": "il", - "hi-IN": "in", - "hr-BA": "ba", - "hr-HR": "hr", - "hu-HU": "hu", - "hy-AM": "am", - "id-ID": "id", - "is-IS": "is", - "it-CH": "ch", - "it-IT": "it", - "it-SM": "sm", - "it-VA": "va", - "ja-JP": "jp", - "ka-GE": "ge", - "kk-KZ": "kz", - "km-KH": "kh", - "ko-KR": "kr", - "ky-KG": "kg", - "lb-LU": "lu", - "lo-LA": "la", - "lt-LT": "lt", - "lv-LV": "lv", - "mi-NZ": "nz", - "mk-MK": "mk", - "mn-MN": "mn", - "ms-BN": "bn", - "ms-MY": "my", - "ms-SG": "sg", - "mt-MT": "mt", - "nb-NO": "no", - "ne-NP": "np", - "nl-AW": "aw", - "nl-BE": "be", - "nl-CW": "cw", - "nl-NL": "nl", - "nl-SR": "sr", - "nl-SX": "sx", - "nn-NO": "no", - "pl-PL": "pl", - "pt-AO": "ao", - "pt-BR": "br", - "pt-CV": "cv", - "pt-GQ": "gq", - "pt-GW": "gw", - "pt-MO": "mo", - "pt-MZ": "mz", - "pt-PT": "pt", - "pt-ST": "st", - "qu-BO": "bo", - "qu-EC": "ec", - "qu-PE": "pe", - "ro-MD": "md", - "ro-RO": "ro", - "ru-BY": "by", - "ru-KG": "kg", - "ru-KZ": "kz", - "ru-RU": "ru", - "ru-UA": "ua", - "rw-RW": "rw", - "si-LK": "lk", - "sk-SK": "sk", - "sl-SI": "si", - "sq-AL": "al", - "sr-BA": "ba", - "sr-ME": "me", - "sr-RS": "rs", - "sv-FI": "fi", - "sv-SE": "se", - "sw-KE": "ke", - "sw-TZ": "tz", - "sw-UG": "ug", - "ta-LK": "lk", - "ta-SG": "sg", - "tg-TJ": "tj", - "th-TH": "th", - "ti-ER": "er", - "tk-TM": "tm", - "tr-CY": "cy", - "tr-TR": "tr", - "uk-UA": "ua", - "ur-PK": "pk", - "uz-UZ": "uz", - "vi-VN": "vn", - "wo-SN": "sn", - "yo-NG": "ng", - "zh-CN": "cn", - "zh-HK": "hk", - "zh-MO": "mo", - "zh-SG": "sg", - "zh-TW": "tw" + "da-DK": "da-DK", + "de-AT": "de-AT", + "de-CH": "de-CH", + "de-DE": "de-DE", + "en-AU": "en-AU", + "en-CA": "en-CA", + "en-GB": "en-GB", + "en-IN": "en-IN", + "en-MY": "en-MY", + "en-NZ": "en-NZ", + "en-PH": "en-PH", + "en-US": "en-US", + "en-ZA": "en-ZA", + "es-AR": "es-AR", + "es-CL": "es-CL", + "es-ES": "es-ES", + "es-MX": "es-MX", + "es-US": "es-US", + "fi-FI": "fi-FI", + "fr-BE": "fr-BE", + "fr-CA": "fr-CA", + "fr-CH": "fr-CH", + "fr-FR": "fr-FR", + "id-ID": "en-ID", + "it-IT": "it-IT", + "ja-JP": "ja-JP", + "ko-KR": "ko-KR", + "nb-NO": "no-NO", + "nl-BE": "nl-BE", + "nl-NL": "nl-NL", + "pl-PL": "pl-PL", + "pt-BR": "pt-BR", + "ru-RU": "ru-RU", + "sv-SE": "sv-SE", + "tr-TR": "tr-TR", + "zh-CN": "zh-CN", + "zh-HK": "zh-HK", + "zh-TW": "zh-TW" }, - "supported_languages": [ - "af", - "am", - "ar", - "as", - "az-latn", - "be", - "bg", - "bn", - "bs-latn", - "ca", - "ca-es-valencia", - "chr-cher", - "cs", - "cy", - "da", - "de", - "el", - "en", - "es", - "et", - "eu", - "fa", - "fi", - "fil", - "fr", - "ga", - "gd", - "gl", - "gu", - "ha-latn", - "he", - "hi", - "hr", - "hu", - "hy", - "id", - "ig", - "is", - "it", - "ja", - "ka", - "kk", - "km", - "kn", - "ko", - "kok", - "ku-arab", - "ky", - "lb", - "lo", - "lt", - "lv", - "mi", - "mk", - "ml", - "mn-Cyrl-MN", - "mr", - "ms", - "mt", - "nb", - "ne", - "nl", - "nn", - "nso", - "or", - "pa-arab", - "pa-guru", - "pl", - "prs", - "pt-BR", - "pt-PT", - "quc", - "quz", - "ro", - "ru", - "rw", - "sd-arab", - "si", - "sk", - "sl", - "sq", - "sr-cyrl", - "sr-latn", - "sv", - "sw", - "ta", - "te", - "tg-cyrl", - "th", - "ti", - "tk", - "tn", - "tr", - "tt", - "ug", - "uk", - "ur", - "uz-latn", - "vi", - "wo", - "xh", - "yo", - "zh-Hans", - "zh-Hant", - "zu" - ] + "supported_languages": {} }, "bing news": { - "all_locale": null, + "all_locale": "en-WW", "custom": {}, - "data_type": "supported_languages", + "data_type": "traits_v1", "languages": { - "af": "af", - "am": "am", "ar": "ar", - "as": "as", - "az": "az", - "be": "be", "bg": "bg", "bn": "bn", - "bs": "bs", "ca": "ca", - "chr": "chr", "cs": "cs", - "cy": "cy", "da": "da", "de": "de", - "el": "el", "en": "en", "es": "es", "et": "et", "eu": "eu", - "fa": "fa", "fi": "fi", - "fil": "fil", "fr": "fr", - "ga": "ga", - "gd": "gd", "gl": "gl", "gu": "gu", - "ha": "ha", "he": "he", "hi": "hi", "hr": "hr", "hu": "hu", - "hy": "hy", - "id": "id", - "ig": "ig", "is": "is", "it": "it", - "ja": "ja", - "ka": "ka", - "kk": "kk", - "km": "km", + "ja": "jp", "kn": "kn", "ko": "ko", - "kok": "kok", - "ku": "ku", - "ky": "ky", - "lb": "lb", - "lo": "lo", "lt": "lt", "lv": "lv", - "mi": "mi", - "mk": "mk", "ml": "ml", - "mn": "MN", "mr": "mr", "ms": "ms", - "mt": "mt", "nb": "nb", - "ne": "ne", "nl": "nl", - "nn": "nn", - "or": "or", "pa": "pa", - "pa_Arab": "pa-Arab", "pl": "pl", - "pt": "pt", - "qu": "quz", + "pt": "pt-pt", "ro": "ro", "ru": "ru", - "rw": "rw", - "sd": "sd", - "si": "si", "sk": "sk", "sl": "sl", - "sq": "sq", "sr": "sr", - "sr_Latn": "sr_latn", "sv": "sv", - "sw": "sw", "ta": "ta", "te": "te", - "tg": "tg", "th": "th", - "ti": "ti", - "tk": "tk", "tr": "tr", - "tt": "tt", - "ug": "ug", "uk": "uk", - "ur": "ur", - "uz": "uz", "vi": "vi", - "wo": "wo", - "xh": "xh", - "yo": "yo", - "zh": "zh_Hans", - "zh_Hans": "zh_Hans", - "zh_Hant": "zh_Hant", - "zu": "zu" + "zh": "zh-hans", + "zh_Hans": "zh-hans", + "zh_Hant": "zh-hant" }, "regions": { - "am-ET": "et", - "ar-AE": "ae", - "ar-BH": "bh", - "ar-DJ": "dj", - "ar-DZ": "dz", - "ar-EG": "eg", - "ar-ER": "er", - "ar-IL": "il", - "ar-IQ": "iq", - "ar-JO": "jo", - "ar-KM": "km", - "ar-KW": "kw", - "ar-LB": "lb", - "ar-LY": "ly", - "ar-MA": "ma", - "ar-MR": "mr", - "ar-OM": "om", - "ar-PS": "ps", - "ar-QA": "qa", - "ar-SA": "sa", - "ar-SD": "sd", - "ar-SO": "so", - "ar-SY": "sy", - "ar-TD": "td", - "ar-TN": "tn", - "ar-YE": "ye", - "az-AZ": "az", - "be-BY": "by", - "bg-BG": "bg", - "bn-BD": "bd", - "bs-BA": "ba", - "ca-AD": "ad", - "cs-CZ": "cz", - "da-DK": "dk", - "de-AT": "at", - "de-BE": "be", - "de-CH": "ch", - "de-DE": "de", - "de-LI": "li", - "de-LU": "lu", - "el-CY": "cy", - "el-GR": "gr", - "en-AG": "ag", - "en-AI": "ai", - "en-AS": "as", - "en-AU": "au", - "en-BB": "bb", - "en-BI": "bi", - "en-BM": "bm", - "en-BS": "bs", - "en-BW": "bw", - "en-BZ": "bz", - "en-CA": "ca", - "en-CC": "cc", - "en-CK": "ck", - "en-CM": "cm", - "en-CX": "cx", - "en-DM": "dm", - "en-ER": "er", - "en-FJ": "fj", - "en-FK": "fk", - "en-FM": "fm", - "en-GB": "gb", - "en-GD": "gd", - "en-GG": "gg", - "en-GH": "gh", - "en-GI": "gi", - "en-GM": "gm", - "en-GU": "gu", - "en-GY": "gy", - "en-HK": "hk", - "en-IE": "ie", - "en-IN": "in", - "en-JE": "je", - "en-JM": "jm", - "en-KE": "ke", - "en-KI": "ki", - "en-KN": "kn", - "en-KY": "ky", - "en-LC": "lc", - "en-LR": "lr", - "en-LS": "ls", - "en-MG": "mg", - "en-MH": "mh", - "en-MP": "mp", - "en-MS": "ms", - "en-MT": "mt", - "en-MU": "mu", - "en-MW": "mw", - "en-NA": "na", - "en-NF": "nf", - "en-NG": "ng", - "en-NR": "nr", - "en-NU": "nu", - "en-NZ": "nz", - "en-PG": "pg", - "en-PH": "ph", - "en-PK": "pk", - "en-PN": "pn", - "en-PR": "pr", - "en-PW": "pw", - "en-RW": "rw", - "en-SB": "sb", - "en-SC": "sc", - "en-SD": "sd", - "en-SG": "sg", - "en-SH": "sh", - "en-SL": "sl", - "en-SS": "ss", - "en-SX": "sx", - "en-SZ": "sz", - "en-TC": "tc", - "en-TK": "tk", - "en-TO": "to", - "en-TT": "tt", - "en-TV": "tv", - "en-TZ": "tz", - "en-UG": "ug", - "en-US": "us", - "en-VC": "vc", - "en-VG": "vg", - "en-VI": "vi", - "en-VU": "vu", - "en-WS": "ws", - "en-ZA": "za", - "en-ZM": "zm", - "en-ZW": "zw", - "es-AR": "ar", - "es-BO": "bo", - "es-CL": "cl", - "es-CO": "co", - "es-CR": "cr", - "es-DO": "do", - "es-EC": "ec", - "es-ES": "es", - "es-GQ": "gq", - "es-GT": "gt", - "es-HN": "hn", - "es-MX": "mx", - "es-NI": "ni", - "es-PA": "pa", - "es-PE": "pe", - "es-PR": "pr", - "es-PY": "py", - "es-SV": "sv", - "es-UY": "uy", - "es-VE": "ve", - "et-EE": "ee", - "fa-AF": "af", - "fa-IR": "ir", - "fi-FI": "fi", - "fil-PH": "ph", - "fr-BE": "be", - "fr-BF": "bf", - "fr-BI": "bi", - "fr-BJ": "bj", - "fr-BL": "bl", - "fr-CA": "ca", - "fr-CD": "cd", - "fr-CF": "cf", - "fr-CG": "cg", - "fr-CH": "ch", - "fr-CI": "ci", - "fr-CM": "cm", - "fr-DJ": "dj", - "fr-DZ": "dz", - "fr-FR": "fr", - "fr-GA": "ga", - "fr-GF": "gf", - "fr-GN": "gn", - "fr-GP": "gp", - "fr-GQ": "gq", - "fr-HT": "ht", - "fr-KM": "km", - "fr-LU": "lu", - "fr-MA": "ma", - "fr-MC": "mc", - "fr-MF": "mf", - "fr-MG": "mg", - "fr-ML": "ml", - "fr-MQ": "mq", - "fr-MU": "mu", - "fr-NC": "nc", - "fr-NE": "ne", - "fr-PF": "pf", - "fr-PM": "pm", - "fr-RE": "re", - "fr-RW": "rw", - "fr-SC": "sc", - "fr-SN": "sn", - "fr-SY": "sy", - "fr-TD": "td", - "fr-TG": "tg", - "fr-TN": "tn", - "fr-VU": "vu", - "fr-WF": "wf", - "fr-YT": "yt", - "ga-IE": "ie", - "he-IL": "il", - "hi-IN": "in", - "hr-BA": "ba", - "hr-HR": "hr", - "hu-HU": "hu", - "hy-AM": "am", - "id-ID": "id", - "is-IS": "is", - "it-CH": "ch", - "it-IT": "it", - "it-SM": "sm", - "it-VA": "va", - "ja-JP": "jp", - "ka-GE": "ge", - "kk-KZ": "kz", - "km-KH": "kh", - "ko-KR": "kr", - "ky-KG": "kg", - "lb-LU": "lu", - "lo-LA": "la", - "lt-LT": "lt", - "lv-LV": "lv", - "mi-NZ": "nz", - "mk-MK": "mk", - "mn-MN": "mn", - "ms-BN": "bn", - "ms-MY": "my", - "ms-SG": "sg", - "mt-MT": "mt", - "nb-NO": "no", - "ne-NP": "np", - "nl-AW": "aw", - "nl-BE": "be", - "nl-CW": "cw", - "nl-NL": "nl", - "nl-SR": "sr", - "nl-SX": "sx", - "nn-NO": "no", - "pl-PL": "pl", - "pt-AO": "ao", - "pt-BR": "br", - "pt-CV": "cv", - "pt-GQ": "gq", - "pt-GW": "gw", - "pt-MO": "mo", - "pt-MZ": "mz", - "pt-PT": "pt", - "pt-ST": "st", - "qu-BO": "bo", - "qu-EC": "ec", - "qu-PE": "pe", - "ro-MD": "md", - "ro-RO": "ro", - "ru-BY": "by", - "ru-KG": "kg", - "ru-KZ": "kz", - "ru-RU": "ru", - "ru-UA": "ua", - "rw-RW": "rw", - "si-LK": "lk", - "sk-SK": "sk", - "sl-SI": "si", - "sq-AL": "al", - "sr-BA": "ba", - "sr-ME": "me", - "sr-RS": "rs", - "sv-FI": "fi", - "sv-SE": "se", - "sw-KE": "ke", - "sw-TZ": "tz", - "sw-UG": "ug", - "ta-LK": "lk", - "ta-SG": "sg", - "tg-TJ": "tj", - "th-TH": "th", - "ti-ER": "er", - "tk-TM": "tm", - "tr-CY": "cy", - "tr-TR": "tr", - "uk-UA": "ua", - "ur-PK": "pk", - "uz-UZ": "uz", - "vi-VN": "vn", - "wo-SN": "sn", - "yo-NG": "ng", - "zh-CN": "cn", - "zh-HK": "hk", - "zh-MO": "mo", - "zh-SG": "sg", - "zh-TW": "tw" + "da-DK": "da-DK", + "de-DE": "de-DE", + "en-AU": "en-AU", + "en-GB": "en-GB", + "en-US": "en-US", + "es-CL": "es-CL", + "es-MX": "es-MX", + "es-US": "es-US", + "fi-FI": "fi-FI", + "fr-CA": "fr-CA", + "fr-FR": "fr-FR", + "it-IT": "it-IT", + "pt-BR": "pt-BR", + "zh-CN": "zh-CN" }, - "supported_languages": [ - "af", - "am", - "ar", - "as", - "az-latn", - "be", - "bg", - "bn", - "bs-latn", - "ca", - "ca-es-valencia", - "chr-cher", - "cs", - "cy", - "da", - "de", - "el", - "en", - "es", - "et", - "eu", - "fa", - "fi", - "fil", - "fr", - "ga", - "gd", - "gl", - "gu", - "ha-latn", - "he", - "hi", - "hr", - "hu", - "hy", - "id", - "ig", - "is", - "it", - "ja", - "ka", - "kk", - "km", - "kn", - "ko", - "kok", - "ku-arab", - "ky", - "lb", - "lo", - "lt", - "lv", - "mi", - "mk", - "ml", - "mn-Cyrl-MN", - "mr", - "ms", - "mt", - "nb", - "ne", - "nl", - "nn", - "nso", - "or", - "pa-arab", - "pa-guru", - "pl", - "prs", - "pt-BR", - "pt-PT", - "quc", - "quz", - "ro", - "ru", - "rw", - "sd-arab", - "si", - "sk", - "sl", - "sq", - "sr-cyrl", - "sr-latn", - "sv", - "sw", - "ta", - "te", - "tg-cyrl", - "th", - "ti", - "tk", - "tn", - "tr", - "tt", - "ug", - "uk", - "ur", - "uz-latn", - "vi", - "wo", - "xh", - "yo", - "zh-Hans", - "zh-Hant", - "zu" - ] + "supported_languages": {} }, "bing videos": { "all_locale": null, "custom": {}, - "data_type": "supported_languages", + "data_type": "traits_v1", "languages": { - "af": "af", - "am": "am", "ar": "ar", - "as": "as", - "az": "az", - "be": "be", "bg": "bg", "bn": "bn", - "bs": "bs", "ca": "ca", - "chr": "chr", "cs": "cs", - "cy": "cy", "da": "da", "de": "de", - "el": "el", "en": "en", "es": "es", "et": "et", "eu": "eu", - "fa": "fa", "fi": "fi", - "fil": "fil", "fr": "fr", - "ga": "ga", - "gd": "gd", "gl": "gl", "gu": "gu", - "ha": "ha", "he": "he", "hi": "hi", "hr": "hr", "hu": "hu", - "hy": "hy", - "id": "id", - "ig": "ig", "is": "is", "it": "it", - "ja": "ja", - "ka": "ka", - "kk": "kk", - "km": "km", + "ja": "jp", "kn": "kn", "ko": "ko", - "kok": "kok", - "ku": "ku", - "ky": "ky", - "lb": "lb", - "lo": "lo", "lt": "lt", "lv": "lv", - "mi": "mi", - "mk": "mk", "ml": "ml", - "mn": "MN", "mr": "mr", "ms": "ms", - "mt": "mt", "nb": "nb", - "ne": "ne", "nl": "nl", - "nn": "nn", - "or": "or", "pa": "pa", - "pa_Arab": "pa-Arab", "pl": "pl", - "pt": "pt", - "qu": "quz", + "pt": "pt-pt", "ro": "ro", "ru": "ru", - "rw": "rw", - "sd": "sd", - "si": "si", "sk": "sk", "sl": "sl", - "sq": "sq", "sr": "sr", - "sr_Latn": "sr_latn", "sv": "sv", - "sw": "sw", "ta": "ta", "te": "te", - "tg": "tg", "th": "th", - "ti": "ti", - "tk": "tk", "tr": "tr", - "tt": "tt", - "ug": "ug", "uk": "uk", - "ur": "ur", - "uz": "uz", "vi": "vi", - "wo": "wo", - "xh": "xh", - "yo": "yo", - "zh": "zh_Hans", - "zh_Hans": "zh_Hans", - "zh_Hant": "zh_Hant", - "zu": "zu" + "zh": "zh-hans", + "zh_Hans": "zh-hans", + "zh_Hant": "zh-hant" }, "regions": { - "am-ET": "et", - "ar-AE": "ae", - "ar-BH": "bh", - "ar-DJ": "dj", - "ar-DZ": "dz", - "ar-EG": "eg", - "ar-ER": "er", - "ar-IL": "il", - "ar-IQ": "iq", - "ar-JO": "jo", - "ar-KM": "km", - "ar-KW": "kw", - "ar-LB": "lb", - "ar-LY": "ly", - "ar-MA": "ma", - "ar-MR": "mr", - "ar-OM": "om", - "ar-PS": "ps", - "ar-QA": "qa", - "ar-SA": "sa", - "ar-SD": "sd", - "ar-SO": "so", - "ar-SY": "sy", - "ar-TD": "td", - "ar-TN": "tn", - "ar-YE": "ye", - "az-AZ": "az", - "be-BY": "by", - "bg-BG": "bg", - "bn-BD": "bd", - "bs-BA": "ba", - "ca-AD": "ad", - "cs-CZ": "cz", - "da-DK": "dk", - "de-AT": "at", - "de-BE": "be", - "de-CH": "ch", - "de-DE": "de", - "de-LI": "li", - "de-LU": "lu", - "el-CY": "cy", - "el-GR": "gr", - "en-AG": "ag", - "en-AI": "ai", - "en-AS": "as", - "en-AU": "au", - "en-BB": "bb", - "en-BI": "bi", - "en-BM": "bm", - "en-BS": "bs", - "en-BW": "bw", - "en-BZ": "bz", - "en-CA": "ca", - "en-CC": "cc", - "en-CK": "ck", - "en-CM": "cm", - "en-CX": "cx", - "en-DM": "dm", - "en-ER": "er", - "en-FJ": "fj", - "en-FK": "fk", - "en-FM": "fm", - "en-GB": "gb", - "en-GD": "gd", - "en-GG": "gg", - "en-GH": "gh", - "en-GI": "gi", - "en-GM": "gm", - "en-GU": "gu", - "en-GY": "gy", - "en-HK": "hk", - "en-IE": "ie", - "en-IN": "in", - "en-JE": "je", - "en-JM": "jm", - "en-KE": "ke", - "en-KI": "ki", - "en-KN": "kn", - "en-KY": "ky", - "en-LC": "lc", - "en-LR": "lr", - "en-LS": "ls", - "en-MG": "mg", - "en-MH": "mh", - "en-MP": "mp", - "en-MS": "ms", - "en-MT": "mt", - "en-MU": "mu", - "en-MW": "mw", - "en-NA": "na", - "en-NF": "nf", - "en-NG": "ng", - "en-NR": "nr", - "en-NU": "nu", - "en-NZ": "nz", - "en-PG": "pg", - "en-PH": "ph", - "en-PK": "pk", - "en-PN": "pn", - "en-PR": "pr", - "en-PW": "pw", - "en-RW": "rw", - "en-SB": "sb", - "en-SC": "sc", - "en-SD": "sd", - "en-SG": "sg", - "en-SH": "sh", - "en-SL": "sl", - "en-SS": "ss", - "en-SX": "sx", - "en-SZ": "sz", - "en-TC": "tc", - "en-TK": "tk", - "en-TO": "to", - "en-TT": "tt", - "en-TV": "tv", - "en-TZ": "tz", - "en-UG": "ug", - "en-US": "us", - "en-VC": "vc", - "en-VG": "vg", - "en-VI": "vi", - "en-VU": "vu", - "en-WS": "ws", - "en-ZA": "za", - "en-ZM": "zm", - "en-ZW": "zw", - "es-AR": "ar", - "es-BO": "bo", - "es-CL": "cl", - "es-CO": "co", - "es-CR": "cr", - "es-DO": "do", - "es-EC": "ec", - "es-ES": "es", - "es-GQ": "gq", - "es-GT": "gt", - "es-HN": "hn", - "es-MX": "mx", - "es-NI": "ni", - "es-PA": "pa", - "es-PE": "pe", - "es-PR": "pr", - "es-PY": "py", - "es-SV": "sv", - "es-UY": "uy", - "es-VE": "ve", - "et-EE": "ee", - "fa-AF": "af", - "fa-IR": "ir", - "fi-FI": "fi", - "fil-PH": "ph", - "fr-BE": "be", - "fr-BF": "bf", - "fr-BI": "bi", - "fr-BJ": "bj", - "fr-BL": "bl", - "fr-CA": "ca", - "fr-CD": "cd", - "fr-CF": "cf", - "fr-CG": "cg", - "fr-CH": "ch", - "fr-CI": "ci", - "fr-CM": "cm", - "fr-DJ": "dj", - "fr-DZ": "dz", - "fr-FR": "fr", - "fr-GA": "ga", - "fr-GF": "gf", - "fr-GN": "gn", - "fr-GP": "gp", - "fr-GQ": "gq", - "fr-HT": "ht", - "fr-KM": "km", - "fr-LU": "lu", - "fr-MA": "ma", - "fr-MC": "mc", - "fr-MF": "mf", - "fr-MG": "mg", - "fr-ML": "ml", - "fr-MQ": "mq", - "fr-MU": "mu", - "fr-NC": "nc", - "fr-NE": "ne", - "fr-PF": "pf", - "fr-PM": "pm", - "fr-RE": "re", - "fr-RW": "rw", - "fr-SC": "sc", - "fr-SN": "sn", - "fr-SY": "sy", - "fr-TD": "td", - "fr-TG": "tg", - "fr-TN": "tn", - "fr-VU": "vu", - "fr-WF": "wf", - "fr-YT": "yt", - "ga-IE": "ie", - "he-IL": "il", - "hi-IN": "in", - "hr-BA": "ba", - "hr-HR": "hr", - "hu-HU": "hu", - "hy-AM": "am", - "id-ID": "id", - "is-IS": "is", - "it-CH": "ch", - "it-IT": "it", - "it-SM": "sm", - "it-VA": "va", - "ja-JP": "jp", - "ka-GE": "ge", - "kk-KZ": "kz", - "km-KH": "kh", - "ko-KR": "kr", - "ky-KG": "kg", - "lb-LU": "lu", - "lo-LA": "la", - "lt-LT": "lt", - "lv-LV": "lv", - "mi-NZ": "nz", - "mk-MK": "mk", - "mn-MN": "mn", - "ms-BN": "bn", - "ms-MY": "my", - "ms-SG": "sg", - "mt-MT": "mt", - "nb-NO": "no", - "ne-NP": "np", - "nl-AW": "aw", - "nl-BE": "be", - "nl-CW": "cw", - "nl-NL": "nl", - "nl-SR": "sr", - "nl-SX": "sx", - "nn-NO": "no", - "pl-PL": "pl", - "pt-AO": "ao", - "pt-BR": "br", - "pt-CV": "cv", - "pt-GQ": "gq", - "pt-GW": "gw", - "pt-MO": "mo", - "pt-MZ": "mz", - "pt-PT": "pt", - "pt-ST": "st", - "qu-BO": "bo", - "qu-EC": "ec", - "qu-PE": "pe", - "ro-MD": "md", - "ro-RO": "ro", - "ru-BY": "by", - "ru-KG": "kg", - "ru-KZ": "kz", - "ru-RU": "ru", - "ru-UA": "ua", - "rw-RW": "rw", - "si-LK": "lk", - "sk-SK": "sk", - "sl-SI": "si", - "sq-AL": "al", - "sr-BA": "ba", - "sr-ME": "me", - "sr-RS": "rs", - "sv-FI": "fi", - "sv-SE": "se", - "sw-KE": "ke", - "sw-TZ": "tz", - "sw-UG": "ug", - "ta-LK": "lk", - "ta-SG": "sg", - "tg-TJ": "tj", - "th-TH": "th", - "ti-ER": "er", - "tk-TM": "tm", - "tr-CY": "cy", - "tr-TR": "tr", - "uk-UA": "ua", - "ur-PK": "pk", - "uz-UZ": "uz", - "vi-VN": "vn", - "wo-SN": "sn", - "yo-NG": "ng", - "zh-CN": "cn", - "zh-HK": "hk", - "zh-MO": "mo", - "zh-SG": "sg", - "zh-TW": "tw" + "da-DK": "da-DK", + "de-AT": "de-AT", + "de-CH": "de-CH", + "de-DE": "de-DE", + "en-AU": "en-AU", + "en-CA": "en-CA", + "en-GB": "en-GB", + "en-IN": "en-IN", + "en-MY": "en-MY", + "en-NZ": "en-NZ", + "en-PH": "en-PH", + "en-US": "en-US", + "en-ZA": "en-ZA", + "es-AR": "es-AR", + "es-CL": "es-CL", + "es-ES": "es-ES", + "es-MX": "es-MX", + "es-US": "es-US", + "fi-FI": "fi-FI", + "fr-BE": "fr-BE", + "fr-CA": "fr-CA", + "fr-CH": "fr-CH", + "fr-FR": "fr-FR", + "id-ID": "en-ID", + "it-IT": "it-IT", + "ja-JP": "ja-JP", + "ko-KR": "ko-KR", + "nb-NO": "no-NO", + "nl-BE": "nl-BE", + "nl-NL": "nl-NL", + "pl-PL": "pl-PL", + "pt-BR": "pt-BR", + "ru-RU": "ru-RU", + "sv-SE": "sv-SE", + "tr-TR": "tr-TR", + "zh-CN": "zh-CN", + "zh-HK": "zh-HK", + "zh-TW": "zh-TW" }, - "supported_languages": [ - "af", - "am", - "ar", - "as", - "az-latn", - "be", - "bg", - "bn", - "bs-latn", - "ca", - "ca-es-valencia", - "chr-cher", - "cs", - "cy", - "da", - "de", - "el", - "en", - "es", - "et", - "eu", - "fa", - "fi", - "fil", - "fr", - "ga", - "gd", - "gl", - "gu", - "ha-latn", - "he", - "hi", - "hr", - "hu", - "hy", - "id", - "ig", - "is", - "it", - "ja", - "ka", - "kk", - "km", - "kn", - "ko", - "kok", - "ku-arab", - "ky", - "lb", - "lo", - "lt", - "lv", - "mi", - "mk", - "ml", - "mn-Cyrl-MN", - "mr", - "ms", - "mt", - "nb", - "ne", - "nl", - "nn", - "nso", - "or", - "pa-arab", - "pa-guru", - "pl", - "prs", - "pt-BR", - "pt-PT", - "quc", - "quz", - "ro", - "ru", - "rw", - "sd-arab", - "si", - "sk", - "sl", - "sq", - "sr-cyrl", - "sr-latn", - "sv", - "sw", - "ta", - "te", - "tg-cyrl", - "th", - "ti", - "tk", - "tn", - "tr", - "tt", - "ug", - "uk", - "ur", - "uz-latn", - "vi", - "wo", - "xh", - "yo", - "zh-Hans", - "zh-Hant", - "zu" - ] + "supported_languages": {} }, "dailymotion": { "all_locale": null, diff --git a/searx/engines/bing.py b/searx/engines/bing.py index 81b051797..385c973cb 100644 --- a/searx/engines/bing.py +++ b/searx/engines/bing.py @@ -4,16 +4,28 @@ - https://github.com/searx/searx/issues/2019#issuecomment-648227442 """ -# pylint: disable=too-many-branches +# pylint: disable=too-many-branches, invalid-name + +from typing import TYPE_CHECKING +import datetime import re -from urllib.parse import urlencode, urlparse, parse_qs +import uuid +from urllib.parse import urlencode from lxml import html -from searx.utils import eval_xpath, extract_text, eval_xpath_list, match_language, eval_xpath_getindex -from searx.network import multi_requests, Request +import babel +import babel.languages +from searx.utils import eval_xpath, extract_text, eval_xpath_list, eval_xpath_getindex +from searx import network +from searx.locales import language_tag, region_tag from searx.enginelib.traits import EngineTraits +if TYPE_CHECKING: + import logging + + logger: logging.Logger + traits: EngineTraits about = { @@ -25,56 +37,124 @@ about = { "results": 'HTML', } +send_accept_language_header = True +"""Bing tries to guess user's language and territory from the HTTP +Accept-Language. Optional the user can select a search-language (can be +different to the UI language) and a region (market code).""" + # engine dependent config categories = ['general', 'web'] paging = True -time_range_support = False -safesearch = False -send_accept_language_header = True -supported_languages_url = 'https://www.bing.com/account/general' -language_aliases = {} +time_range_support = True +safesearch = True +safesearch_types = {2: 'STRICT', 1: 'DEMOTE', 0: 'OFF'} # cookie: ADLT=STRICT -# search-url -base_url = 'https://www.bing.com/' +base_url = 'https://www.bing.com/search' +"""Bing (Web) search URL""" -# initial query: https://www.bing.com/search?q=foo&search=&form=QBLH -inital_query = 'search?{query}&search=&form=QBLH' - -# following queries: https://www.bing.com/search?q=foo&search=&first=11&FORM=PERE -page_query = 'search?{query}&search=&first={offset}&FORM=PERE' +bing_traits_url = 'https://learn.microsoft.com/en-us/bing/search-apis/bing-web-search/reference/market-codes' +"""Bing (Web) search API description""" def _get_offset_from_pageno(pageno): return (pageno - 1) * 10 + 1 +def set_bing_cookies(params, engine_language, engine_region, SID): + + # set cookies + # ----------- + + params['cookies']['_EDGE_V'] = '1' + + # _EDGE_S: F=1&SID=3A5253BD6BCA609509B741876AF961CA&mkt=zh-tw + _EDGE_S = [ + 'F=1', + 'SID=%s' % SID, + 'mkt=%s' % engine_region.lower(), + 'ui=%s' % engine_language.lower(), + ] + params['cookies']['_EDGE_S'] = '&'.join(_EDGE_S) + logger.debug("cookie _EDGE_S=%s", params['cookies']['_EDGE_S']) + + # "_EDGE_CD": "m=zh-tw", + + _EDGE_CD = [ # pylint: disable=invalid-name + 'm=%s' % engine_region.lower(), # search region: zh-cn + 'u=%s' % engine_language.lower(), # UI: en-us + ] + + params['cookies']['_EDGE_CD'] = '&'.join(_EDGE_CD) + ';' + logger.debug("cookie _EDGE_CD=%s", params['cookies']['_EDGE_CD']) + + SRCHHPGUSR = [ # pylint: disable=invalid-name + 'SRCHLANG=%s' % engine_language, + # Trying to set ADLT cookie here seems not to have any effect, I assume + # there is some age verification by a cookie (and/or session ID) needed, + # to disable the SafeSearch. + 'ADLT=%s' % safesearch_types.get(params['safesearch'], 'DEMOTE'), + ] + params['cookies']['SRCHHPGUSR'] = '&'.join(SRCHHPGUSR) + logger.debug("cookie SRCHHPGUSR=%s", params['cookies']['SRCHHPGUSR']) + + def request(query, params): + """Assemble a Bing-Web request.""" - offset = _get_offset_from_pageno(params.get('pageno', 1)) + engine_region = traits.get_region(params['searxng_locale'], 'en-US') + engine_language = traits.get_language(params['searxng_locale'], 'en') - # logger.debug("params['pageno'] --> %s", params.get('pageno')) - # logger.debug(" offset --> %s", offset) + SID = uuid.uuid1().hex.upper() + CVID = uuid.uuid1().hex.upper() - search_string = page_query - if offset == 1: - search_string = inital_query + set_bing_cookies(params, engine_language, engine_region, SID) - if params['language'] == 'all': - lang = 'EN' - else: - lang = match_language(params['language'], supported_languages, language_aliases) + # build URL query + # --------------- - query = 'language:{} {}'.format(lang.split('-')[0].upper(), query) + # query term + page = int(params.get('pageno', 1)) + query_params = { + # fmt: off + 'q': query, + 'pq': query, + 'cvid': CVID, + 'qs': 'n', + 'sp': '-1' + # fmt: on + } - search_path = search_string.format(query=urlencode({'q': query}), offset=offset) - - if offset > 1: - referer = base_url + inital_query.format(query=urlencode({'q': query})) + # page + if page > 1: + referer = base_url + '?' + urlencode(query_params) params['headers']['Referer'] = referer logger.debug("headers.Referer --> %s", referer) - params['url'] = base_url + search_path - params['headers']['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' + query_params['first'] = _get_offset_from_pageno(page) + + if page == 2: + query_params['FORM'] = 'PERE' + elif page > 2: + query_params['FORM'] = 'PERE%s' % (page - 2) + + filters = '' + if params['time_range']: + query_params['filt'] = 'custom' + + if params['time_range'] == 'day': + filters = 'ex1:"ez1"' + elif params['time_range'] == 'week': + filters = 'ex1:"ez2"' + elif params['time_range'] == 'month': + filters = 'ex1:"ez3"' + elif params['time_range'] == 'year': + epoch_1970 = datetime.date(1970, 1, 1) + today_no = (datetime.date.today() - epoch_1970).days + filters = 'ex1:"ez5_%s_%s"' % (today_no - 365, today_no) + + params['url'] = base_url + '?' + urlencode(query_params) + if filters: + params['url'] = params['url'] + '&filters=' + filters return params @@ -111,7 +191,8 @@ def response(resp): url_cite = extract_text(eval_xpath(result, './/div[@class="b_attribution"]/cite')) # Bing can shorten the URL either at the end or in the middle of the string if ( - url_cite.startswith('https://') + url_cite + and url_cite.startswith('https://') and '…' not in url_cite and '...' not in url_cite and '›' not in url_cite @@ -131,9 +212,9 @@ def response(resp): # resolve all Bing redirections in parallel request_list = [ - Request.get(u, allow_redirects=False, headers=resp.search_params['headers']) for u in url_to_resolve + network.Request.get(u, allow_redirects=False, headers=resp.search_params['headers']) for u in url_to_resolve ] - response_list = multi_requests(request_list) + response_list = network.multi_requests(request_list) for i, redirect_response in enumerate(response_list): if not isinstance(redirect_response, Exception): results[url_to_resolve_index[i]]['url'] = redirect_response.headers['location'] @@ -161,94 +242,43 @@ def response(resp): return results -# get supported languages from their site -def _fetch_supported_languages(resp): - - lang_tags = set() - - dom = html.fromstring(resp.text) - lang_links = eval_xpath(dom, '//div[@id="language-section"]//li') - - for _li in lang_links: - - href = eval_xpath(_li, './/@href')[0] - (_scheme, _netloc, _path, _params, query, _fragment) = urlparse(href) - query = parse_qs(query, keep_blank_values=True) - - # fmt: off - setlang = query.get('setlang', [None, ])[0] - # example: 'mn-Cyrl-MN' --> '['mn', 'Cyrl-MN'] - lang, nation = (setlang.split('-', maxsplit=1) + [None,])[:2] # fmt: skip - # fmt: on - - tag = lang + '-' + nation if nation else lang - lang_tags.add(tag) - - return list(lang_tags) - - def fetch_traits(engine_traits: EngineTraits): - """Fetch languages and regions from bing.""" + """Fetch languages and regions from Bing-Web.""" - # pylint: disable=import-outside-toplevel, disable=too-many-branches, - # pylint: disable=too-many-locals, too-many-statements + xpath_market_codes = '//table[1]/tbody/tr/td[3]' + # xpath_country_codes = '//table[2]/tbody/tr/td[2]' + xpath_language_codes = '//table[3]/tbody/tr/td[2]' - engine_traits.data_type = 'supported_languages' # deprecated + _fetch_traits(engine_traits, bing_traits_url, xpath_language_codes, xpath_market_codes) - import babel - import babel.languages - from searx import network - from searx.locales import get_offical_locales, language_tag, region_tag - from searx.utils import gen_useragent - headers = { - 'User-Agent': gen_useragent(), - 'Accept-Language': "en-US,en;q=0.5", # bing needs to set the English language - } - resp = network.get('https://www.bing.com/account/general', headers=headers) +def _fetch_traits(engine_traits: EngineTraits, url: str, xpath_language_codes: str, xpath_market_codes: str): + + # insert alias to map from a language (zh) to a language + script (zh_Hans) + engine_traits.languages['zh'] = 'zh-hans' + + resp = network.get(url) if not resp.ok: print("ERROR: response from peertube is not OK.") dom = html.fromstring(resp.text) - # Selector to get items from "Display language" + map_lang = {'jp': 'ja'} + for td in eval_xpath(dom, xpath_language_codes): + eng_lang = td.text - lang_map = { - 'prs': 'fa', # Persian - 'pt_BR': 'pt', # Portuguese (Brasil) - 'pt_PT': 'pt', # Portuguese (Portugal) - 'ca-ES-VALENCIA': 'ca', # Catalan (Spain, Valencian) - } - - unknow_langs = [ - 'quc', # K'iche' - 'nso', # Sesotho sa Leboa - 'tn', # Setswana - ] - - for div in eval_xpath(dom, '//div[@id="limit-languages"]//input/..'): - - eng_lang = eval_xpath(div, './/input/@value')[0] - if eng_lang in unknow_langs: + if eng_lang in ('en-gb', 'pt-br'): + # language 'en' is already in the list and a language 'en-gb' can't + # be handled in SearXNG, same with pt-br which is covered by pt-pt. continue - eng_lang = lang_map.get(eng_lang, eng_lang) - label = extract_text(eval_xpath(div, './/label')) - - # The 'language:xx' query string in the request function (above) does - # only support the language codes from the "Display languages" list. - # Examples of items from the "Display languages" not sopported in the - # query string: zh_Hans --> zh / sr_latn --> sr - # - # eng_lang = eng_lang.split('_')[0] - + babel_lang = map_lang.get(eng_lang, eng_lang).replace('-', '_') try: - sxng_tag = language_tag(babel.Locale.parse(eng_lang.replace('-', '_'), sep='_')) + sxng_tag = language_tag(babel.Locale.parse(babel_lang)) except babel.UnknownLocaleError: - print("ERROR: %s (%s) is unknown by babel" % (label, eng_lang)) + print("ERROR: language (%s) is unknown by babel" % (eng_lang)) continue - conflict = engine_traits.languages.get(sxng_tag) if conflict: if conflict != eng_lang: @@ -256,25 +286,27 @@ def fetch_traits(engine_traits: EngineTraits): continue engine_traits.languages[sxng_tag] = eng_lang - engine_traits.languages['zh'] = 'zh_Hans' + map_region = { + 'en-ID': 'id_ID', + 'no-NO': 'nb_NO', + } - # regiones + for td in eval_xpath(dom, xpath_market_codes): + eng_region = td.text + babel_region = map_region.get(eng_region, eng_region).replace('-', '_') - for a in eval_xpath(dom, '//div[@id="region-section-content"]//li/a'): - href = eval_xpath(a, './/@href')[0] - # lang_name = extract_text(a) - query = urlparse(href)[4] - query = parse_qs(query, keep_blank_values=True) - cc = query.get('cc')[0] # pylint:disable=invalid-name - if cc == 'clear': + if eng_region == 'en-WW': + engine_traits.all_locale = eng_region continue - # Assert babel supports this locales - sxng_locales = get_offical_locales(cc.upper(), engine_traits.languages.keys()) - - if not sxng_locales: - # print("ERROR: can't map from bing country %s (%s) to a babel region." % (a.text_content().strip(), cc)) + try: + sxng_tag = region_tag(babel.Locale.parse(babel_region)) + except babel.UnknownLocaleError: + print("ERROR: region (%s) is unknown by babel" % (eng_region)) continue - - for sxng_locale in sxng_locales: - engine_traits.regions[region_tag(sxng_locale)] = cc + conflict = engine_traits.regions.get(sxng_tag) + if conflict: + if conflict != eng_region: + print("CONFLICT: babel %s --> %s, %s" % (sxng_tag, conflict, eng_region)) + continue + engine_traits.regions[sxng_tag] = eng_region diff --git a/searx/engines/bing_images.py b/searx/engines/bing_images.py index 19f3ad01a..87c9f29f3 100644 --- a/searx/engines/bing_images.py +++ b/searx/engines/bing_images.py @@ -10,12 +10,7 @@ from urllib.parse import urlencode from lxml import html from searx.utils import match_language -from searx.engines.bing import language_aliases -from searx.engines.bing import ( # pylint: disable=unused-import - _fetch_supported_languages, - fetch_traits, - supported_languages_url, -) +from searx.enginelib.traits import EngineTraits # about about = { @@ -106,3 +101,19 @@ def response(resp): ) return results + + +def fetch_traits(engine_traits: EngineTraits): + """Fetch languages and regions from Bing-News.""" + # pylint: disable=import-outside-toplevel + + from searx.engines.bing import _fetch_traits + + url = 'https://learn.microsoft.com/en-us/bing/search-apis/bing-news-search/reference/market-codes' + + xpath_market_codes = '//table[1]/tbody/tr/td[3]' + + # xpath_country_codes = '//table[2]/tbody/tr/td[2]' + xpath_language_codes = '//table[3]/tbody/tr/td[2]' + + _fetch_traits(engine_traits, url, xpath_language_codes, xpath_market_codes) diff --git a/searx/engines/bing_news.py b/searx/engines/bing_news.py index 8a5f70259..680e47538 100644 --- a/searx/engines/bing_news.py +++ b/searx/engines/bing_news.py @@ -14,12 +14,7 @@ from dateutil import parser from lxml import etree from lxml.etree import XPath from searx.utils import match_language, eval_xpath_getindex -from searx.engines.bing import ( # pylint: disable=unused-import - language_aliases, - _fetch_supported_languages, - fetch_traits, - supported_languages_url, -) +from searx.enginelib.traits import EngineTraits # about about = { @@ -140,3 +135,21 @@ def response(resp): results.append({'url': url, 'title': title, 'publishedDate': publishedDate, 'content': content}) return results + + +def fetch_traits(engine_traits: EngineTraits): + """Fetch languages and regions from Bing-News.""" + # pylint: disable=import-outside-toplevel + + from searx.engines.bing import _fetch_traits + + url = 'https://learn.microsoft.com/en-us/bing/search-apis/bing-news-search/reference/market-codes' + + # The description of the first table says "query parameter when calling the + # Video Search API." .. thats why I use the 4. table "News Category API markets" + xpath_market_codes = '//table[4]/tbody/tr/td[3]' + + # xpath_country_codes = '//table[2]/tbody/tr/td[2]' + xpath_language_codes = '//table[3]/tbody/tr/td[2]' + + _fetch_traits(engine_traits, url, xpath_language_codes, xpath_market_codes) diff --git a/searx/engines/bing_videos.py b/searx/engines/bing_videos.py index 4946eef64..88f64206b 100644 --- a/searx/engines/bing_videos.py +++ b/searx/engines/bing_videos.py @@ -10,13 +10,7 @@ from urllib.parse import urlencode from lxml import html from searx.utils import match_language -from searx.engines.bing import language_aliases - -from searx.engines.bing import ( # pylint: disable=unused-import - _fetch_supported_languages, - fetch_traits, - supported_languages_url, -) +from searx.enginelib.traits import EngineTraits about = { "website": 'https://www.bing.com/videos', @@ -97,3 +91,17 @@ def response(resp): ) return results + + +def fetch_traits(engine_traits: EngineTraits): + """Fetch languages and regions from Bing-Videos.""" + # pylint: disable=import-outside-toplevel + + from searx.engines.bing import _fetch_traits + + url = 'https://learn.microsoft.com/en-us/bing/search-apis/bing-video-search/reference/market-codes' + xpath_market_codes = '//table[1]/tbody/tr/td[3]' + # xpath_country_codes = '//table[2]/tbody/tr/td[2]' + xpath_language_codes = '//table[3]/tbody/tr/td[2]' + + _fetch_traits(engine_traits, url, xpath_language_codes, xpath_market_codes) diff --git a/searx/sxng_locales.py b/searx/sxng_locales.py index 110c4f17a..4a722ef71 100644 --- a/searx/sxng_locales.py +++ b/searx/sxng_locales.py @@ -8,8 +8,6 @@ This file is generated automatically by:: sxng_locales = ( ('ar', 'العربية', '', 'Arabic', '\U0001f310'), - ('ar-EG', 'العربية', 'مصر', 'Arabic', '\U0001f1ea\U0001f1ec'), - ('ar-SA', 'العربية', 'المملكة العربية السعودية', 'Arabic', '\U0001f1f8\U0001f1e6'), ('bg', 'Български', '', 'Bulgarian', '\U0001f310'), ('bg-BG', 'Български', 'България', 'Bulgarian', '\U0001f1e7\U0001f1ec'), ('ca', 'Català', '', 'Catalan', '\U0001f310'), @@ -30,19 +28,17 @@ sxng_locales = ( ('en-GB', 'English', 'United Kingdom', 'English', '\U0001f1ec\U0001f1e7'), ('en-IE', 'English', 'Ireland', 'English', '\U0001f1ee\U0001f1ea'), ('en-IN', 'English', 'India', 'English', '\U0001f1ee\U0001f1f3'), + ('en-MY', 'English', 'Malaysia', 'English', '\U0001f1f2\U0001f1fe'), ('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'), + ('es-US', 'Español', 'Estados Unidos', 'Spanish', '\U0001f1fa\U0001f1f8'), ('et', 'Eesti', '', 'Estonian', '\U0001f310'), ('et-EE', 'Eesti', 'Eesti', 'Estonian', '\U0001f1ea\U0001f1ea'), ('fi', 'Suomi', '', 'Finnish', '\U0001f310'), @@ -53,8 +49,6 @@ sxng_locales = ( ('fr-CH', 'Français', 'Suisse', 'French', '\U0001f1e8\U0001f1ed'), ('fr-FR', 'Français', 'France', 'French', '\U0001f1eb\U0001f1f7'), ('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'), @@ -67,9 +61,7 @@ sxng_locales = ( ('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'), @@ -85,19 +77,13 @@ sxng_locales = ( ('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'), ('sv', 'Svenska', '', 'Swedish', '\U0001f310'), ('sv-SE', 'Svenska', 'Sverige', 'Swedish', '\U0001f1f8\U0001f1ea'), ('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'),