Сегодня сделаем с вами обзор библиотеки по локализации — slang. Многие из вас наверняка слышали про .arb и работали с intl, но про slang, возможно, вы слышите впервые.
Что же это такое?
Это библиотека для генерации локализаций. У нее есть ряд существенных преимуществ по сравнению с intl.
Давайте по порядку!
Генерация
Slang поддерживает больше форматов, чем intl: JSON, YAML, ARB и CSV.
Код генерируется командой:
dart run slang
Также можно использовать build_runner, если добавить дополнительный пакет slang_build_runner.
Перед генерацией необходимо создать конфигурационные файлы — slang.yaml или build.yaml. Они во многом похожи на l10n.yaml, но позволяют настроить больше параметров.
Поддержка placeholders
Здесь все стандартно: plural, gender. Но кроме placeholders так же есть возможность работы с links, richText.
{
"user": {
"messageCount": {
"one": "У тебя 1 сообщение",
"other": "У тебя {count} сообщений"
}
}
}Получаем
t.user.messageCount(count: 5);
Типобезопасность
Библиотека устойчива к ошибкам: опечатки или пропущенные аргументы невозможны,
так как все ключи и параметры проверяются на этапе компиляции.
Если ключа нет — компилятор не даст собрать проект.
Поддержка Flutter
Пакет slang_flutter предоставляет провайдер для управления локалями в проекте.
Можно легко переключать язык в рантайме, получать переводы через контекст
context.t и использовать ленивую инициализацию делегатов.CLI-команды
Библиотека предоставляет набор CLI-команд:
dart run slang # генерация файлов локализации
dart run slang analyze # поиск неиспользуемых и отсутствующих переводов
dart run slang normalize # сортировка переводов по базовой локали
dart run slang configure # автообновление CFBundleLocalizations
dart run slang edit move loginPage authPage # переименование или перенос ключей
dart run slang migrate arb src.arb dest.json # миграция из arb в json
Runtime overrides
Slang поддерживает runtime overrides — вы можете менять переводы на лету, без пересборки приложения.
Несколько замечаний:
✔️Переопределения могут быть частичными – обновляются только указанные ключи
✔️Повторное переопределение заменяет предыдущее
✔️Новые переводы анализируются, но не активируются
✔️Плейсхолдеры (
name) остаются без изменений❕Не стоит сразу бросаться внедрять slang во все проекты. Он может быть избыточен для небольших проектов, у него сложнее конфигурация, чем у intl. У вас
могут возникнуть сложности при работе с многомодульными проектами, где нужно объединять переводы из разных пакетов. Также типобезопасность делает невозможным использование динамических ключей, что в некоторых сценариях может ограничивать гибкость.Я лишь представила краткий обзор в этом посте, для подробной информации — посетите библиотеку.
