获取数组中的随机项作为支持复数的值
Get random item in array as value with support for plurals
我有这种形式的资源字符串:
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});
但这将 select 数组中的第一项,而我想要一个随机项。有没有办法初始化 i18n 或调整插值过程使其 return 成为 MY_VARIATIONS 中的随机项目? (最好在 i18next init 中,这样我就不必创建外围代码来执行此操作)
您可以通过 Object.keys
获取 MY_VARIATIONS
中的所有键(因为它们都是自己的可枚举属性),这会为您提供一个数组。然后从数组中选择一个随机键并使用字符串连接:
const keys = Object.keys(MY_VARIATIONS);
t('MY_VARIATIONS.' + keys[Math.floor(Math.random() * keys)] + '.KEY_WITH_COUNT', {count: daysToGo});
假设代码可以访问 MY_VARIATIONS
。除非 i18next 库特别支持随机变化(这似乎不太可能),否则我认为没有合理的解决方法。
我设法通过像这样更改资源字符串的结构来解决它:
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"
我有这种形式的资源字符串:
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});
但这将 select 数组中的第一项,而我想要一个随机项。有没有办法初始化 i18n 或调整插值过程使其 return 成为 MY_VARIATIONS 中的随机项目? (最好在 i18next init 中,这样我就不必创建外围代码来执行此操作)
您可以通过 Object.keys
获取 MY_VARIATIONS
中的所有键(因为它们都是自己的可枚举属性),这会为您提供一个数组。然后从数组中选择一个随机键并使用字符串连接:
const keys = Object.keys(MY_VARIATIONS);
t('MY_VARIATIONS.' + keys[Math.floor(Math.random() * keys)] + '.KEY_WITH_COUNT', {count: daysToGo});
假设代码可以访问 MY_VARIATIONS
。除非 i18next 库特别支持随机变化(这似乎不太可能),否则我认为没有合理的解决方法。
我设法通过像这样更改资源字符串的结构来解决它:
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"