Как я прикручивал английский к своему боту TG Notion
Решил я как-то, что моему боту TG Notion пора заговорить по-английски. Казалось бы — чего сложного? Перевёл строки, добавил кнопку, готово.
Ага, щас.
В итоге я три дня чинил то, что не должно было ломаться, и чуть не поседел. Но по порядку.
Первый затык — кнопка
Сначала сделал просто: в шапку добавил кнопку EN/RU. Нажал — язык поменялся. Красота.
Но когда перезапустил Mini App — текст кнопки сбросился на EN, хотя интерфейс остался английским. То есть язык поменялся, а кнопка об этом забыла.
Оказалось, я забыл обновлять текст кнопки при загрузке. Мелочь, но полчаса жизни она мне сожрала.
Все строки через t()
Дальше встал вопрос: как переводить всё это хозяйство? Захардкодить английский в HTML? Нет, нужен был нормальный подход.
Сделал словарь translations для двух языков и функцию t(key), которая достаёт нужную строку. Все тексты в интерфейсе — только через t().
И всё, что видит пользователь, теперь идёт через t('...'). Кнопки, плейсхолдеры, ошибки, пустые состояния.
Бэкенд тоже надо переводить
Думал, что на этом всё. Хуй там.
Оказалось, что inline-карточки досок генерируются на сервере, а не в Mini App. И если в Mini App язык сменился, сервер об этом знать не знает. Поэтому карточки в чате оставались на русском.
Пришлось и на бэкенде делать переводы. Добавил getLang() и те же ключи.
Теперь кнопки в карточках зависят от языка. Но тут вылезла новая залупа.
Синхронизация языка
Проблема: юзер в Mini App выбрал английский, а бэкенд смотрит только на язык Telegram. Если в Telegram русский, а в Mini App английский — карточки всё равно русские.
Решение — сохранять выбранный язык в базу. При переключении в Mini App отправляем язык на сервер, а бэкенд при генерации карточек берёт его из базы.
После этого язык в Mini App и в карточках наконец совпал.
Склонение — отдельная боль
Казалось бы, всё готово. Но остался пустяк: счётчик заметок.
«1 заметок», «3 заметок» — звучит как говно. Для русского нужны склонения: заметка, заметки, заметок. Для английского проще: note/notes.
Убил на это ещё час. Зато теперь «1 заметка», «2 заметки», «5 заметок» — как надо.
Итог
Локализация готова. Теперь TG Notion говорит на двух языках, сохраняет выбор и не путается в склонениях.
Но самое главное — я понял: перевод — это не «поменял строки», а целый слой архитектуры. Особенно когда у тебя фронт, бэкенд и база.
Если интересно посмотреть на код или пощупать бота:
Бот: https://t.me/Telega_notion_bot
Репозиторий: https://github.com/Elrick-from-Malnibone/tg-notion-node
Заходите, тестируйте, ломайте. Всё в открытом доступе.













