В разработке современных веб-приложений важным аспектом является поддержка многоязычности. Во многих случаях приложения должны поддерживать не только текстовые строки, но и учитывать особенности перевода, такие как склонения, род, числа и другие языковые нюансы. Во фреймворке Svelte это можно реализовать через систему управления переводами и обработки плюрализации, которая позволяет легко адаптировать интерфейс для различных языков.
svelte-i18nДля реализации многоязычности в приложении на Svelte обычно
используется сторонняя библиотека — svelte-i18n. Это одна
из самых популярных библиотек для работы с локализацией в
Svelte-приложениях. Она предоставляет удобный интерфейс для управления
переводами, а также встроенную поддержку плюрализации, что делает её
идеальным выбором для создания многоязычных приложений.
Установка библиотеки происходит с помощью npm или yarn:
npm install svelte-i18n
После установки необходимо настроить библиотеку для работы с переводами.
Для начала создаём файл переводов, например, en.json для
английского языка:
{
"greeting": "Hello, {name}!",
"item_count": "{count} item|{count} items"
}
В файле переводов ключи соответствуют строкам, которые будут
отображаться в приложении. Для использования этих переводов в Svelte,
нужно импортировать и настроить библиотеку svelte-i18n.
В файле настройки i18n.js можно импортировать и
настроить библиотеку следующим образом:
import { init, getLocaleFromNavigator } from 'svelte-i18n';
import en from './locales/en.json';
init({
fallbackLocale: 'en',
initialLocale: getLocaleFromNavigator(),
formats: {
// Форматы чисел, дат и валют
},
translations: {
en
}
});
Здесь getLocaleFromNavigator автоматически определяет
язык системы пользователя, а fallbackLocale указывает язык
по умолчанию, если перевод для выбранного языка не найден.
Система плюрализации позволяет учитывать изменения в числе при переводе фраз. В разных языках правила формирования множественного числа могут существенно различаться. Например, в английском языке для чисел 1 используется форма в единственном числе, а для всех остальных чисел — форма во множественном.
В svelte-i18n плюрализация реализуется с использованием
синтаксиса с вертикальной чертой |. Рассмотрим следующий
пример:
{
"item_count": "{count} item|{count} items"
}
В этом примере для одного предмета будет использована форма “item”, а для любого другого количества — “items”. Однако такая схема работает не во всех языках, и для некоторых требуется более сложная логика.
В русском языке нужно учитывать формы для 1, 2–4 и для всех остальных чисел. Для этого используем следующий синтаксис:
{
"item_count": "{count} товар|{count} товара|{count} товаров"
}
Теперь, при отображении количества товаров, фраза будет изменяться в зависимости от числа:
Для корректной работы с такими правилами необходимо использовать
функцию плюрализации. В svelte-i18n можно настроить
форматирование для разных чисел с помощью конфигурации
formats.
import { addMessages, init, register } from 'svelte-i18n';
register('ru', {
item_count: '{count} товар|{count} товара|{count} товаров'
});
addMessages('ru', {
// Дополнительные переводы для русского языка
});
init({
fallbackLocale: 'en',
initialLocale: 'ru',
formats: {
// Плюрализация для русского языка
number: {
ru: {
item_count: (count) => {
if (count % 10 === 1 && count % 100 !== 11) {
return `${count} товар`;
} else if (count % 10 >= 2 && count % 10 <= 4 && (count % 100 < 10 || count % 100 >= 20)) {
return `${count} товара`;
} else {
return `${count} товаров`;
}
}
}
}
}
});
В этом примере используется функция для определения правильной формы в зависимости от числа. Это решение позволяет гибко подходить к обработке разных языков с различной грамматикой.
После того как переводы настроены, их можно использовать
непосредственно в компонентах Svelte. Для этого библиотека предоставляет
компонент <Trans> и функцию $t.
Пример использования компонента <Trans>:
<script>
import { Trans } from 'svelte-i18n';
</script>
<p>
<Trans message="greeting" values={{ name: 'Иван' }} />
</p>
В данном примере мы выводим строку “Hello, Иван!” или её эквивалент на другом языке, если пользователь выбрал неанглийский язык.
Также можно использовать функцию $t для более гибкого
управления переводами:
<script>
import { $t } from 'svelte-i18n';
let count = 5;
</script>
<p>{$t('item_count', { count })}</p>
В этом примере будет выведена корректная форма в зависимости от
значения переменной count. Если count равно 5,
то текст будет выглядеть как “5 товаров”.
Для оптимизации производительности можно загружать переводы только по мере необходимости. Это достигается с помощью асинхронной загрузки переводов, которая снижает размер начальной загрузки приложения.
Пример:
import { init, addMessages } from 'svelte-i18n';
init({
fallbackLocale: 'en',
initialLocale: 'ru',
formats: {
// Форматы
}
});
const loadTranslations = async (locale) => {
const translations = await import(`./locales/${locale}.json`);
addMessages(locale, translations.default);
};
В этом примере переводы загружаются только по запросу, что позволяет уменьшить общий размер бандла приложения.
Управление переводами и плюрализация в Svelte позволяет легко и гибко
создавать многоязычные приложения. С помощью библиотеки
svelte-i18n можно легко адаптировать интерфейс под разные
языки, учитывая особенности склонений, числа и других языковых нюансов.
Плюрализация, поддержка разных форм чисел и возможность асинхронной
загрузки переводов делают Svelte мощным инструментом для создания
глобализированных приложений.