Globalize используется в средах, где стандартная реализация
Intl может быть неполной или нестабильной. В контексте
React Native это особенно актуально из-за различий между платформами
Android и iOS, а также особенностей JavaScript-движков Hermes и JSC.
Основная проблема интернационализации в React Native заключается в
непредсказуемом уровне поддержки Intl API. В зависимости от
версии рантайма и сборки приложения могут отсутствовать корректные
реализации Intl.NumberFormat,
Intl.DateTimeFormat, Intl.PluralRules. Это
приводит к необходимости использования полноценного i18n-слоя, который
не зависит от встроенных возможностей среды выполнения.
Globalize решает эту задачу через использование CLDR-данных (Unicode Common Locale Data Repository) и собственных форматтеров. В React Native это позволяет стандартизировать поведение локализации между платформами.
В мобильной среде библиотека выполняет функцию независимого слоя локализации, который:
Intl или использует его только как
опциональный ускоритель;CLDR-данные становятся центральным элементом архитектуры. Они включают:
В React Native эти данные обычно включаются в бандл частично, чтобы избежать чрезмерного увеличения размера приложения.
CLDR-данные не используются напрямую в сыром виде. Они предварительно преобразуются в JSON-модули, которые затем импортируются в приложение.
Типичная структура:
cldr-core/supplemental/cldr-numbers-full/cldr-dates-full/В React Native важным аспектом является минимизация набора локалей. Полная загрузка всех CLDR-данных приводит к значительному увеличению размера приложения.
Практика заключается в формировании набора:
en);ru,
de, kk);Инициализация выполняется синхронно или асинхронно в зависимости от стратегии загрузки ресурсов.
Основные этапы:
Globalize.load();Globalize.locale();В React Native часто используется статическая инициализация, поскольку динамическая загрузка локалей требует дополнительной инфраструктуры (файловая система, remote config или bundling через Metro).
Форматирование чисел в мобильных приложениях критично из-за различий в:
Globalize реализует единый слой поверх CLDR:
Особенность React Native заключается в необходимости избегать частых пересозданий форматтеров. Объекты форматирования кэшируются, поскольку их создание связано с обработкой CLDR-данных.
В мобильной среде существует различие между системным временем устройства и локалью приложения. Globalize устраняет это расхождение за счет собственных шаблонов.
Ключевые аспекты:
React Native не гарантирует одинаковое поведение
Date.toLocaleString(), поэтому Globalize применяется как
слой детерминированного форматирования.
Плюрализация в мобильных интерфейсах критична из-за динамических текстов интерфейса (списки, уведомления, счетчики).
CLDR предоставляет правила категорий:
Globalize интерпретирует эти правила и применяет их независимо от
платформы. В React Native это особенно важно, так как встроенные
реализации Intl.PluralRules могут отсутствовать или
работать неконсистентно.
В приложениях React Native локализация обычно связана с глобальным состоянием:
Globalize не привязан к конкретной архитектуре состояния и используется как чистая функция форматирования. Это позволяет:
Основные узкие места:
Оптимизации включают:
Особое внимание требуется FlatList и SectionList, где форматирование вызывается массово при рендере.
В Hermes:
Intl может быть частично урезан;В JavaScriptCore:
Intl;Globalize нивелирует эти различия, поскольку не зависит от ICU runtime.
Metro требует корректной обработки JSON и больших наборов данных CLDR.
Особенности:
Структура модулей может быть организована следующим образом:
/i18n/cldr//i18n/globalize//i18n/locales/Смена языка в React Native требует:
Globalize не хранит реактивное состояние, поэтому смена локали реализуется внешним слоем.
При переключении языка:
Globalize.locale();Форматирование валют в мобильных приложениях требует:
Globalize использует CLDR currency patterns, что обеспечивает единообразие отображения независимо от системных настроек устройства.
В React Native среде выделяются характерные ограничения:
Несмотря на это, использование Globalize обеспечивает стабильность интернационализации в долгоживущих приложениях с большим количеством локалей и сложной бизнес-логикой отображения текста.