Многоязычность — важная составляющая пользовательского интерфейса, особенно в приложениях с широкой аудиторией. Библиотека iziToast не предоставляет встроенной системы локализации, однако обладает гибкими механизмами, позволяющими легко интегрировать переводы и динамически изменять язык уведомлений.
В уведомлениях iziToast переводятся следующие части:
title)message)buttons)timeoutProgressbar,
close, aria-label и др.)Все текстовые значения передаются вручную, что позволяет полностью контролировать язык отображения.
Для реализации многоязычности создаётся объект с переводами:
const translations = {
ru: {
successTitle: "Успех",
successMessage: "Операция выполнена успешно",
errorTitle: "Ошибка",
errorMessage: "Произошла ошибка"
},
en: {
successTitle: "Success",
successMessage: "Operation completed successfully",
errorTitle: "Error",
errorMessage: "An error occurred"
}
};
Текущий язык задаётся отдельно:
let currentLang = 'ru';
iziToast.show({
title: translations[currentLang].successTitle,
message: translations[currentLang].successMessage,
color: 'green'
});
Такой подход позволяет централизованно управлять текстами.
Изменение языка происходит путём обновления переменной:
function setLanguage(lang) {
currentLang = lang;
}
После этого все последующие уведомления будут отображаться на выбранном языке.
Кнопки в iziToast задаются массивом. Текст кнопок также берётся из словаря:
const translations = {
ru: {
ok: "ОК",
cancel: "Отмена"
},
en: {
ok: "OK",
cancel: "Cancel"
}
};
iziToast.show({
title: "Confirm",
message: "Are you sure?",
buttons: [
[
`<button>${translations[currentLang].ok}</button>`,
function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast);
}
],
[
`<button>${translations[currentLang].cancel}</button>`,
function (instance, toast) {
instance.hide({ transitionOut: 'fadeOut' }, toast);
}
]
]
});
iziToast легко интегрируется с популярными библиотеками локализации:
Пример с i18next:
iziToast.show({
title: i18next.t('notification.success.title'),
message: i18next.t('notification.success.message')
});
В этом случае все переводы управляются внешней системой, а iziToast выступает только как отображающий слой.
Для динамических сообщений используются шаблоны:
const translations = {
ru: {
welcome: "Добро пожаловать, {{name}}!"
},
en: {
welcome: "Welcome, {{name}}!"
}
};
function translate(key, params = {}) {
let text = translations[currentLang][key];
Object.keys(params).forEach(param => {
text = text.replace(`{{${param}}}`, params[param]);
});
return text;
}
Использование:
iziToast.show({
message: translate('welcome', { name: 'Алексей' })
});
Для языков с направлением справа налево (например, арабский) необходимо:
document.body.dir = currentLang === 'ar' ? 'rtl' : 'ltr';
Также можно изменить позиционирование toast-уведомлений:
iziToast.show({
position: currentLang === 'ar' ? 'topLeft' : 'topRight'
});
iziToast не обрабатывает форматирование дат или чисел, поэтому используются стандартные API:
const date = new Date();
const formattedDate = new Intl.DateTimeFormat(currentLang).format(date);
iziToast.show({
message: `Дата: ${formattedDate}`
});
Для масштабируемых проектов рекомендуется разбивать переводы:
const translations = {
ru: {
notification: {
success: {
title: "Успех",
message: "Данные сохранены"
}
}
}
};
Доступ:
translations[currentLang].notification.success.title
Добавляется fallback-язык:
function getTranslation(key) {
return translations[currentLang][key]
|| translations['en'][key]
|| key;
}
При частом использовании переводов рекомендуется:
Простая реализация:
const translations = {
ru: {
messages: {
one: "1 сообщение",
few: "{{count}} сообщения",
many: "{{count}} сообщений"
}
}
};
function pluralize(count) {
if (count === 1) return 'one';
if (count >= 2 && count <= 4) return 'few';
return 'many';
}
Использование:
const count = 5;
iziToast.show({
message: translations[currentLang].messages[pluralize(count)].replace('{{count}}', count)
});
Создание отдельного модуля:
export function t(key, params) {
// логика перевода
}
И использование:
iziToast.show({
title: t('success.title'),
message: t('success.message')
});
Проверяется:
Оптимальная схема:
t()Такой подход обеспечивает гибкость, масштабируемость и удобство поддержки многоязычного интерфейса.