mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 17:14:59 +03:00
Интерфейс был русским в коде: строки лежали прямо в JSX и в ответах API, даты форматировались прибитым «ru-RU», склонение по числу писалось руками в каждом файле. Теперь текста в коде нет — он живёт в словарях, а язык выбирается человеком. Цепочка одна на обе стороны: профиль сотрудника → организация → установка → браузер. Пустое значение на каждом уровне значит «как выше», а не «русский»: тот, кто язык не трогал, поедет за организацией, когда владелец её переключит, а выбравший явно — останется на своём. Владелец задаёт язык организации («Настройки» → «Организация», рядом с часовым поясом) и язык установки («Платформа») — на нём открываются вход, сброс пароля и мастер первого запуска. Сотрудник переопределяет его в профиле. Русский каталог задаёт набор ключей, английский обязан его повторить: во фронтенде это ловит tsc — пропущенный перевод становится ошибкой сборки, — на бэкенде тест каталога, который заодно сверяет имена параметров в фразах. Формы множественного числа берутся из CLDR через Intl.PluralRules, даты и размеры — через Intl, а не через свои списки месяцев. Отдельно пришлось разобраться с тем, что уже записано в базу. Системные события диалога писались готовой русской фразой, и перевести историю задним числом нельзя — теперь пишется код события, а фразу собирает сервер на языке читателя. То же с уведомлениями: они адресованы операторам, а не одному человеку, и в смешанной команде готовая фраза неверна для половины. Тон системной строки в треде и признак анонимного посетителя больше не угадываются регуляркой по русским словам: под английским бэкендом это просто перестало бы работать. Письма уходят на языке получателя, а не отправителя: приглашение отправляет владелец, а читает другой человек. gettext не взят намеренно: .po/.mo потребовали бы msgfmt в сборке образа ради того же результата, что дают обычные словари, одинаковые на обеих сторонах. Язык запроса при этом активируется штатным механизмом Django, поэтому сообщения DRF переводятся тоже. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>