【问题标题】:Use i18next with XHR backend in client-side javascript在客户端 javascript 中使用 i18next 和 XHR 后端
【发布时间】:2026-01-15 12:10:02
【问题描述】:

i18next-xhr-backend 的文档告诉我使用import 加载他们的模块。但是当我使用import-statement 时,什么都没有发生,Firefox 在开发者控制台中给了我一个SyntaxError

SyntaxError: import declarations may only appear at top level of a module

那么我如何将 i18next 库与 XHR 后端一起使用?如果 .use(XHR)-line 和相应的导入被注释掉 (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();

【问题讨论】:

    标签: javascript import internationalization i18next


    【解决方案1】:

    我需要使用i18nextXHRBackend 而不仅仅是XHR,因为这是加载类的名称,就好像没有使用加载器一样。正如README.md 所说:

    如果你不使用模块加载器,它将被添加到 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");
                });
            });
        });
    });
    

    【讨论】: