Skip to main content
本页只覆盖 Waffo 托管收银台的语言:你传的字段、它接受哪些值,以及当你 什么都不传时页面如何决定渲染哪种语言。 展示哪些支付方式、以什么顺序展示是另一个决策——见 收银台支付方式展示规则。 国家切换、跳转 URL 与 orderAction.actionType 见 收银台跳转与动作类型。

哪个字段控制收银台的展示语言?

paymentInfo.cashierLanguage,在创建订单时传入。 商户 Portal 中没有可以固定收银台语言的设置。如果你想要固定语言, 请在每笔订单上都传 cashierLanguage。

cashierLanguage 必须是什么格式?

language[-script][-region],不接受其他形式: 可以通过的示例: 会被拒绝的值:
  • 下划线分隔——en_US 不是 BCP 47 标签。
  • 变体子标签——de-DE-1996。
  • 扩展子标签——en-US-x-foo。
  • 任何超过 24 个字符的值。
大小写会为你自动规范化,所以 en-us 会被接受并存为 en-US。

值不对时我会收到什么错误?

两种不同的结果,含义也不同: 两者都在创建订单时以 HTTP 400 返回,所以错误的值永远不会到达收银台页面。 如果收到 A0047,修正字符串的形态。如果收到 A0026,形态没问题,但该语言 本身不是 Waffo 会渲染的语言——请核对下方列表。

订阅也能用同一个字段吗?

可以。paymentInfo.cashierLanguage 在创建订阅时同样存在,名称相同、同样 24 个字符上限、同样的 BCP 47 规则、同样的两个错误。它在订阅创建流程的同一 位置被校验。

cashierLanguage 除了收银台页面还会影响别的东西吗?

对订阅来说,会:面向终端用户的订阅通知复用同一个决策。当 Waffo 向你的 客户发送订阅通知时,如果你提供了 cashierLanguage,语言就用它;否则根据 客户的支付币种推断。 注意与收银台页面的区别:通知不是浏览器会话,所以没有 Accept-Language 请求头可读,也没有国家 Tab 可读。通知的兜底是基于币种的;收银台页面的 兜底是基于国家的(见下一个问题)。

收银台如何决定展示语言?有优先级顺序吗?

有——五层,从上到下依次评估。第一个产生值的层胜出。 值得围绕其设计的两个后果:
  • 第 0、1、2 层会锁定语言。 一旦其中一层命中,语言就不再跟随国家: 客户切换国家 Tab,文案保持不变。
  • 只有第 3 层跟随国家 Tab。 因此没有 cashierLanguage、也没有可用 Accept-Language 的客户,在切换国家时会看到文案变化——而具备其中任一项 的客户不会。
语言解析只影响展示。如果它因任何原因失败,支付本身不受影响。

第 3 层实际使用的是哪个国家?

取决于订单处于生命周期的哪个阶段,而且这个区分很重要,因为”展示国家”和 “客户所在国家”并不是一回事。 在选择页上,当客户自己的国家不在订单的候选列表中时,展示国家可能会被回填为 候选列表中的某个国家——这个回填值并不描述客户在哪里,所以语言决策有意不使用它。 选择 Global Tab 不是一个位置,因此不会被当作位置处理:它会落到根据 IP 推断的国家。

什么是冻结的展示语言?为什么会有第 0 层?

当客户在支付方式选择页提交他们的选择时,收银台会把他们当时正在查看的语言 存到订单上。从此以后,这个值优先于其他一切。 它的存在是为了阻止语言在支付过程中漂移。一个全球可用的支付方式会把订单的 展示国家改为 Global,这是一个哨兵值而不是真实国家。如果没有这个快照, 一笔原本以本地语言展示的订单,会在客户选择全球支付方式的那一刻翻转为英语 兜底——客户会眼看着页面在选择和付款之间切换语言。快照把他们已经看到的 语言固定下来。 你无法设置或读取这个值;它由收银台在提交时写入。它对你集成的实际影响只有 这一点:客户在选择页提交之后,就再没有任何东西会改变语言了。

收银台究竟从 Accept-Language 中读取什么?

第 2 层比大多数人预期的更窄:
  • 只考虑请求头中权重最高的那一项。如果它无法映射到受支持的语言,收银台 不会尝试下一项——而是落到第 3 层。
  • 只使用主语言子标签。请求头里的 zh-Hant-TW 会折叠为 zh;请求头中 的 script 和 region 会被丢弃。
  • 接受的主子标签为 en、es、id、ja、ko、ms、pl、pt、th、 tr、vi、zh。其他任何值——fr、ru 等——都不产生结果,落到第 3 层。
  • 格式错误的请求头(某些较旧的 App 内置浏览器会发出重复的 quality 值) 会退化为读取原始字符串中的第一个语言标签,映射规则相同。
由于第 2 层在主子标签级别解析,来自浏览器的 zh 会渲染为繁体中文—— 见下文的 script 兜底。

收银台支持哪些语言?

以下是 cashierLanguage 作为完整标签接受的值: 你并不局限于这些精确的字符串。校验是按子标签进行的,所以受支持语言、 可选的受支持 script 和有效 ISO region 的任意组合都会被接受——例如 en-SG。 region 会改变什么,见下一个问题。

我传了 en-HK,页面看起来和 en 一模一样。region 子标签是被忽略了吗?

对页面文案而言,实际上是的。收银台文案维护在 13 个语言桶中,标签只按 语言加 script 匹配到桶——region 子标签永远不会选中另一套文案: 所以 es-PE 和 es-CL 渲染同一套西班牙语文案,en-KE 和 en-NG 渲染 同一套英语文案。region 子标签仍会带在订单上,并仍用于本地化格式化,但不会 分叉出不同的措辞。 两条让人意外的具体规则:
  • 裸 zh 渲染繁体中文。 没有 script 子标签时无法区分两者,所以收银台 把 zh 解析为 zh-Hant。如果你想要简体,请显式传 Hans script—— zh-Hans 或 zh-Hans-HK。
  • 没有对应桶的语言渲染英语。 ru-RU 能通过校验,但俄语不在 13 个文案桶 之中,所以页面以英语渲染。

我什么都没传。客户会看到什么语言?

由第 2 到第 4 层按顺序决定:
  1. 如果客户的浏览器发送的请求头中排首位的一项是 12 个接受的主子标签之一, 就使用该语言,并且切换国家 Tab 时不会改变。
  2. 否则根据国家推断语言——提交前用他们的真实位置,提交后用展示国家—— 并且会随着他们切换 Tab 而改变。
  3. 如果两者都得不到结果,页面为英语。
如果确定性的语言对你很重要——本地化品牌体验、受监管市场、基于截图的客服 流程——请传 cashierLanguage,而不是依赖这条链。

客户下载收据时可以选哪些语言?

同样的 13 个桶,以各语言自己的名称提供:English、Português、Español、 繁體中文、简体中文、Tiếng Việt、ไทย、Bahasa Indonesia、日本語、한국어、Bahasa Melayu、Polski、Türkçe。 收据语言是客户在下载时自己的选择。它不由 cashierLanguage 驱动,选择某种 语言也不会改变收银台页面的语言。

我能让客户自己选择收银台语言吗?

收银台页面上没有语言选择器。语言就是五层链解析出来的结果。 客户能改变的是国家,在支付方式选择页上,而这只在链条到达第 3 层时才会改变 语言——也就是只在你没有传 cashierLanguage、且他们的浏览器请求头没有匹配时。 国家选择器在什么情况下才会显示,见 收银台跳转与动作类型。