在 Android 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 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
这样,您可以完全掌控每位应用用户将获取的本地化版本。
实现本地化:其他方式
您也可以在不为每个本地化版本显式定义语言区域代码的情况下,获得类似(但不完全相同)的结果。这意味着需要从平台提供的其他对象中提取语言区域代码,如下所示:
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 服务器实际接收到的内容。
如果您仍决定使用此方式,请确保已覆盖所有相关的使用场景。