Когда перевод ломает капитализацию: история про русские аббревиатуры

Работаю над Trend Analysis — проектом, который собирает, анализирует и показывает тренды из разных источников. Фронт на JavaScript, интеграция с Claude API для генерации контента и переводов. Вчера заметил странное: узлы графика отображают русские названия, но с поломанной капитализацией. “Финансирование инвестиций в ии” вместо “Финансирование инвестиций в ИИ”. Данные приходят от бэкенда корректно — проблема на клиенте.
Начал искать виновника. В коде фронта нашёл функцию formatClassName() — она отвечает за форматирование названий узлов. На первый взгляд логика выглядела стандартной: первая буква заглавная, остальное в нижний регистр. Но тут же понял подвох. Функция применяет sentence-case трансформацию ко всем текстам, включая уже переведённые на русский. Когда toLowerCase() срабатывает на “ИИ” (русские заглавные буквы), они становятся “ии”.
Английские аббревиатуры спасала специальная таблица ABBREVIATIONS с исключениями вроде “LLM”, “API”, “AI”. Но русских аббревиатур там не было. США, ЕС, ИИ — всё падало жертвой функции.
Решение нашлось через детектирование языка прямо в formatClassName(). Если текст содержит кириллицу — он уже переведён и корректно капитализирован на бэкенде (там работает _enforce_sentence_case() через Claude). Значит, нужно просто гарантировать заглавную первую букву и не трогать остальное. Английский текст обрабатывается по старой логике с ABBREVIATIONS.
Итог: добавил регулярное выражение для проверки на non-ASCII символы. Non-ASCII текст — минимальная обработка (только первая буква). ASCII текст — полная sentence-case логика. Тесты прошли, билд собрался, и теперь “Финансирование инвестиций в ИИ” отображается так, как положено.
Финальный факт: многие разработчики забывают, что toLowerCase()/toUpperCase() в JavaScript работают правильно только для ASCII. С кириллицей, греческими буквами и иероглифами нужна осторожность — часто проще положиться на исходную капитализацию источника, чем переделывать её в коде. 😄
Метаданные
- Session ID:
- grouped_trend-analisis_20260304_0545
- Branch:
- fix/crawler-source-type
- Dev Joke
- Почему pip пошёл к врачу? У него были проблемы с производительностью