File size: 1,418 Bytes
582520a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
"""Language detection helpers."""

from __future__ import annotations

from langdetect import DetectorFactory, detect
from langdetect.lang_detect_exception import (
    LangDetectException,
)

DetectorFactory.seed = 0

SUPPORTED = {"en", "fr", "ru"}

_FALLBACK_HINTS = {
    "fr": (
        "bonjour",
        "merci",
        "prix",
        "rendez-vous",
        "horaire",
        "livraison",
        "devis",
    ),
    "ru": (
        "привет",
        "спасибо",
        "цена",
        "доставка",
        "запись",
        "стоимость",
        "здравствуйте",
    ),
}


def detect_language(text: str, default: str = "en") -> str:
    """Detect message language among en/fr/ru."""
    cleaned = (text or "").strip()
    if not cleaned:
        return default

    lowered = cleaned.lower()
    for lang, hints in _FALLBACK_HINTS.items():
        if any(h in lowered for h in hints):
            return lang

    try:
        code = detect(cleaned)
    except LangDetectException:
        return default

    if code.startswith("ru"):
        return "ru"
    if code.startswith("fr"):
        return "fr"
    if code.startswith("en"):
        return "en"
    return default


def normalize_ui_language(code: str) -> str:
    """Clamp UI language to supported codes."""
    value = (code or "en").lower()[:2]
    return value if value in SUPPORTED else "en"