获取数组中的随机项目作为值并支持复数

时间:2019-03-04 12:57:31

标签: javascript i18next

我有具有以下形式的资源字符串:

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"
      }
}

然后,当我在JavaScript代码中使用函数t时,我会这样做:

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

但是当我想要一个随机项时,它将选择数组中的第一项。有没有办法初始化i18n或使插值过程适应于使其返回MY_VARIATIONS中的随机项? (理想情况下是在i18next init中,因此我不必创建外围代码即可做到这一点)

2 个答案:

答案 0 :(得分:2)

您可以通过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库专门支持随机变体(这似乎不太可能),否则我认为没有合理的方法解决此问题。

答案 1 :(得分:0)

我设法通过更改资源字符串的结构来解决此问题:

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"