@daemez/ext-i18next
Version:
i18next for Ext JS
96 lines (84 loc) • 3.29 kB
JavaScript
/**
* @daemez/ext-i18next - i18next integration for Ext JS
* Handles ESM/CJS module interoperability automatically
*/
// Helper to handle both ESM and CJS exports
const interop = (m) => m.default || m;
// Expose i18next globally for use in Ext JS components
// These intentionally omit const/let to create globals
/* eslint-disable no-implicit-globals, no-undef */
i18next = require('i18next');
LanguageDetector = interop(require('i18next-browser-languagedetector'));
Backend = interop(require('i18next-chained-backend'));
LocalStorageBackend = interop(require('i18next-localstorage-backend'));
HTTPBackend = interop(require('i18next-http-backend'));
/* eslint-enable no-implicit-globals, no-undef */
const _defaults = require('./utils.js').defaults;
const getDefaults = () => {
return {
initAsync: false,
load: 'languageOnly',
fallbackLng: ['en'],
ns: ['translation', 'extjs'],
defaultNS: 'translation',
preload: ['en'],
debug: true,
detection: {
lookupLocalStorage: 'ext_i18nextLng'
},
backend: {
backends: [
LocalStorageBackend, // primary
HTTPBackend // fallback
],
backendOptions: [
{
prefix: 'ext_i18nextRes-',
defaultVersion: Ext.manifest.localeVersion || '0.1.0',
expirationTime: 365 * 24 * 60 * 60 * 1000
},
{
loadPath: (languages, namespaces) => {
// Handle both string and array (i18next-http-backend may pass either)
const ns = Array.isArray(namespaces) ? namespaces[0] : namespaces;
if (ns === 'extjs') {
return Ext.getResourcePath('locales/{{lng}}/{{ns}}.json', null, 'i18next');
}
return Ext.getResourcePath('locales/{{lng}}/{{ns}}.json');
}
}
]
}
};
};
let _options = {};
module.exports.init = (options = {}) => {
_options = _defaults(options, _options, getDefaults());
if (!options.backend?.backends) {
_options.backend.backends = getDefaults().backend.backends;
} else {
_options.backend.backends = _defaults(options.backend.backends, getDefaults().backend.backends);
}
if (!options.backend?.backendOptions?.[0]) {
_options.backend.backendOptions[0] = getDefaults().backend.backendOptions[0];
} else {
_options.backend.backendOptions[0] = _defaults(
options.backend.backendOptions[0],
getDefaults().backend.backendOptions[0]
);
}
if (!options.backend?.backendOptions?.[1]) {
_options.backend.backendOptions[1] = getDefaults().backend.backendOptions[1];
} else {
_options.backend.backendOptions[1] = _defaults(
options.backend.backendOptions[1],
getDefaults().backend.backendOptions[1]
);
}
i18next.use(LanguageDetector).use(Backend).init(_options);
i18next.on('initialized', function () {
i18next.on('languageChanged', function () {
window.location.reload();
});
});
};