Интернационализация (i18n) форм в Riot.js представляет собой процесс адаптации пользовательских интерфейсов к различным языкам и региональным особенностям. Основная цель — сделать формы понятными и удобными для пользователей с разными языковыми предпочтениями, сохраняя при этом динамичность и реактивность компонентов.
Для работы с i18n в Riot.js часто используют сторонние библиотеки, такие как i18next или vue-i18n-подобные адаптеры, так как Riot не имеет встроенного механизма интернационализации. Основная схема работы:
npm install i18next
import i18next from 'i18next';
i18next.init({
lng: 'ru', // язык по умолчанию
resources: {
ru: {
translation: {
username: "Имя пользователя",
password: "Пароль",
submit: "Отправить"
}
},
en: {
translation: {
username: "Username",
password: "Password",
submit: "Submit"
}
}
}
});
import { component, html } from 'riot';
import i18next from 'i18next';
component('login-form', html`
<form onsub mit="{ submit }">
<label>{ i18next.t('username') }</label>
<input type="text" name="username" required>
<label>{ i18next.t('password') }</label>
<input type="password" name="password" required>
<button type="submit">{ i18next.t('submit') }</button>
</form>
`, function() {
this.submit = (e) => {
e.preventDefault();
console.log('Форма отправлена');
}
});
Riot.js позволяет динамически изменять язык приложения без перезагрузки страницы. Основная логика:
changeLanguage библиотеки i18next:i18next.changeLanguage('en', () => {
this.update(); // обновление компонента Riot.js
});
this.currentLang = 'ru';
this.setLanguage = (lang) => {
this.currentLang = lang;
i18next.changeLanguage(lang, () => this.update());
};
<select oncha nge="{ e => setLanguage(e.target.value) }">
<option value="ru">Русский</option>
<option value="en">English</option>
</select>
Формы часто содержат валидацию, и важно, чтобы сообщения об ошибках также локализовались.
i18next.init({
lng: 'ru',
resources: {
ru: {
translation: {
required: "Поле {field} обязательно для заполнения",
email: "Введите корректный адрес электронной почты"
}
},
en: {
translation: {
required: "{field} is required",
email: "Enter a valid email address"
}
}
}
});
validateField(field, value) {
if (!value) {
return i18next.t('required', { field: i18next.t(field) });
}
if (field === 'email' && !/\S+@\S+\.\S+/.test(value)) {
return i18next.t('email');
}
return '';
}
Riot.js позволяет связывать текстовые атрибуты напрямую с локализованными строками:
<input type="text" name="username" placeholder="{ i18next.t('username') }">
<input type="password" name="password" placeholder="{ i18next.t('password') }">
Для подсказок можно использовать <small> или
<span> с динамическим текстом:
<small>{ i18next.t('passwordHint') }</small>
Интернационализация не ограничивается только текстом. Riot.js совместно с библиотекой Intl позволяет форматировать числа, даты и валюту в зависимости от локали:
this.formatDate = (date) => {
return new Intl.DateTimeFormat(this.currentLang, {
year: 'numeric', month: 'long', day: 'numeric'
}).format(date);
};
this.formatCurrency = (amount) => {
return new Intl.NumberFormat(this.currentLang, {
style: 'currency', currency: 'USD'
}).format(amount);
};
Использование в шаблоне:
<p>{ formatDate(new Date()) }</p>
<p>{ formatCurrency(1234.56) }</p>
Riot.js компоненты можно сделать полностью реактивными к смене языка. Основная стратегия:
export const i18nState = {
lang: 'ru',
listeners: [],
setLang(lang) {
this.lang = lang;
i18next.changeLanguage(lang);
this.listeners.forEach(fn => fn());
},
subscribe(fn) {
this.listeners.push(fn);
}
};
i18nState.subscribe(() => this.update());
i18nState.setLang('en');
Таким образом все компоненты автоматически обновляются при смене языка, включая формы, сообщения об ошибках и динамический контент.
snake_case или
camelCase) для всех переводов.Интеграция интернационализации в формы Riot.js позволяет создавать гибкие и адаптивные интерфейсы, которые одинаково корректно работают для пользователей из разных стран, обеспечивая удобство и правильное отображение информации.