Розширюйте глобальне охоплення з JavaScript Intl API. Вивчіть практики інтернаціоналізації для форматування дат, чисел, валют задля бездоганного досвіду користувачів.
JavaScript Intl API: найкращі практики інтернаціоналізації для глобальної аудиторії
У сучасному взаємопов'язаному світі створення вебдодатків, орієнтованих на глобальну аудиторію, є вирішальним. JavaScript Intl API надає потужні інструменти для інтернаціоналізації (i18n), що дозволяють форматувати дати, числа, валюти та багато іншого відповідно до стандартів різних локалей. У цій статті розглядаються найкращі практики використання Intl API для створення справді глобальних додатків.
Розуміння інтернаціоналізації (i18n) та локалізації (l10n)
Перш ніж заглиблюватися в особливості Intl API, важливо зрозуміти різницю між інтернаціоналізацією (i18n) та локалізацією (l10n). I18n — це процес проєктування та розробки додатків таким чином, щоб їх можна було легко адаптувати до різних мов і регіонів без необхідності інженерних змін. L10n, з іншого боку, — це процес адаптації інтернаціоналізованого додатка до конкретної локалі шляхом перекладу тексту та налаштування інших елементів, специфічних для цієї локалі.
Intl API зосереджується на аспекті i18n, надаючи механізми для обробки даних, чутливих до локалі, тоді як локалізація зазвичай включає надання перекладів та конфігурацій, специфічних для локалі.
Ключові компоненти Intl API
Intl API складається з кількох ключових об'єктів, кожен з яких відповідає за обробку певних аспектів інтернаціоналізації:
- Intl.Collator: для порівняння рядків з урахуванням локалі.
- Intl.DateTimeFormat: для форматування дати та часу.
- Intl.NumberFormat: для форматування чисел, включаючи валюти та відсотки.
- Intl.PluralRules: для обробки правил множини в різних мовах.
- Intl.ListFormat: для форматування списків з урахуванням локалі.
- Intl.RelativeTimeFormat: для форматування відносного часу (наприклад, "вчора", "через 2 години").
Найкращі практики використання Intl API
Щоб ефективно використовувати Intl API та забезпечити позитивний досвід користувачів для вашої глобальної аудиторії, розгляньте наступні найкращі практики:
1. Вказуйте правильну локаль
Основою інтернаціоналізації є вказання правильної локалі. Локаль визначає мову, регіон та будь-які специфічні варіанти, які слід використовувати для форматування. Ви можете отримати бажану локаль користувача з властивості navigator.language
або HTTP-заголовка Accept-Language
.
При створенні об'єктів Intl ви можете вказати локаль як рядок або масив рядків. Якщо ви надасте масив, API спробує знайти найкращу відповідну локаль з доступних варіантів.
Приклад:
const locale = navigator.language || 'en-US';
const numberFormat = new Intl.NumberFormat(locale);
Якщо бажана локаль користувача недоступна, ви можете надати резервну локаль. Наприклад, ви можете використовувати 'en-US' за замовчуванням, якщо браузер користувача повідомляє про непідтримувану локаль.
2. Використовуйте Intl.DateTimeFormat для форматування дати та часу
Правильне форматування дат і часу є вирішальним для надання локалізованого досвіду. Об'єкт Intl.DateTimeFormat
дозволяє форматувати дати та час відповідно до стандартів конкретної локалі.
Ви можете налаштувати форматування, вказуючи різні опції, такі як формат року, місяця, дня, години, хвилини та секунди. Ви також можете вказати часовий пояс, щоб забезпечити правильне відображення дат і часу для користувачів у різних частинах світу.
Приклад:
const locale = 'de-DE'; // Німецька (Німеччина)
const date = new Date();
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: 'numeric',
timeZone: 'Europe/Berlin'
};
const dateTimeFormat = new Intl.DateTimeFormat(locale, options);
const formattedDate = dateTimeFormat.format(date); // Вивід: напр. "22. Mai 2024, 14:30"
console.log(formattedDate);
Цей приклад форматує поточну дату та час відповідно до локалі німецької (Німеччина), включаючи рік, місяць, день, годину та хвилину. Він також вказує часовий пояс 'Europe/Berlin'.
Пам'ятайте про різні формати дати та часу, що використовуються у світі. Наприклад, у США використовується MM/DD/YYYY, тоді як у багатьох інших країнах — DD/MM/YYYY.
3. Використовуйте Intl.NumberFormat для форматування чисел, валют та відсотків
Об'єкт Intl.NumberFormat
надає гнучкий спосіб форматування чисел, валют та відсотків відповідно до специфічних для локалі правил. Ви можете налаштувати форматування, вказуючи такі опції, як валюта, стиль (десятковий, валютний або відсотковий), мінімальна та максимальна кількість дробових цифр тощо.
Приклад (форматування валюти):
const locale = 'ja-JP'; // Японська (Японія)
const amount = 12345.67;
const options = {
style: 'currency',
currency: 'JPY'
};
const numberFormat = new Intl.NumberFormat(locale, options);
const formattedAmount = numberFormat.format(amount); // Вивід: напр. "¥12,346"
console.log(formattedAmount);
Цей приклад форматує число 12345.67 як японську єну (JPY). Зверніть увагу, як символ валюти (¥) та роздільник груп (,) автоматично налаштовуються відповідно до японської локалі.
Приклад (форматування відсотків):
const locale = 'ar-EG'; // Арабська (Єгипет)
const percentage = 0.75;
const options = {
style: 'percent',
minimumFractionDigits: 2
};
const numberFormat = new Intl.NumberFormat(locale, options);
const formattedPercentage = numberFormat.format(percentage); // Вивід: напр. "٧٥٫٠٠٪"
console.log(formattedPercentage);
Цей приклад форматує число 0.75 як відсоток арабською (Єгипет). Вивід включає арабський знак відсотка (٪) та два десяткових знаки.
Важливі аспекти форматування валют:
- Коди валют: Використовуйте правильні коди валют ISO 4217 (наприклад, USD, EUR, JPY).
- Розміщення символу: Пам'ятайте, що позиція символу валюти змінюється в залежності від локалі (наприклад, до або після суми).
- Десяткові та групові роздільники: Розумійте різні правила для десяткових роздільників (наприклад, крапка або кома) та групових роздільників (наприклад, кома або крапка).
4. Правильно обробляйте множину за допомогою Intl.PluralRules
Правила утворення множини значно відрізняються в різних мовах. Наприклад, англійська мова має прості правила з одниною та множиною, тоді як інші мови мають складніші правила, що базуються на значенні числа. Об'єкт Intl.PluralRules
допомагає визначити правильну форму множини для заданого числа та локалі.
Приклад:
const locale = 'ru-RU'; // Російська (Росія)
const pluralRules = new Intl.PluralRules(locale);
function getPluralForm(count) {
const rule = pluralRules.select(count);
switch (rule) {
case 'one': return 'товар'; // товар (однина)
case 'few': return 'товара'; // товара (декілька)
case 'many': return 'товаров'; // товаров (багато)
default: return 'товаров'; // За замовчуванням багато
}
}
const count = 5;
const pluralForm = getPluralForm(count);
console.log(`${count} ${pluralForm}`); // Вивід: "5 товаров"
Цей приклад демонструє, як використовувати Intl.PluralRules
для отримання правильної форми множини для слова "товар" російською мовою. Російська мова має різні форми множини залежно від того, чи закінчується число на 1, 2-4 або 5-9.
5. Форматуйте списки за допомогою Intl.ListFormat
При поданні списків елементів форматування може відрізнятися в залежності від локалі. Об'єкт Intl.ListFormat
дозволяє форматувати списки відповідно до локально-специфічних правил, включаючи використання різних сполучників (наприклад, "і", "або") та роздільників списків (наприклад, коми, крапки з комою).
Приклад:
const locale = 'es-ES'; // Іспанська (Іспанія)
const list = ['manzanas', 'naranjas', 'plátanos'];
const listFormat = new Intl.ListFormat(locale, { style: 'long', type: 'conjunction' });
const formattedList = listFormat.format(list); // Вивід: "manzanas, naranjas y plátanos"
console.log(formattedList);
Цей приклад форматує список фруктів іспанською (Іспанія), використовуючи сполучник "y" (і) для з'єднання останніх двох елементів.
6. Форматуйте відносний час за допомогою Intl.RelativeTimeFormat
Відображення відносного часу (наприклад, "вчора", "через 2 години") забезпечує зручний для користувача спосіб представлення інформації про час. Об'єкт Intl.RelativeTimeFormat
дозволяє форматувати відносний час відповідно до локально-специфічних правил.
Приклад:
const locale = 'fr-CA'; // Французька (Канада)
const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });
console.log(rtf.format(-1, 'day')); // Вивід: "hier"
console.log(rtf.format(2, 'day')); // Вивід: "dans 2 jours"
Цей приклад форматує відносний час французькою (Канада). Вивід показує "hier" (вчора) та "dans 2 jours" (через 2 дні).
Опція `numeric` контролює, як відображаються числа. `'auto'` відображає відносні слова, коли вони доступні (наприклад, "вчора"), і числа в іншому випадку. `'always'` завжди відображає числа.
7. Сортуйте рядки за допомогою Intl.Collator
Порівняння рядків залежить від локалі. Спосіб сортування рядків залежить від мови. Наприклад, у німецькій мові символ "ä" зазвичай сортується як "a", тоді як у шведській — після "z". Об'єкт `Intl.Collator` дозволяє порівнювати рядки за правилами конкретної локалі.
Приклад:
const locale = 'de-DE';
const collator = new Intl.Collator(locale);
const strings = ['äpfel', 'birnen', 'bananen', 'aprikosen'];
strings.sort(collator.compare);
console.log(strings); // Вивід: ["äpfel", "aprikosen", "bananen", "birnen"]
Цей приклад сортує масив німецьких слів за допомогою Intl.Collator
. Зверніть увагу, що "äpfel" сортується перед "aprikosen", хоча "ä" йде пізніше в алфавіті.
8. Обробляйте крайні випадки та відсутні дані
Не всі локалі підтримуються кожним браузером чи середовищем. Важливо обробляти крайні випадки, коли локаль недоступна або коли дані відсутні. Розгляньте наступні стратегії:
- Надавайте резервні локалі: Вкажіть локаль за замовчуванням, яка буде використовуватися, якщо бажана локаль користувача не підтримується.
- Плавна деградація: Якщо певні опції форматування не підтримуються для локалі, надайте розумний резервний варіант. Наприклад, ви можете відобразити дату в менш детальному форматі.
- Використовуйте блоки try-catch: Огортайте виклики Intl API в блоки try-catch для коректної обробки потенційних помилок.
9. Ретельно тестуйте з різними локалями
Ретельне тестування є вирішальним для забезпечення коректної роботи вашого інтернаціоналізованого додатка для всіх підтримуваних локалей. Тестуйте ваш додаток з різними локалями, включаючи мови, що використовують різні набори символів, формати дати та часу, формати чисел та правила множини.
Розгляньте можливість використання інструментів автоматизованого тестування для перевірки того, що ваш додаток поводиться очікувано в різних локалях.
10. Враховуйте вплив на продуктивність
Хоча Intl API загалом ефективний, створення об'єктів Intl може бути відносно ресурсомістким. Щоб оптимізувати продуктивність, враховуйте наступне:
- Кешуйте об'єкти Intl: Створюйте об'єкти Intl один раз і повторно використовуйте їх, коли це можливо, замість створення нових об'єктів для кожної операції форматування.
- Ліниве завантаження даних локалі: Завантажуйте дані локалі лише тоді, коли вони потрібні, замість завантаження всіх даних локалі наперед.
Поза Intl API: подальші аспекти інтернаціоналізації
Хоча Intl API надає потужні інструменти для форматування даних, інтернаціоналізація включає більше, ніж просто форматування. Розгляньте наступні додаткові аспекти:
- Напрямок тексту (RTL/LTR): Підтримуйте мови з написанням справа наліво (RTL), такі як арабська та іврит, використовуючи CSS для налаштування макета вашого додатка.
- Кодування символів: Використовуйте кодування UTF-8, щоб ваш додаток міг обробляти широкий діапазон символів.
- Управління перекладами: Використовуйте систему управління перекладами для спрощення процесу перекладу тексту вашого додатка.
- Культурно-чутливий дизайн: Пам'ятайте про культурні відмінності при проєктуванні вашого додатка. Наприклад, символіка кольорів може відрізнятися в різних культурах.
Висновок
JavaScript Intl API — це безцінний інструмент для створення вебдодатків, орієнтованих на глобальну аудиторію. Дотримуючись найкращих практик, викладених у цій статті, ви можете створювати додатки, які є не тільки функціональними, але й культурно чутливими та зручними для користувачів у всьому світі. Використовуйте потужність Intl API та розкрийте потенціал вашого додатка на світовій арені. Опанування Intl API призведе до більш інклюзивного та доступного досвіду для всіх ваших користувачів, незалежно від їхнього місцезнаходження чи мови.