gt-next@6.13.0
概述
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() 时不会出问题。