在客户端使用带有 XHR 后端的 i18next javascript
Use i18next with XHR backend in client-side javascript
i18next-xhr-backend 的文档告诉我使用 import
加载他们的模块。但是当我使用 import
语句时,没有任何反应,Firefox 在开发人员控制台中给我一个 SyntaxError
:
SyntaxError: import declarations may only appear at top level of a module
那么如何将 i18next 库与 XHR 后端一起使用?如果 .use(XHR)
行和相应的导入被注释掉 (Warning: i18next::backendConnector: No backend was added via i18next.use. Will not load resources.
),则以下代码示例有效。但它失败了,如果不是:ReferenceError: XHR is not defined
//import Fetch from 'i18next-fetch-backend';
let t = null;
i18next
.use(XHR)
.init({
debug: true,
fallbackLng: ['en'],
preload: ['en'],
ns: 'translation',
defaultNS: 'translation',
keySeparator: false, // Allow usage of dots in keys
nsSeparator: false,
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
}, (err, _t) => {
if (err) {
reject(err);
return;
}
t = _t;
//resolve();
});
jqueryI18next.init(i18next, $, {
tName: 't', // --> appends $.t = i18next.t
i18nName: 'i18n', // --> appends $.i18n = i18next
handleName: 'localize', // --> appends $(selector).localize(opts);
selectorAttr: 'data-i18n', // selector for translating elements
targetAttr: 'i18n-target', // data-() attribute to grab target element to translate (if different than itself)
optionsAttr: 'i18n-options', // data-() attribute that contains options, will load/set if useOptionsAttr = true
useOptionsAttr: false, // see optionsAttr
parseDefaultValueFromContent: true // parses default values from content ele.val or ele.text
});
$(".nav").localize();
我需要使用 i18nextXHRBackend
而不是 XHR
,因为这是 class 加载的名称,就好像没有使用加载程序一样。正如 README.md 所说:
If you don't use a module loader it will be added to window.i18nextXHRBackend
我以前没有看到,我不知道这会自动发生,但如果不使用模块加载器,你似乎必须自己找到它。经验教训,希望这能帮助其他一些新手卡在如何使用 javascript 中的模块上。因此,我完整的 localisation.js
看起来像这样:
$(document).ready(function() {
i18next
.use(i18nextXHRBackend)
.use(i18nextBrowserLanguageDetector)
.init({
debug: true,
backend: {
loadPath: 'locales/{{lng}}/{{ns}}.json',
addPath: 'locales/add/{{lng}}/{{ns}}'
}
}, function(err, t) {
jqueryI18next.init(i18next, $);
$('.translatable').localize();
$('.language-button').click(function() {
i18next.changeLanguage(this.firstElementChild.alt).then(function(t) {
$('.translatable').localize();
$('#signupPassword').pwstrength("forceUpdate");
$('#signupPasswordConfirm').pwstrength("forceUpdate");
});
});
});
});
i18next-xhr-backend 的文档告诉我使用 import
加载他们的模块。但是当我使用 import
语句时,没有任何反应,Firefox 在开发人员控制台中给我一个 SyntaxError
:
SyntaxError: import declarations may only appear at top level of a module
那么如何将 i18next 库与 XHR 后端一起使用?如果 .use(XHR)
行和相应的导入被注释掉 (Warning: i18next::backendConnector: No backend was added via i18next.use. Will not load resources.
),则以下代码示例有效。但它失败了,如果不是:ReferenceError: XHR is not defined
//import Fetch from 'i18next-fetch-backend';
let t = null;
i18next
.use(XHR)
.init({
debug: true,
fallbackLng: ['en'],
preload: ['en'],
ns: 'translation',
defaultNS: 'translation',
keySeparator: false, // Allow usage of dots in keys
nsSeparator: false,
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
}, (err, _t) => {
if (err) {
reject(err);
return;
}
t = _t;
//resolve();
});
jqueryI18next.init(i18next, $, {
tName: 't', // --> appends $.t = i18next.t
i18nName: 'i18n', // --> appends $.i18n = i18next
handleName: 'localize', // --> appends $(selector).localize(opts);
selectorAttr: 'data-i18n', // selector for translating elements
targetAttr: 'i18n-target', // data-() attribute to grab target element to translate (if different than itself)
optionsAttr: 'i18n-options', // data-() attribute that contains options, will load/set if useOptionsAttr = true
useOptionsAttr: false, // see optionsAttr
parseDefaultValueFromContent: true // parses default values from content ele.val or ele.text
});
$(".nav").localize();
我需要使用 i18nextXHRBackend
而不是 XHR
,因为这是 class 加载的名称,就好像没有使用加载程序一样。正如 README.md 所说:
If you don't use a module loader it will be added to window.i18nextXHRBackend
我以前没有看到,我不知道这会自动发生,但如果不使用模块加载器,你似乎必须自己找到它。经验教训,希望这能帮助其他一些新手卡在如何使用 javascript 中的模块上。因此,我完整的 localisation.js
看起来像这样:
$(document).ready(function() {
i18next
.use(i18nextXHRBackend)
.use(i18nextBrowserLanguageDetector)
.init({
debug: true,
backend: {
loadPath: 'locales/{{lng}}/{{ns}}.json',
addPath: 'locales/add/{{lng}}/{{ns}}'
}
}, function(err, t) {
jqueryI18next.init(i18next, $);
$('.translatable').localize();
$('.language-button').click(function() {
i18next.changeLanguage(this.firstElementChild.alt).then(function(t) {
$('.translatable').localize();
$('#signupPassword').pwstrength("forceUpdate");
$('#signupPasswordConfirm').pwstrength("forceUpdate");
});
});
});
});