---
title: "在 Capacitor SDK 中使用本地化和区域代码"
description: "了解如何使用 Adapty SDK 在 Capacitor 应用中对付费墙进行本地化。"
---

## 为什么这很重要 \{#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 时提取该键的值，如下所示：
```javascript showLineNumbers
// 1. 修改您的本地化文件（例如，使用 react-i18next）

/*
en.json
*/
{
  "adapty_paywalls_locale": "en"
}

/*
es.json
*/
{
  "adapty_paywalls_locale": "es"
}

/*
pt-BR.json
*/
{
  "adapty_paywalls_locale": "pt-br"
}

// 2. 提取并使用语言代码

const MyComponent = () => {
  const { t } = useTranslation();
  
  const fetchPaywall = async () => {
    const locale = t('adapty_paywalls_locale');
    // 将语言代码传递给 adapty.getPaywall 或 adapty.getPaywallForDefaultAudience 方法
    const paywall = await adapty.getPaywallForDefaultAudience('placement_id', locale);
  };
};
```
这样，您可以完全掌控为应用的每位用户获取哪种本地化内容。
## 实现本地化的另一种方式 \{#implementing-localizations-the-other-way\}

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

const getLocaleCode = () => {
  if (Capacitor.getPlatform() === 'ios') {
    return navigator.language || 'en';
  } else {
    return navigator.language || 'en';
  }
};

const fetchPaywall = async () => {
  const locale = getLocaleCode();
  // 将语言区域代码传递给 adapty.getPaywall 或 adapty.getPaywallForDefaultAudience 方法
  const paywall = await adapty.getPaywallForDefaultAudience('placement_id', locale);
};
```
请注意，我们不推荐这种方法，原因如下：
1. 在 iOS 上，首选语言和当前语言环境并不相同。如果您希望本地化能够正确匹配，您需要依赖 Apple 的逻辑——如果您使用推荐的本地化字符串文件方式，该逻辑可开箱即用——或者自行重新实现。
2. 很难预测 Adapty 的服务器究竟会收到什么内容。例如，在 iOS 上，设备可能获取到类似 `ar_OM@numbers='latn'` 这样的语言环境，并将其发送到我们的服务器。对于此请求，您得到的不是您期望的 `ar-om` 本地化，而可能是 `ar`，这很可能出乎意料。
如果您仍决定使用此方法——请确保您已涵盖所有相关的使用场景。