← 核心概念

性别一致

有些语言会根据句子所指人物的性别对动词和形容词进行变形。英语大多不会这样,因此你写下的 {username} has been invited 这个短语在英语中只是一句话,而在西班牙语、法语或俄语中则对应两三种句子。Langsys 会在翻译过程中处理这一点——与生成复数形式的方式相同——而你只需传入一个参数。

观看 · 0:39 性别一致

流水线的产出

当目标语言需要处理语法一致(如性、数、格)时,Langsys 会将该语言区域的字符串改写为所需的各个分支——即 ICU select。您的源短语始终不变,也无需手动编写这些分支。

你无需编写这部分——由流水线自动完成
// Your source phrase, unchanged:
"{username} has been invited"

// What the Spanish translation becomes — note invitado / invitada:
"{username_gender, select, male {{username} ha sido invitado} \
female {{username} ha sido invitada} \
other {{username} ha sido invitado/a}}"

有两点值得牢记。该参数以其所随变量命名,并附加 _gender——{username} 会生成 username_gender——分支始终为 male、female、other。而且它仅出现在需要它的语言区域中:在有人以带语法性别的语言加载应用之前,你根本看不到它。

传递方式

只要知道参数,就传入它,读者就能看到词形变化正确的句子:

// The argument is named after the variable it inflects, + _gender.
// Branches are always male / female / other.
t('{username} has been invited', 'Team', {
  username: user.name,
  username_gender: user.gender ?? 'other',
});

不确定性别?请显式传入 'other'——它是中性分支。缺少参数时的渲染结果因 SDK 而异,请参阅各 SDK 页面的说明。每个 SDK 页面也会以其自身的惯用写法展示该调用。

哪些短语需要这样做?

仅凭自己的代码是无法判断的,这是其固有特性:该参数是在翻译过程中按目标语言区域添加的,因此源短语和您的代码库中都没有任何相关提示。有三种方法可以查明。

读取目录。你的应用获取的翻译就是已发布的字符串,所以答案已经在客户端了。拉取你所支持语言区域的目录(每个 SDK 都提供此功能),然后查找包含 , select, 的条目。这样你就能得到确切的短语和参数名称,而且开销很小,可以在 CI 中针对你发布的每个语言区域运行。

// The catalog your app fetches IS the promoted strings — grep it.
const wanting = Object.entries(catalog)
  .filter(([, translation]) => translation.includes(', select,'))
  .map(([phrase]) => phrase);
// → every phrase (and, from the string, every argument) this locale needs

开启调试(JavaScript SDK)。在初始化配置中传入 debug: true,并在带有语法性别的语言区域下浏览应用:对于每个翻译需要参数但您未提供的短语,SDK 会记录一条 Langsys Warning,并指明所缺参数。每个语言区域下每个短语只记录一次,且在生产环境中保持静默。有一点需要注意:在内容块和短语组件中,出于防御目的传入的 _gender 本身会被报告为未匹配的参数,因为该检查是针对您的源文本进行的——而源文本中从不会出现 select。

拿不准时,就传入它。字符串中没有的参数值会在渲染时被忽略,因此为每个表示人物的变量都传入 _gender 是安全的,还能涵盖您尚未留意到的语言区域。

每个短语只能有一个变量。只有一个变量可以驱动一致性变化。如果字符串中有两个变量——例如数量和性别——系统不会将其转换为嵌套的 ICU,而是保持原样,因此会作为单个扁平句子进行翻译。

搜索文档和学习中心