Назад

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, каждый элемент массива получает идентификатор на основе индекса: ${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() принимает массивы, передача в m() результата msg() не приведет к сбою.