函数 t 在最新的 i18next 版本中未正确绑定
Function t is not binding correctly in latest i18next versions
下面的代码(Alexa 技能的本地化拦截器)适用于 i18next 版本 10.5.0,但不适用于最新版本。它收到一条函数 t 未被识别的消息,似乎 t 未正确绑定。
我找不到为什么会这样(我不知道 i18next 更新了什么)。任何人都可以阐明这一点吗?
// This request interceptor will bind a translation function 't' to the requestAttributes object
const LocalizationInterceptor = {
process(handlerInput) {
const localizationClient = i18n.use(sprintf).init({
lng: handlerInput.requestEnvelope.request.locale,
fallbackLng: 'en',
overloadTranslationOptionHandler: sprintf.overloadTranslationOptionHandler,
resources: languageStrings,
returnObjects: true
});
const attributes = handlerInput.attributesManager.getRequestAttributes();
attributes.t = function (...args) {
return localizationClient.t(...args);
}
}
}
似乎 t 必须作为最新版本中 Promise 的延续来处理,所以这里是解决方案:
// This request interceptor will bind a translation function 't' to the requestAttributes.
const LocalizationRequestInterceptor = {
process(handlerInput) {
i18n.use(sprintf).init({
lng: handlerInput.requestEnvelope.request.locale,
resources: languageStrings,
overloadTranslationOptionHandler: sprintf.overloadTranslationOptionHandler,
}).then((t) => {
const attributes = handlerInput.attributesManager.getRequestAttributes();
attributes.t = (...args) => t(...args);
});
},
};
下面的代码(Alexa 技能的本地化拦截器)适用于 i18next 版本 10.5.0,但不适用于最新版本。它收到一条函数 t 未被识别的消息,似乎 t 未正确绑定。
我找不到为什么会这样(我不知道 i18next 更新了什么)。任何人都可以阐明这一点吗?
// This request interceptor will bind a translation function 't' to the requestAttributes object
const LocalizationInterceptor = {
process(handlerInput) {
const localizationClient = i18n.use(sprintf).init({
lng: handlerInput.requestEnvelope.request.locale,
fallbackLng: 'en',
overloadTranslationOptionHandler: sprintf.overloadTranslationOptionHandler,
resources: languageStrings,
returnObjects: true
});
const attributes = handlerInput.attributesManager.getRequestAttributes();
attributes.t = function (...args) {
return localizationClient.t(...args);
}
}
}
似乎 t 必须作为最新版本中 Promise 的延续来处理,所以这里是解决方案:
// This request interceptor will bind a translation function 't' to the requestAttributes.
const LocalizationRequestInterceptor = {
process(handlerInput) {
i18n.use(sprintf).init({
lng: handlerInput.requestEnvelope.request.locale,
resources: languageStrings,
overloadTranslationOptionHandler: sprintf.overloadTranslationOptionHandler,
}).then((t) => {
const attributes = handlerInput.attributesManager.getRequestAttributes();
attributes.t = (...args) => t(...args);
});
},
};