返回

gt-next@6.13.0

Ernest McCarter avatarErnest McCarter
gt-nextgt-i18nv6.13.0msgstring-registrationarraysi18n

概述

msg() 现在支持接收数组。

之前,如果要注册一组相关字符串,就必须将每个字符串单独包裹起来:

const confirmations = [
  msg("Yes"),
  msg("Yup"),
  msg("Right"),
  msg("Absolutely"),
  msg("Exactly"),
];

这里有两个问题。首先,每一行都需要进行一次 msg() 调用。其次,相关字符串往往需要相同的元数据 —— $context$id 等 —— 而这些元数据必须内联写出,因为命令行界面(CLI)会在构建时解析它。对于像 "Right" 或 "Exactly" 这样在脱离上下文时含义模糊的字符串,你最终会在每一项里都重复写 $context

const confirmations = [
  msg("Yes"),
  msg("Yup"),
  msg("Right", { $context: "As in a confirmation" }),
  msg("Absolutely", { $context: "As in a confirmation" }),
  msg("Exactly", { $context: "As in a confirmation" }),
];

现在你可以改用这种方式:

const confirmations = msg([
  "Yes",
  "Yup",
  "Right",
  "Absolutely",
  "Exactly",
], { $context: "Confirmation responses" });

设计

Id generation

当指定 $id 时,数组中的每个元素都会被分配一个基于索引的 id:${id}.0${id}.1 等。

const greetings = msg([
  "Hi",
  "Hello",
  "Howdy",
], { $id: "greeting" });
// "Hi"    → id: "greeting.0"
// "Hello" → id: "greeting.1"
// "Howdy" → id: "greeting.2"

为什么不用对象?

我们也曾考虑把这一机制扩展到对象上,但最终决定不这么做。对象通常会混合可翻译字段和不可翻译字段:

{
  id: 'planning.v1',           // 不翻译
  message: 'Not yet enabled',  // 翻译
}

如果不引入更多语法,就没有一种简洁的方式来指定哪些字段需要注册。数组则没有这个问题——每个元素都是要翻译的字符串。

未来

gt() 提供数组支持是顺理成章的下一步。gt()msg() 都是注册函数,因此让它们具备一致的功能是合理的。这同样适用于 m(),因为 msg()m() 经常一起使用——让 m() 接受数组可以保证在将 msg() 的输出传给 m() 时不会出问题。