@coverpixi/plugin-i18n
v0.1.0
Published
Локализация: словари, подстановки и склонения через Intl
Maintainers
Readme
@coverpixi/plugin-i18n
Локализация для игр на Coverpixi:
словари, подстановки и склонения через Intl.
npx coverpixi add i18nИспользование
ctx.i18n.t('menu.play') // «Играть»
ctx.i18n.t('menu.best', { score: 1234 }) // «Лучший счёт: 1234»
ctx.i18n.plural('coins', 3) // «3 монеты» / «3 coins»
ctx.i18n.number(1234.5) // разряды по правилам языкаФормы множественного числа выбирает Intl.PluralRules, поэтому правила языка
не приходится держать в голове: в словаре лежат ключи one, few, many,
other, а нужный подставляется сам.
{
"coins": { "one": "{count} монета", "few": "{count} монеты", "many": "{count} монет" }
}Отсутствующий ключ возвращается как есть и попадает в консоль. Пустая строка на экране — худший из возможных ответов: её замечают в сторе, а не в отладке.
Словари
Собирает их игра, а не пакет: глоб внутри пакета искал бы файлы в
node_modules, и своих языков у игры быть не могло бы.
// coverpixi.config.ts
i18n: {
dictionaries: import.meta.glob('./src/locales/*.json', { eager: true, import: 'default' }),
locale: 'ru',
fallback: 'en',
followPlatform: true,
}Имя языка берётся из имени файла: ru.json → ru. Добавить язык — положить
файл рядом, больше ничего.
Выбор языка
По убыванию достоверности: что игрок выбрал сам → на каком языке открыта площадка → язык браузера → значение из конфига.
Площадка важнее браузера: игрок мог зайти на ru-домен Яндекса из системы с
английской локалью, и интерфейс игры должен совпасть с интерфейсом вокруг.
Связь необязательная — без плагина площадок язык возьмётся из браузера.
Смена языка на лету
Требует пересобрать экран — ровно как и смена темы: компоненты читают строки при создании.
if (ctx.i18n.setLocale('en')) void ctx.screens.goTo(ctx.screens.active)Сквозного хука в Text намеренно нет: он создавал бы видимость живого перевода
и ломался бы на всём, что склеено из нескольких кусков, — а таких строк в игре
большинство.
Лицензия
MIT
