import re
from lib.utils.localization.countries import find_language_by_unicode
langsSet = {
"bosnian",
"ro",
"swedish",
"mac",
"tr",
"rw",
"ind",
"czech",
"nl",
"he",
"lithuanian",
"sāmo",
"nor",
"རྫོང",
"ger",
"azə",
"shq",
"cze",
"hu",
"danish",
"hy",
"mag",
"ms",
"tajik",
"پښت",
"kaz",
"mk",
"vietnamese",
"sk",
"бъл",
"ps",
"lt",
"cs",
"mongolian",
"jap",
"geo",
"ko",
"dan",
"dzongkha",
"th",
"norwegian",
"az",
"mt",
"por",
"kala",
"sin",
"ja",
"pol",
"is",
"nepali",
"việt",
"тоҷ",
"amh",
"irish",
"chinese",
"pl",
"қаз",
"maltese",
"tg",
"arabic",
"ລາວ",
"khm",
"ukr",
"hin",
"am",
"ne",
"føroy",
"et",
"macedonian",
"polish",
"ita",
"tur",
"ქართული",
"gre",
"spa",
"বেঙ্গ",
"عرب",
"kyr",
"rus",
"bs",
"si",
"sr",
"belarusian",
"kl",
"my",
"bel",
"o'zb",
"бел",
"नेप",
"sam",
"albanian",
"faroese",
"turkish",
"spanish",
"da",
"georgian",
"malay",
"km",
"divehi",
"greek",
"فارسی",
"iri",
"bengali",
"melay",
"ben",
"mn",
"id",
"монгол",
"kin",
"portuguese",
"dutch",
"ar",
"de",
"icelandic",
"bg",
"slov",
"hi",
"norsk",
"est",
"viet",
"dz",
"rom",
"kyrgyz",
"fran",
"chi",
"ka",
"malaysian",
"fa",
"vi",
"catalan",
"ser",
"ru",
"indo",
"fo",
"pt",
"mal",
"burmese",
"kor",
"ga",
"korean",
"fin",
"lit",
"amharic",
"nep",
"dzo",
"italian",
"heb",
"be",
"bulgarian",
"eest",
"укр",
"አማ",
"ísl",
"el",
"lv",
"turkmen",
"日",
"bur",
"हिं",
"עבר",
"tha",
"taj",
"мак",
"sq",
"uk",
"bos",
"sven",
"slo",
"japanese",
"hun",
"french",
"esp",
"serbian",
"croatian",
"türkmen",
"alb",
"kal",
"uz",
"mla",
"eng",
"german",
"ខ្មែរ",
"hebrew",
"ice",
"cro",
"mon",
"ελλ",
"sinhalese",
"рус",
"lo",
"fr",
"ca",
"sv",
"uzbek",
"aze",
"հայ",
"ara",
"hindi",
"မြန်",
"kalaallisut",
"es",
"it",
"kazakh",
"kk",
"slovak",
"per",
"sl",
"suom",
"češ",
"hungarian",
"finnish",
"thai",
"zh",
"hr",
"ky",
"arm",
"slovene",
"persian",
"cat",
"bn",
"ukrainian",
"ދިވެ",
"sve",
"div",
"fre",
"кыргыз",
"uzb",
"estonian",
"kinyarwanda",
"hrv",
"no",
"pashto",
"azerbaijani",
"gae",
"latvian",
"du",
"en",
"ned",
"срп",
"samoan",
"中",
"tk",
"lao",
"indonesian",
"sm",
"한",
"khmer",
"bul",
"pas",
"far",
"armenian",
"ไทย",
"fi",
"english",
"liet",
"romanian",
"russian",
"tür",
"සිං",
"cas",
"castellano",
"castilian",
}
language_codes = {
"bosnian": "bs",
"ro": "ro",
"swedish": "sv",
"mac": "mk",
"tr": "tr",
"rw": "rw",
"ind": "id",
"czech": "cs",
"nl": "nl",
"he": "he",
"lithuanian": "lt",
"sāmo": "sm",
"nor": "no",
"རྫོང": "dz",
"ger": "de",
"azə": "az",
"shq": "sq",
"lat": "lv",
"cze": "cs",
"hu": "hu",
"danish": "da",
"hy": "hy",
"mag": "mk",
"ms": "ms",
"tajik": "tg",
"پښت": "ps",
"kaz": "kk",
"mk": "mk",
"vietnamese": "vi",
"sk": "sk",
"бъл": "bg",
"ps": "ps",
"lt": "lt",
"cs": "cs",
"mongolian": "mn",
"jap": "ja",
"geo": "ka",
"ko": "ko",
"dan": "da",
"dzongkha": "dz",
"th": "th",
"norwegian": "no",
"az": "az",
"mt": "mt",
"por": "pt",
"kala": "kl",
"sin": "si",
"ja": "ja",
"pol": "pl",
"is": "is",
"nepali": "ne",
"việt": "vi",
"тоҷ": "tj",
"amh": "am",
"irish": "ga",
"chinese": "zh",
"pl": "pl",
"қаз": "kk",
"maltese": "mt",
"tg": "tg",
"arabic": "ar",
"ລາວ": "lo",
"khm": "km",
"ukr": "uk",
"hin": "hi",
"am": "am",
"ne": "ne",
"føroy": "fo",
"et": "et",
"macedonian": "mk",
"polish": "pl",
"ita": "it",
"tur": "tr",
"ქართული": "ka",
"gre": "el",
"spa": "es",
"বেঙ্গ": "bn",
"عرب": "ar",
"kyr": "ky",
"rus": "ru",
"bs": "bs",
"si": "si",
"sr": "sr",
"belarusian": "be",
"kl": "kl",
"my": "my",
"bel": "be",
"o'zb": "uz",
"бел": "be",
"नेप": "ne",
"sam": "sm",
"albanian": "sq",
"faroese": "fo",
"turkish": "tr",
"spanish": "es",
"da": "da",
"georgian": "ka",
"malay": "ms",
"km": "km",
"divehi": "dv",
"greek": "el",
"فارسی": "fa",
"iri": "fa",
"bengali": "bn",
"melay": "ms",
"ben": "bn",
"mn": "mn",
"id": "id",
"монгол": "mn",
"kin": "rw",
"portuguese": "pt",
"dutch": "nl",
"ar": "ar",
"de": "de",
"icelandic": "is",
"bg": "bg",
"slov": "sk",
"hi": "hi",
"norsk": "no",
"est": "et",
"viet": "vi",
"dz": "dz",
"rom": "ro",
"kyrgyz": "ky",
"fran": "fr",
"chi": "zh",
"ka": "ka",
"malaysian": "ms",
"fa": "fa",
"vi": "vi",
"catalan": "ca",
"ser": "sr",
"ru": "ru",
"indo": "id",
"fo": "fo",
"pt": "pt",
"mal": "ms",
"burmese": "my",
"kor": "ko",
"ga": "ga",
"korean": "ko",
"fin": "fi",
"lit": "lt",
"amharic": "am",
"nep": "ne",
"dzo": "dz",
"italian": "it",
"heb": "he",
"be": "be",
"bulgarian": "bg",
"eest": "et",
"укр": "uk",
"አማ": "am",
"ísl": "is",
"el": "el",
"lv": "lv",
"turkmen": "tk",
"日": "ja",
"bur": "my",
"हिं": "hi",
"עבר": "he",
"tha": "th",
"taj": "tg",
"мак": "mk",
"sq": "sq",
"uk": "uk",
"bos": "bs",
"sven": "sv",
"slo": "sk",
"japanese": "ja",
"hun": "hu",
"french": "fr",
"esp": "es",
"serbian": "sr",
"croatian": "hr",
"türkmen": "tk",
"alb": "sq",
"kal": "kl",
"uz": "uz",
"mla": "ms",
"eng": "en",
"german": "de",
"ខ្មែរ": "km",
"hebrew": "he",
"ice": "is",
"cro": "hr",
"mon": "mn",
"ελλ": "el",
"sinhalese": "si",
"рус": "ru",
"lo": "lo",
"fr": "fr",
"ca": "ca",
"sv": "sv",
"uzbek": "uz",
"aze": "az",
"հայ": "hy",
"ara": "ar",
"hindi": "hi",
"မြန်": "my",
"kalaallisut": "kl",
"es": "es",
"it": "it",
"kazakh": "kk",
"kk": "kk",
"slovak": "sk",
"per": "fa",
"sl": "sl",
"suom": "fi",
"češ": "cs",
"hungarian": "hu",
"finnish": "fi",
"thai": "th",
"zh": "zh",
"hr": "hr",
"ky": "ky",
"arm": "hy",
"slovene": "sl",
"persian": "fa",
"cat": "ca",
"bn": "bn",
"ukrainian": "uk",
"ދިވެ": "dv",
"sve": "sv",
"div": "dv",
"fre": "fr",
"кыргыз": "ky",
"uzb": "uz",
"estonian": "et",
"kinyarwanda": "rw",
"hrv": "hr",
"no": "no",
"pashto": "ps",
"azerbaijani": "az",
"gae": "ga",
"latvian": "lv",
"du": "nl",
"en": "en",
"ned": "nl",
"срп": "sr",
"samoan": "sm",
"中": "zh",
"tk": "tk",
"dv": "dv",
"lao": "lo",
"indonesian": "id",
"sm": "sm",
"한": "ko",
"khmer": "km",
"bul": "bg",
"pas": "ps",
"far": "fa",
"armenian": "hy",
"ไทย": "th",
"fi": "fi",
"english": "en",
"liet": "lt",
"romanian": "ro",
"russian": "ru",
"tür": "tr",
"සිං": "si",
"cas": "es",
"castellano": "es",
"castilian": "es",
}
def extract_unicode_flags(text):
flag_pattern = re.compile(r"[\U0001F1E6-\U0001F1FF]{2}")
flags = flag_pattern.findall(text)
return flags
def find_languages_in_string(s: str) -> set:
pattern = r"\b(?:" + "|".join(re.escape(word) for word in langsSet) + r")\b"
flags = " ".join([find_language_by_unicode(flag) for flag in extract_unicode_flags(s)])
swf = f"{s} {flags}"
matches = re.findall(pattern, swf.lower())
matches = [language_codes.get(match) for match in matches]
return set(matches)