Я думаю, вы могли бы добиться этого с помощью встроенного select formatter следующим образом:
const names = ['Steve', 'Joe', 'Sandra', 'Judith', 'Jerry'];
intl.formatMessage({id: 'layout'}, {
names: names.map((name, index) => intl.formatMessage(
{id: 'name'}, {
name: name,
position: index === names.length - 1 ?
'last' : (index === 0 ? 'first' : 'inner')
}
)).join('')
});
И в ваших переводах JSON-файл:
{
"layout": "Here are the names: {names}",
"name": "{position, select, first {} last {\u00a0and } other {, }}{name}"
}
Thisпозволит вам изменить разделитель относительно позиции (учитывая, что некоторые языки читаются справа налево).join('')
просто объединяет все имена с «разделителем» для построения строки перечисления.
Примечание. Я использовал символ Юникод \u00a0
для пробела, потому что обычный пробел игнорировался, если помещался первым в интерполированной строке.