Главная/Рецепты/Нормализация входящих кодов ENУКРРУС API-справочник (ReDoc) ↗

Нормализация входящих кодов

Как превратить кучу несогласованных кодов от интеграции в канонические.

Цель: интеграция шлёт вам pt_BR, POR-BR, zh_hans, iw, xx-YY. Вам нужны канонические коды и список того, что не удалось распознать — без провайдера в картине.

/v1/normalize отвечает именно на это, и неизвестный код здесь не ошибка:

curl "https://languages.service.custom.mt/v1/normalize?language=ZH_HANS"
{ "query": "ZH_HANS", "known": true, "matched_alias": "zh-hans",
  "language": { "code": "zh-CN", "name": "Chinese (Simplified)",
                "kind": "regional", "base_language_code": "zh",  } }
curl "https://languages.service.custom.mt/v1/normalize?language=xx-YY"
{ "query": "xx-YY", "language": null, "matched_alias": null, "known": false }

Оба раза 200. Это намеренно: классифицировать список за один проход лучше, чем ловить 404 в цикле.

Чистка всего списка

def classify(codes: list[str]) -> tuple[dict[str, str], list[str]]:
    """Возвращает {вход: канонический} и список кодов, которые не удалось распознать."""
    canonical, unknown = {}, []
    for code in codes:
        body = httpx.get(f"{BASE}/v1/normalize", params={"language": code}).json()
        if body["known"]:
            canonical[code] = body["language"]["code"]
        else:
            unknown.append(code)
    return canonical, unknown

Список unknown — это тот результат, с которым можно что-то делать: каждая запись — либо опечатка на их стороне, либо отсутствующий алиас на нашей. Настоящие добавьте из админки — см. Добавить язык.

Хранение канонического кода

Храните language.code, а не сырой ввод. Именно это делает две записи сравнимыми: проект, сохранённый как pt_BR, и проект как por-br — это тот же язык, но без нормализации вы этого не узнаете.

Держите и сырое значение, если нужно отвечать им интеграции.

Поиск дубликатов, которые у вас уже есть

canonical, _ = classify(existing_codes)
from collections import Counter

for code, count in Counter(canonical.values()).items():
    if count > 1:
        print(f"{code}: {[k for k, v in canonical.items() if v == code]}")
# zh-CN: ['zh_hans', 'zh-CN', 'CHS']

Три строки в вашей базе, один язык.

Далее