---
title: "在 Android SDK 中使用本地化和语言区域代码"
description: "管理应用本地化和语言区域代码，触达全球用户（Android）。"
---

## 为什么这很重要 \{#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-br` 对应 `pt`），并再次查找匹配的本地化版本
4. 如果仍未找到匹配项，则返回默认的 `en` 本地化版本

通过这种方式，发送了 `'pt_BR'` 的 iOS 设备、发送了 `pt-BR` 的 Android 设备，以及发送了 `pt-br` 的其他设备，都将获得相同的结果。

## 实现本地化：推荐方式 \{#implementing-localizations-recommended-way\}

如果您正在考虑本地化问题，很可能已经在项目中处理了本地化字符串文件。在这种情况下，我们建议在每个本地化对应的字符串文件中，添加一个键值对来存储预期的 Adapty 语言区域代码，然后在调用 SDK 时提取该键对应的值，如下所示：

```kotlin showLineNumbers
// 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
```

这样，您可以完全掌控每位应用用户将获取的本地化版本。

## 实现本地化：其他方式 \{#implementing-localizations-the-other-way\}

您也可以在不为每个本地化版本显式定义语言区域代码的情况下，获得类似（但不完全相同）的结果。这意味着需要从平台提供的其他对象中提取语言区域代码，如下所示：

```kotlin showLineNumbers
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 服务器实际接收到的内容。

如果您仍决定使用此方式，请确保已覆盖所有相关的使用场景。