Получить случайный элемент в массиве в качестве значения с поддержкой множественного числа - PullRequest
0 голосов
/ 04 марта 2019

У меня есть строки ресурсов, которые имеют эту форму:

MY_VARIATIONS: {
      1: {
         KEY_WITH_COUNT: "{{count}} day remaining",
         KEY_WITH_COUNT_plural: "{{count}} days remaining"
      },
      2: {
         KEY_WITH_COUNT: "{{count}} day to go",
         KEY_WITH_COUNT_plural: "{{count}} days to go"
      }
}

Затем, когда я использую функцию t в своем коде JavaScript, я делаю:

t('MY_VARIATIONS.1.KEY_WITH_COUNT', {count: daysToGo});

, но это выберет первоеэлемент в массиве, а я хочу случайный.Есть ли способ инициализировать i18 и адаптировать процесс интерполяции, чтобы он возвращал случайный элемент в MY_VARIATIONS?(в идеале, в i18next init, поэтому для этого не нужно создавать периферийный код)

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Мне удалось решить эту проблему, изменив структуру строк ресурсов следующим образом:

KEY_WITH_COUNT: ['{{count}} day remaining', '{{count}} day to go'],
KEY_WITH_COUNT_plural: ['{{count}} days remaining', '{{count}} days to go']

, а затем инициализировав i18next и переписав функцию t следующим образом:

process(callerObject, locale, resourceStrings) {
    const localisationClient = i18n.init({
        lng: locale,
        resources: resourceStrings,
        returnObjects: true
    });
    localisationClient.localise = function localise() {
        const args = arguments;
        const value = i18n.t(...args);
        if (Array.isArray(value)) {
            return value[Math.floor(Math.random() * value.length)];
        }
        return value;
    };
    callerObject.t = function translate(...args) {
        return localisationClient.localise(...args);
    }
}

Затем ябудет использовать это так:

callerObject.t('KEY_WITH_COUNT', {count: 1}); // "1 day remaining"
callerObject.t('KEY_WITH_COUNT', {count: 1}); // "1 day to go"
callerObject.t('KEY_WITH_COUNT', {count: 2}); // "2 days remaining"
callerObject.t('KEY_WITH_COUNT', {count: 2}); // "2 days to go"
0 голосов
/ 04 марта 2019

Вы можете получить все ключи в MY_VARIATIONS через Object.keys (так как они все являются собственными, перечисляемыми свойствами), что дает вам массив.Затем выберите случайный ключ из массива и используйте конкатенацию строк:

const keys = Object.keys(MY_VARIATIONS);
t('MY_VARIATIONS.' + keys[Math.floor(Math.random() * keys)] + '.KEY_WITH_COUNT', {count: daysToGo});

Это предполагает, что код имеет доступ к MY_VARIATIONS.Если библиотека i18next специально не поддерживает случайные варианты (что кажется маловероятным), я не думаю, что есть разумный способ обойти это.

...