gt-next@6.12.0
概述
在 gt-next@6.8.0 中,我们引入了 <Static> 组件,用于解决 JSX 内容中的句子碎片化和代码复用问题。
该组件允许在翻译中直接调用静态函数,同时保留不同语言中的词语搭配、动词变位和词序变化。
但对于使用 gt() 和 msg() 的字符串翻译,这一能力仍然缺失。
与 JSX 一样,许多应用也非常依赖通过工具函数拼接字符串,尤其是在较成熟的代码库中,可翻译内容往往分散在各种服务、工具函数和业务逻辑中。
gt-next 6.12.0 通过引入 declareStatic() (即 <Static> 组件对应的字符串版本) ,以及配套函数 declareVar() 和 decodeVars(),补上了这一空白。
核心功能
declareStatic()
其用法与 <Static> 类似,但适用于字符串函数。CLI 会分析所有可能的返回路径,并为每种结果分别创建翻译条目。
const getDisplayName = (name) => {
return name ? declareVar(name) : 'Someone';
};
gt(`${declareStatic(getDisplayName(name))} says hello.`);declareVar()
<Var> 的字符串形式——用于在 declareStatic() 函数中标记动态内容;这些内容会被排除在哈希计算之外,并在运行时按变量处理。
其实现方式是将动态内容包装在与 ICU 兼容的 select 语句中,使其在插值时解析为原始动态内容。
const greeting = "Hello, " + declareVar(name);
// "你好,{_gt_, select, other {name}}"decodeVars()
由于 declareVar() 会在源文本中添加与 ICU 兼容的标记,因此仅使用 declareVar() 可能会与现有的字符串处理逻辑产生冲突。
要提取原始值,只需用 decodeVars() 包裹源字符串即可。
const greeting = "Hello, " + declareVar("Brian");
// "Hello, {_gt_, select, other {Brian}}"
const decodedGreeting = decodeVars(greeting);
// "Hello, Brian"其他优化
增强的字符串函数
gt() 和 msg() 现在都支持字符串拼接,但仅限静态字符串:
gt("Hello " + "world");
msg("Welcome, " + "Brian");扩展后的 <Static> 支持
到目前为止,<Static> 组件的子元素只支持函数调用。
现在,它还支持可在构建时解析的任意 JSX 表达式,例如嵌套的 JSX 文本、三元运算符、条件语句以及函数调用。
function getDisplayName(name) {
return name ? <Var>{name}</Var> : 'Someone';
};
...
<T>
<Static>
Hello {getDisplayName("Brian")}!
{
isFriend ? " How are you?" : " What's up?"
}
</Static>
</T>性能注意事项
与 <Static> 类似,declareStatic() 会使翻译条目数成倍增加。
每次函数调用只要存在多个可能结果,就会生成单独的翻译;而同一字符串中多次调用 declareStatic(),会让总条目数呈指数级增长。
请谨慎使用此功能;当倍增效应过高时,优先使用 ICU select 语句。