@intlify/h3
Version:
Internationalization middleware & utilities for h3
68 lines (64 loc) • 2.36 kB
JavaScript
const core = require('@intlify/core');
const h3 = require('@intlify/utils/h3');
function defineI18nMiddleware(options) {
const i18n = core.createCoreContext(options);
const orgLocale = i18n.locale;
let staticLocaleDetector = null;
if (typeof orgLocale === "string") {
console.warn(
`defineI18nMiddleware 'locale' option is static ${orgLocale} locale! you should specify dynamic locale detector function.`
);
staticLocaleDetector = () => orgLocale;
}
const getLocaleDetector = (event, i18n2) => {
return typeof orgLocale === "function" ? orgLocale.bind(null, event, i18n2) : staticLocaleDetector != null ? staticLocaleDetector.bind(null, event, i18n2) : detectLocaleFromAcceptLanguageHeader.bind(null, event);
};
return {
onRequest(event) {
event.context._i18nLocale = getLocaleDetector(event, i18n);
i18n.locale = event.context._i18nLocale;
event.context.i18n = i18n;
},
onAfterResponse(event) {
i18n.locale = orgLocale;
delete event.context.i18n;
}
};
}
const detectLocaleFromAcceptLanguageHeader = (event) => h3.getHeaderLocale(event).toString();
async function useTranslation(event) {
if (event.context.i18n == null) {
throw new Error(
"middleware not initialized, please setup `onRequest` and `onAfterResponse` options of `createApp` with the middleware obtained with `defineI18nMiddleware`"
);
}
const localeDetector = event.context._i18nLocale;
let locale;
if (localeDetector.constructor.name === "AsyncFunction") {
locale = await localeDetector(event);
event.context.i18n.locale = locale;
}
function translate(key, ...args) {
const [_, options] = core.parseTranslateArgs(key, ...args);
const [arg2] = args;
const result = Reflect.apply(core.translate, null, [
event.context.i18n,
key,
arg2,
{
// bind to request locale
locale,
...options
}
]);
return core.NOT_REOSLVED === result ? key : result;
}
return translate;
}
exports.defineI18nMiddleware = defineI18nMiddleware;
exports.detectLocaleFromAcceptLanguageHeader = detectLocaleFromAcceptLanguageHeader;
exports.useTranslation = useTranslation;
Object.keys(h3).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = h3[k];
});
;