В современных веб-приложениях важную роль играет поддержка разных языков и культурных особенностей. Mithril как легковесный фреймворк не включает встроенной системы интернационализации, однако его архитектура позволяет эффективно интегрировать сторонние библиотеки и реализовывать собственные механизмы локализации.
Основная задача локализации состоит в двух компонентах: перевод строк и правильная форма чисел и существительных в зависимости от количества. Это особенно важно для языков с сложной системой склонений и множества форм слова в зависимости от числительного.
Плюрализация — это процесс выбора правильной формы слова в
зависимости от числительного. В JavaScript для этого обычно используются
библиотеки вроде Intl.PluralRules или
messageformat. Mithril, как библиотека для построения UI,
позволяет динамически применять формы слов при рендеринге
компонентов.
Пример использования
Intl.PluralRules:
const pluralRules = new Intl.PluralRules('ru-RU');
const messages = {
one: 'сообщение',
few: 'сообщения',
many: 'сообщений',
};
function getMessage(count) {
const rule = pluralRules.select(count);
switch (rule) {
case 'one': return `${count} ${messages.one}`;
case 'few': return `${count} ${messages.few}`;
default: return `${count} ${messages.many}`;
}
}
// Внутри компонента Mithril
const MessageList = {
view: () => m('div', getMessage(5))
};
В этом примере Intl.PluralRules автоматически выбирает
нужное склонение для русского языка, а компонент Mithril рендерит строку
с правильной формой слова.
Контекстные переводы позволяют различать слова, которые в разных ситуациях имеют разный смысл. Например, слово «ключ» может означать физический предмет или элемент данных. Для этого в системах локализации используют ключи с контекстом, чтобы не было неоднозначности.
Структура словаря с контекстом:
const translations = {
'key|physical': 'ключ',
'key|data': 'ключ доступа'
};
function t(key, context) {
return translations[`${key}|${context}`] || key;
}
// Использование в компоненте Mithril
const KeyComponent = {
view: () => m('div', t('key', 'data'))
};
Контекст обеспечивает точность перевода и позволяет масштабировать систему локализации без коллизий между разными значениями одного слова.
Mithril работает с виртуальным DOM и компонентами, что делает локализацию гибкой. Любой компонент может получать функции перевода через props или через глобальный контекст. Это позволяет динамически менять язык приложения и поддерживать сложные правила плюрализации и контекстные переводы.
Пример глобальной функции перевода через контекст:
const i18n = {
locale: 'ru-RU',
messages: {
'en': { 'apple': 'apple' },
'ru': { 'apple': 'яблоко' }
},
t(key) {
return this.messages[this.locale][key] || key;
}
};
const AppleComponent = {
view: () => m('div', i18n.t('apple'))
};
Для более сложных сценариев можно комбинировать плюрализацию и контекстные переводы, формируя строки на лету в зависимости от числа и ситуации.
function tPlural(key, count, context) {
const pluralForms = translations[key]?.[context];
const rule = new Intl.PluralRules('ru-RU').select(count);
return `${count} ${pluralForms?.[rule] || key}`;
}
Intl.PluralRules обеспечивает корректную
плюрализацию для разных языков.Такой подход позволяет строить масштабируемые приложения с поддержкой множества языков и сложных правил склонения слов, сохраняя при этом легкость и скорость Mithril.