Назад

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() принимает массивы, это гарантирует, что передача результата работы msg() в m() не приведёт к ошибкам.