Плюрализация и контекстные переводы

Основы локализации

В современных веб-приложениях важную роль играет поддержка разных языков и культурных особенностей. 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

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}`;
}

Выводы по архитектуре

  • Mithril позволяет легко интегрировать локализацию благодаря своей компонентной структуре.
  • Использование Intl.PluralRules обеспечивает корректную плюрализацию для разных языков.
  • Контекстные ключи предотвращают неоднозначность переводов.
  • Глобальные функции перевода или контекстные props позволяют управлять языком приложения динамически, не нарушая структуру компонентов.

Такой подход позволяет строить масштабируемые приложения с поддержкой множества языков и сложных правил склонения слов, сохраняя при этом легкость и скорость Mithril.