戻る

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"),
];

これには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() に渡しても壊れないことが保証されます。