chwellofficial/nt360Slides
0
1"""2Map presentation UI language strings (LanguageType enum values from Next.js) to3Tesseract / LiteParse OCR language codes (ISO 639-3 where applicable).4 5Keep keys in sync with:6servers/nextjs/app/(presentation-generator)/upload/type.ts → LanguageType7"""8 9from __future__ import annotations10 11import re12from typing import Optional13 14# Values must match `LanguageType` string literals in the upload UI.15PRESENTATION_LANGUAGE_TO_TESSERACT: dict[str, str] = {16 "English": "eng",17 "Spanish (Español)": "spa",18 "French (Français)": "fra",19 "German (Deutsch)": "deu",20 "Portuguese (Português)": "por",21 "Italian (Italiano)": "ita",22 "Dutch (Nederlands)": "nld",23 "Russian (Русский)": "rus",24 "Chinese (Simplified - 中文, 汉语)": "chi_sim",25 "Chinese (Traditional - 中文, 漢語)": "chi_tra",26 "Japanese (日本語)": "jpn",27 "Korean (한국어)": "kor",28 "Arabic (العربية)": "ara",29 "Hindi (हिन्दी)": "hin",30 "Bengali (বাংলা)": "ben",31 "Polish (Polski)": "pol",32 "Czech (Čeština)": "ces",33 "Slovak (Slovenčina)": "slk",34 "Hungarian (Magyar)": "hun",35 "Romanian (Română)": "ron",36 "Bulgarian (Български)": "bul",37 "Greek (Ελληνικά)": "ell",38 "Serbian (Српски / Srpski)": "srp",39 "Croatian (Hrvatski)": "hrv",40 "Bosnian (Bosanski)": "bos",41 "Slovenian (Slovenščina)": "slv",42 "Finnish (Suomi)": "fin",43 "Swedish (Svenska)": "swe",44 "Danish (Dansk)": "dan",45 "Norwegian (Norsk)": "nor",46 "Icelandic (Íslenska)": "isl",47 "Lithuanian (Lietuvių)": "lit",48 "Latvian (Latviešu)": "lav",49 "Estonian (Eesti)": "est",50 "Maltese (Malti)": "mlt",51 "Welsh (Cymraeg)": "cym",52 "Irish (Gaeilge)": "gle",53 "Scottish Gaelic (Gàidhlig)": "gla",54 "Ukrainian (Українська)": "ukr",55 "Hebrew (עברית)": "heb",56 "Persian/Farsi (فارسی)": "fas",57 "Turkish (Türkçe)": "tur",58 "Kurdish (Kurdî / کوردی)": "kmr",59 "Pashto (پښتو)": "pus",60 "Dari (دری)": "prs",61 "Uzbek (Oʻzbek)": "uzb",62 "Kazakh (Қазақша)": "kaz",63 "Tajik (Тоҷикӣ)": "tgk",64 "Turkmen (Türkmençe)": "tuk",65 "Azerbaijani (Azərbaycan dili)": "aze",66 "Urdu (اردو)": "urd",67 "Tamil (தமிழ்)": "tam",68 "Telugu (తెలుగు)": "tel",69 "Marathi (मराठी)": "mar",70 "Punjabi (ਪੰਜਾਬੀ / پنجابی)": "pan",71 "Gujarati (ગુજરાતી)": "guj",72 "Malayalam (മലയാളം)": "mal",73 "Kannada (ಕನ್ನಡ)": "kan",74 "Odia (ଓଡ଼ିଆ)": "ori",75 "Sinhala (සිංහල)": "sin",76 "Nepali (नेपाली)": "nep",77 "Thai (ไทย)": "tha",78 "Vietnamese (Tiếng Việt)": "vie",79 "Lao (ລາວ)": "lao",80 "Khmer (ភាសាខ្មែរ)": "khm",81 "Burmese (မြန်မာစာ)": "mya",82 "Tagalog/Filipino (Tagalog/Filipino)": "tgl",83 "Javanese (Basa Jawa)": "jav",84 "Sundanese (Basa Sunda)": "sun",85 "Malay (Bahasa Melayu)": "msa",86 "Mongolian (Монгол)": "mon",87 "Swahili (Kiswahili)": "swa",88 "Hausa (Hausa)": "hau",89 "Yoruba (Yorùbá)": "yor",90 "Igbo (Igbo)": "ibo",91 "Amharic (አማርኛ)": "amh",92 "Zulu (isiZulu)": "zul",93 "Xhosa (isiXhosa)": "xho",94 "Shona (ChiShona)": "sna",95 "Somali (Soomaaliga)": "som",96 "Basque (Euskara)": "eus",97 "Catalan (Català)": "cat",98 "Galician (Galego)": "glg",99 "Quechua (Runasimi)": "que",100 "Nahuatl (Nāhuatl)": "nah",101 "Hawaiian (ʻŌlelo Hawaiʻi)": "haw",102 "Maori (Te Reo Māori)": "mri",103 # No dedicated Tahitian traineddata in default Tesseract bundles.104 "Tahitian (Reo Tahiti)": "eng",105 "Samoan (Gagana Samoa)": "smo",106}107 108_LOWER_MAP = {k.lower(): v for k, v in PRESENTATION_LANGUAGE_TO_TESSERACT.items()}109 110_OCR_CODE_RE = re.compile(r"^[a-zA-Z0-9_,+]+$")111 112 113def presentation_language_to_ocr_code(language: Optional[str]) -> str:114 """Resolve UI language label to a Tesseract language code; default English."""115 if language is None:116 return "eng"117 s = str(language).strip()118 if not s:119 return "eng"120 if s in PRESENTATION_LANGUAGE_TO_TESSERACT:121 code = PRESENTATION_LANGUAGE_TO_TESSERACT[s]122 else:123 code = _LOWER_MAP.get(s.lower(), "eng")124 if not _OCR_CODE_RE.fullmatch(code):125 return "eng"126 return code127 