Локализация приложений
Разработчики приложений хорошо знают, что такое локализация программного обеспечения и L10n (Localization: L, N и 10 букв между ними). Обычно локализация выглядит как набор ключей и значений на разных языках. Например:lang["ru"]["name_of_label"] = "Название лейбла";lang["en"]["name_of_label"] = "Label name";
Работает это просто: в зависимости от выбранного языка пользователь видит соответствующий перевод в интерфейсе.
В работе над приложением Streaklane, целевая аудитория которого довольно широкая - от детей до топ-менеджеров, мне пришла в голову мысль: а что если файл локализации привязывать не только к языку, но и к возрасту, уровню цифровой грамотности, роли или другим характеристикам пользователя?
Например, интерфейс для ребенка дошкольного возраста может быть более визуальным и строиться вокруг эмодзи и простых слов. Для пользователя, которому не близки технические термины, можно использовать более понятные формулировки. Для подростка - более живой и неформальный стиль. Для профессионала - более точные и компактные термины.
Технически эта идея уже вполне реализуема на уровне i18n. Если локализация умеет учитывать множественное число, склонения, род и другие параметры, значит, можно добавить еще один слой - пользовательский профиль:
lang["ru"]["child"]["start_button"] = "🚀 Поехали!";lang["ru"]["teen"]["start_button"] = "Погнали";lang["ru"]["adult"]["start_button"] = "Начать";lang["ru"]["senior"]["start_button"] = "Начать работу";lang["ru"]["expert"]["start_button"] = "Инициализировать трек";
На практике я бы реализовывал это не как жесткую привязку к возрасту, а как дополнительный контекст локализации. Например: язык = ru, профиль = simple, playful, standard, expert. Возраст можно использовать только как стартовую настройку, а пользователю лучше дать возможность самому выбрать стиль интерфейса.
В i18next для этого можно использовать механизм context. Тогда один и тот же ключ будет иметь разные варианты в зависимости от переданного профиля:t("start_button", { context: "child" });t("start_button", { context: "expert" });
В ICU MessageFormat похожую задачу можно решить через select, то есть через выбор варианта сообщения по параметру:{profile, select, child {🚀 Поехали!} teen {Погнали} expert {Инициализировать трек} other {Начать}}
В Mozilla Fluent для этого есть selectors. Они позволяют описать несколько вариантов одной строки и выбрать нужный вариант по внешней переменной:start-button = { $profile -> [child] 🚀 Поехали! [teen] Погнали [expert] Инициализировать трек *[other] Начать }