在 Flutter SDK 中使用本地化和语言环境代码

为什么这很重要

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

由于语言区域代码较为复杂,且在不同平台之间可能存在差异,我们为所有支持的平台采用了一套内部标准。然而,正因为这些代码较为复杂,理解你究竟向服务器发送了什么内容以获取正确的本地化版本,以及后续会发生什么,对你来说至关重要——这样你才能始终获得预期的结果。

Adapty 的语言代码标准

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

语言区域代码匹配

当 Adapty 收到来自客户端 SDK 的语言区域代码调用并开始查找付费墙对应的本地化版本时,将发生以下情况:

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

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

// 1. Modify your app_en.arb, app_es.arb, app_pt_br.arb files

/*
app_en.arb
*/
"adapty_paywalls_locale": "en",

/*
app_es.arb
*/
"adapty_paywalls_locale": "es",

/*
app_pt_br.arb
*/
"adapty_paywalls_locale": "pt-br",

// 2. Extract and use the locale code
final locale = AppLocalizations.of(context)!.adapty_paywalls_locale;
// pass locale code to AdaptyUI.getViewConfiguration or Adapty.getPaywall method

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

实现本地化的另一种方式

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

final locale = Localizations.localeOf(context).languageCode;
// pass locale code to AdaptyUI.getViewConfiguration or Adapty.getPaywall method

请注意,我们不建议使用此方法,原因如下:

  1. 在 iOS 上,首选语言和当前语言环境并不相同。如果您希望本地化能够正确选取,您需要依赖 Apple 的逻辑(如果使用推荐的本地化字符串文件方法,该逻辑可开箱即用),或者自行重新实现。
  2. 很难预测 Adapty 的服务器实际会收到什么。例如,在 iOS 上,设备可能会获取到类似 ar_OM@numbers='latn' 这样的语言环境并将其发送到我们的服务器。对于这个请求,您得到的不会是您期望的 ar-om 本地化,而可能是 ar,这很可能出乎您的预料。 如果您仍决定使用此方法,请确保涵盖所有相关的使用场景。