@yandex/i18n

i18n made with love to tanker

Usage no npm install needed!

<script type="module">
  import yandexI18n from 'https://cdn.skypack.dev/@yandex/i18n';
</script>

README

I18N

Интерфейс для локализации текста с динамическими параметрами и плюрализацией.

Создание словарей переводов

Файлы с переводами лежат рядом с кодом, к которому они логически относятся.

src/features/FeatureName
├── FeatureName.i18n — файлы переводов
│   ├── ru.ts — словарь для русского языка
│   ├── en.ts — словарь для английского языка
│   └── index.ts — словарь используемых языков

Файл словаря — модуль, в котором лежит кейсет для одного языка с парами { ключ, перевод }:

// FeatureName/FeatureName.i18n/en.ts
export const en = {
    Пока: 'Bye',
    Привет: 'Example',
};

Все языки должны быть зарегистрированы в словаре. Этим словарем оперирует сам модуль I18N.

// FeatureName/FeatureName.i18n/index.ts
export * from './ru';
export * from './en';

Использование

// FeatureName/FeatureName.ts
import i18n from '@yandex-int/i18n';

import * as keyset from './FeatureName.i18n';

const exampleI18N = i18n(keyset);
exampleI18N('Привет');

Параметризация

Параметры объявляются в синтаксисе схожем с параметрами для template strings.

// FeatureName/FeatureName.i18n/en.ts
export const en = {
    'м. {metro}': 'subway {metro}',
}
// FeatureName/FeatureName.ts
import i18n from '@yandex-int/i18n';

import * as keyset from './FeatureName.i18n';

const exampleI18N = i18n(keyset);

exampleI18N('м. {metro}', {
    metro: 'Парк Культуры',
});

Плюрализация

Для выражения плюрализация существует специальный параметр count. Который соотносится с вариантами написания ключа через вложенные параметры: many, some, one, none.

// FeatureName/FeatureName.i18n/en.ts
export const en = {
    '{count} оценка': {
        many: '{count} оценок',
        none: 'нет оценок',
        one: '{count} оценка',
        some: '{count} оценки',
    }
}
// FeatureName/FeatureName.ts
import i18n from '@yandex-int/i18n';

import * as keyset from './FeatureName.i18n';

const exampleI18N = i18n(keyset);

exampleI18N('{count} оценка', {
    count: 2,
});

Интеграция с компонентами

// FeatureName/FeatureName.i18n/en.ts
export const en = {
    'OOO «{link}»': 'LLC {link}',
    'ЯНДЕКС': 'YANDEX',
}
// FeatureName/FeatureName.tsx
import i18n, { i18nRaw } from '@yandex-int/i18n';

import * as keyset from './FeatureName.i18n';

const exampleI18NRaw = i18nRaw(keyset);
const exampleI18N = i18n(keyset);

exampleI18NRaw('OOO «{link}»', {
    link: <Link url="#">{exampleI18N('ЯНДЕКС')}</Link>
});

Синхронизация с Танкером

Для синхронизаций с Танкером используйте набор хелперов для tanker-kit из пакета @yandex-int/tanker-helpers