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