Нормализация входящих кодов
Как превратить кучу несогласованных кодов от интеграции в канонические.
Цель: интеграция шлёт вам 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']
Три строки в вашей базе, один язык.
Далее
- Aliases and Normalisation — правила, стоящие за этим