Использование локализаций и кодов локалей в React Native SDK
Почему это важно
Есть несколько сценариев, в которых коды локалей играют роль — например, когда нужно получить правильный пейвол для текущей локализации приложения.
Поскольку коды локалей устроены непросто и могут различаться от платформы к платформе, мы используем единый внутренний стандарт для всех поддерживаемых платформ. Но именно из-за этой сложности важно чётко понимать, что именно вы отправляете на наш сервер для получения нужной локализации и что происходит дальше — тогда вы всегда будете получать ожидаемый результат.
Стандарт кодов локалей в Adapty
Для кодов локалей Adapty использует немного изменённый стандарт BCP 47: каждый код состоит из подтегов в нижнем регистре, разделённых дефисами. Примеры: en (английский), pt-br (португальский (Бразилия)), zh (упрощённый китайский), zh-hant (традиционный китайский).
Сопоставление кодов локалей
Когда Adapty получает вызов от клиентского SDK с кодом локали и начинает поиск соответствующей локализации пейвола, происходит следующее:
- Входящая строка локали приводится к нижнему регистру, а все символы подчёркивания (
_) заменяются дефисами (-) - Затем выполняется поиск локализации с полностью совпадающим кодом локали
- Если совпадение не найдено, берётся подстрока до первого дефиса (
ptдляpt-br) и снова выполняется поиск - Если совпадение снова не найдено, возвращается локализация по умолчанию —
en
Таким образом устройство iOS, отправившее 'pt_BR', устройство Android, отправившее pt-BR, и любое другое устройство, отправившее pt-br, получат одинаковый результат.
Реализация локализаций: рекомендуемый подход
Если вы задумались о локализациях, скорее всего, вы уже работаете с локализованными строковыми файлами в своём проекте. В таком случае мы рекомендуем добавить в каждый файл пару ключ-значение с нужным кодом локали Adapty. Затем извлекайте значение по этому ключу при вызове нашего SDK:
// 1. Modify your localization files (e.g., using react-i18next)
/*
en.json
*/
{
"adapty_paywalls_locale": "en"
}
/*
es.json
*/
{
"adapty_paywalls_locale": "es"
}
/*
pt-BR.json
*/
{
"adapty_paywalls_locale": "pt-br"
}
// 2. Extract and use the locale code
const MyComponent = () => {
const { t } = useTranslation();
const fetchPaywall = async () => {
const locale = t('adapty_paywalls_locale');
// pass locale code to adapty.getPaywall or adapty.getPaywallForDefaultAudience method
const paywall = await adapty.getPaywallForDefaultAudience('placement_id', locale);
};
};
Такой подход даёт вам полный контроль над тем, какая локализация будет загружена для каждого пользователя вашего приложения.
Реализация локализаций: альтернативный подход
Похожего (но не идентичного) результата можно добиться без явного определения кодов локалей для каждой локализации. Для этого нужно извлекать код локали из других объектов, предоставляемых платформой:
const getLocaleCode = () => {
if (Platform.OS === 'ios') {
return NativeModules.SettingsManager.settings.AppleLocale ||
NativeModules.SettingsManager.settings.AppleLanguages[0];
} else {
return NativeModules.I18nManager.localeIdentifier;
}
};
const fetchPaywall = async () => {
const locale = getLocaleCode();
// pass locale code to adapty.getPaywall or adapty.getPaywallForDefaultAudience method
const paywall = await adapty.getPaywallForDefaultAudience('placement_id', locale);
};
Мы не рекомендуем этот подход по нескольким причинам:
- На iOS предпочтительные языки и текущая локаль — не одно и то же. Чтобы локализация подбиралась корректно, придётся либо положиться на логику Apple (которая работает автоматически при использовании рекомендуемого подхода с локализованными строковыми файлами), либо воспроизвести её самостоятельно.
- Сложно предсказать, что именно получит сервер Adapty. Например, на iOS можно получить локаль вида
ar_OM@numbers='latn'и отправить её на наш сервер. В этом случае вы получите не локализациюar-om, которую ожидали, аar— что, скорее всего, не то, что нужно.
Если вы всё же решите использовать этот подход — убедитесь, что покрыли все актуальные сценарии использования.