---
title: "Использование локализаций и кодов локалей в React Native SDK"
description: "Узнайте, как локализовать пейволы в приложении на React Native с помощью Adapty SDK."
---

## Почему это важно \{#why-this-is-important\}

Есть несколько сценариев, в которых коды локалей играют роль — например, когда нужно получить правильный пейвол для текущей локализации приложения.

Поскольку коды локалей устроены непросто и могут различаться от платформы к платформе, мы используем единый внутренний стандарт для всех поддерживаемых платформ. Но именно из-за этой сложности важно чётко понимать, что именно вы отправляете на наш сервер для получения нужной локализации и что происходит дальше — тогда вы всегда будете получать ожидаемый результат.

## Стандарт кодов локалей в Adapty \{#locale-code-standard-at-adapty\}

Для кодов локалей Adapty использует немного изменённый [стандарт BCP 47](https://en.wikipedia.org/wiki/IETF_language_tag): каждый код состоит из подтегов в нижнем регистре, разделённых дефисами. Примеры: `en` (английский), `pt-br` (португальский (Бразилия)), `zh` (упрощённый китайский), `zh-hant` (традиционный китайский).

## Сопоставление кодов локалей \{#locale-code-matching\}

Когда Adapty получает вызов от клиентского SDK с кодом локали и начинает поиск соответствующей локализации пейвола, происходит следующее:

1. Входящая строка локали приводится к нижнему регистру, а все символы подчёркивания (`_`) заменяются дефисами (`-`)
2. Затем выполняется поиск локализации с полностью совпадающим кодом локали
3. Если совпадение не найдено, берётся подстрока до первого дефиса (`pt` для `pt-br`) и снова выполняется поиск
4. Если совпадение снова не найдено, возвращается локализация по умолчанию — `en`

Таким образом устройство iOS, отправившее `'pt_BR'`, устройство Android, отправившее `pt-BR`, и любое другое устройство, отправившее `pt-br`, получат одинаковый результат.

## Реализация локализаций: рекомендуемый подход \{#implementing-localizations-recommended-way\}

Если вы задумались о локализациях, скорее всего, вы уже работаете с локализованными строковыми файлами в своём проекте. В таком случае мы рекомендуем добавить в каждый файл пару ключ-значение с нужным кодом локали Adapty. Затем извлекайте значение по этому ключу при вызове нашего SDK:

```javascript showLineNumbers
// 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);
  };
};
```

Такой подход даёт вам полный контроль над тем, какая локализация будет загружена для каждого пользователя вашего приложения.

## Реализация локализаций: альтернативный подход \{#implementing-localizations-the-other-way\}

Похожего (но не идентичного) результата можно добиться без явного определения кодов локалей для каждой локализации. Для этого нужно извлекать код локали из других объектов, предоставляемых платформой:

```javascript showLineNumbers

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);
};
```

Мы не рекомендуем этот подход по нескольким причинам:

1. На iOS предпочтительные языки и текущая локаль — не одно и то же. Чтобы локализация подбиралась корректно, придётся либо положиться на логику Apple (которая работает автоматически при использовании рекомендуемого подхода с локализованными строковыми файлами), либо воспроизвести её самостоятельно.
2. Сложно предсказать, что именно получит сервер Adapty. Например, на iOS можно получить локаль вида `ar_OM@numbers='latn'` и отправить её на наш сервер. В этом случае вы получите не локализацию `ar-om`, которую ожидали, а `ar` — что, скорее всего, не то, что нужно.

Если вы всё же решите использовать этот подход — убедитесь, что покрыли все актуальные сценарии использования.