返回

gt-next@6.12.0

Ernest McCarter avatarErnest McCarter
gt-nextv6.12.0declareStaticdeclareVardecodeVars翻译i18n字符串函数句子碎片化

概述

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 语句。