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 приведет к более инклюзивному и доступному опыту для всех ваших пользователей, независимо от их местоположения или языка.