在 Capacitor SDK 中使用本地化和区域代码

为什么这很重要

在某些场景下,语言区域代码会发挥关键作用——例如,当你尝试为当前应用的本地化版本获取正确的付费墙时。

由于语言区域代码较为复杂,且不同平台之间可能存在差异,我们对所有支持的平台采用统一的内部标准。然而,正因为这些代码较为复杂,了解你向服务器发送的确切内容、如何获取正确的本地化版本,以及后续的处理流程就显得尤为重要——这样你才能始终获得预期的结果。

Adapty 的语言代码标准

对于语言代码,Adapty 使用稍作修改的 BCP 47 标准:每个代码由小写子标签组成,以连字符分隔。示例:en(英语)、pt-br(葡萄牙语(巴西))、zh(简体中文)、zh-hant(繁体中文)。

语言区域代码匹配

当 Adapty 收到来自客户端 SDK 的语言区域代码请求,并开始查找对应的付费墙本地化版本时,将执行以下步骤:

  1. 传入的语言区域字符串会被转换为小写,并将所有下划线(_)替换为连字符(-
  2. 然后查找与完整语言区域代码完全匹配的本地化版本
  3. 如果未找到匹配项,则截取第一个连字符之前的子字符串(例如 pt-brpt),并查找匹配的本地化版本
  4. 如果仍未找到匹配项,则返回默认的 en 本地化版本 这样,发送 'pt_BR' 的 iOS 设备、发送 pt-BR 的 Android 设备以及发送 pt-br 的另一台设备,都将获得相同的结果。

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

// 1. 修改您的本地化文件(例如,使用 react-i18next)

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

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

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

// 2. 提取并使用语言代码
import { useTranslation } from 'react-i18next';
import { adapty } from 'capacitor-adapty';

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

这样,您可以完全掌控为应用的每位用户获取哪种本地化内容。

实现本地化的另一种方式

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

import { Capacitor } from '@capacitor/core';
import { adapty } from 'capacitor-adapty';

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,这很可能出乎意料。 如果您仍决定使用此方法——请确保您已涵盖所有相关的使用场景。