在 Flutter SDK 中使用本地化和语言环境代码
为什么这很重要
在某些场景下,语言区域代码会发挥作用——例如,当你尝试为当前应用的本地化版本获取正确的付费墙时。
由于语言区域代码较为复杂,且在不同平台之间可能存在差异,我们为所有支持的平台采用了一套内部标准。然而,正因为这些代码较为复杂,理解你究竟向服务器发送了什么内容以获取正确的本地化版本,以及后续会发生什么,对你来说至关重要——这样你才能始终获得预期的结果。
Adapty 的语言代码标准
对于语言代码,Adapty 使用略经修改的 BCP 47 标准:每个代码由小写子标签组成,以连字符分隔。示例:en(英语)、pt-br(葡萄牙语(巴西))、zh(简体中文)、zh-hant(繁体中文)。
语言区域代码匹配
当 Adapty 收到来自客户端 SDK 的语言区域代码调用并开始查找付费墙对应的本地化版本时,将发生以下情况:
- 传入的语言区域字符串将被转换为小写,所有下划线(
_)将替换为连字符(-) - 然后查找与语言区域代码完全匹配的本地化版本
- 如果未找到匹配项,则截取第一个连字符之前的子字符串(例如
pt-br对应pt),并查找匹配的本地化版本 - 如果仍未找到匹配项,则返回默认的
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
请注意,我们不建议使用此方法,原因如下:
- 在 iOS 上,首选语言和当前语言环境并不相同。如果您希望本地化能够正确选取,您需要依赖 Apple 的逻辑(如果使用推荐的本地化字符串文件方法,该逻辑可开箱即用),或者自行重新实现。
- 很难预测 Adapty 的服务器实际会收到什么。例如,在 iOS 上,设备可能会获取到类似
ar_OM@numbers='latn'这样的语言环境并将其发送到我们的服务器。对于这个请求,您得到的不会是您期望的ar-om本地化,而可能是ar,这很可能出乎您的预料。 如果您仍决定使用此方法,请确保涵盖所有相关的使用场景。