Строки интерфейса
Весь текст лежит в
src/i18n/ru.ts. В компонентах остались только вызовыt('ключ').
Как устроено
Русская локаль — эталонная: типы ключей выведены из неё. Поэтому пропущенный ключ в новом переводе будет ошибкой компиляции, а не пустотой на экране.
Подстановки пишутся как {имя}:
ts
'home.addBlock': 'Добавить {minutes} минут: {title}',Множественное число
По-настоящему между языками отличается только оно. В русском три формы, в английском две, поэтому длину массива форм и правило выбора задаёт сама локаль, а не общий тип:
ts
block: ['блок', 'блока', 'блоков'],Правило: одиннадцать–четырнадцать всегда третья форма; кончается на 1 — первая; на 2–4 — вторая; иначе третья.
Есть отдельная таблица NOTE_UNITS (src/achievements/note.ts), которая привязывает числовые подстановки шаблонов достижений к словам: у всех семи «серий» шаблон один, а число приходит из реестра.
Как добавить английский
Нужен ровно один файл en.ts с теми же ключами, своими формами множественного числа и своим правилом выбора формы. Язык берётся из initDataUnsafe.user.language_code; переключатель в интерфейсе не нужен.
Что не переводится намеренно
- Подписи на обоях (
HIGH,MEDIUM,LOW,CHARGING) — часть оформления из референсов, а не текст интерфейса. - Названия устройств в выборе размера обоев.
- Сообщения
console.warn— они для разработчика.
Правило про ошибки
Ошибки разбора копии данных несут ключ строки, а не готовый текст. Сообщение видит пользователь, значит переводит его тот, кто рисует, а не слой хранения.
Строки — ещё и опора для тестов и скриншотов
Из ru.ts берут подписи:
- тип
AchievementId— он выводится из ключейach.*, поэтому опечатка в идентификаторе достижения не компилируется; - скриншот-харнесс — локаторы Playwright ищут элементы по тем же строкам. Переименовали строку — скрипт падает на отсутствующем ключе, а не снимает молча не тот экран;
- справочник достижений в этой документации.
Из этого следует правило: переименование строки — это не косметика. После него надо прогнать npm test и npm run docs:shots.