gt-next@6.13.0
概要
msg() が配列を受け取れるようになりました。
以前は、関連する文字列の一覧を登録するには、それぞれを個別にラップする必要がありました。
const confirmations = [
msg("Yes"),
msg("Yup"),
msg("Right"),
msg("Absolutely"),
msg("Exactly"),
];これには2つの問題があります。1つ目は、すべての行で msg() を呼び出す必要があることです。2つ目は、関連する文字列では同じメタデータ — $context、$id など — が必要になることが多く、CLI がビルド時にそれを解決するため、そのメタデータをインラインで記述しなければならないことです。単独では意味が曖昧な "Right" や "Exactly" のような文字列では、各エントリで $context を毎回繰り返し指定することになります:
const confirmations = [
msg("Yes"),
msg("Yup"),
msg("Right", { $context: "確認の意味として" }),
msg("Absolutely", { $context: "確認の意味として" }),
msg("Exactly", { $context: "確認の意味として" }),
];代わりに、次のようにできます:
const confirmations = msg([
"Yes",
"Yup",
"Right",
"Absolutely",
"Exactly",
], { $context: "Confirmation responses" });設計
ID の生成
$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() に渡しても壊れないことが保証されます。