Использование локализаций и кодов локали в Android 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 strings.xml files
/*
strings.xml - Spanish
*/
<string name="adapty_paywalls_locale">es</string>
/*
strings.xml - Portuguese (Brazil)
*/
<string name="adapty_paywalls_locale">pt-br</string>
// 2. Extract and use the locale code
val localeCode = context.getString(R.string.adapty_paywalls_locale)
// pass locale code to AdaptyUI.getViewConfiguration or Adapty.getPaywall method
Это позволяет полностью контролировать, какая локализация будет загружена для каждого пользователя вашего приложения.
Альтернативный способ реализации локализаций
Похожего (но не идентичного) результата можно добиться без явного определения кодов локали для каждой локализации. Для этого можно извлечь код локали из других объектов, предоставляемых платформой:
val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
context.resources.configuration.locales[0]
else
context.resources.configuration.locale
val localeCode = locale.toLanguageTag()
// pass locale code to AdaptyUI.getViewConfiguration or Adapty.getPaywall method
Обратите внимание: этот подход мы не рекомендуем, поскольку сложно предсказать, что именно получит сервер Adapty.
Если вы всё же решите использовать этот подход — убедитесь, что учли все актуальные сценарии использования.