【问题标题】:I18Next doesn't work when loading data from backend从后端加载数据时,I18Next 不起作用
【发布时间】:2019-09-19 15:43:51
【问题描述】:

我通过从后端 (i18next-xhr-backend) 获取数据来实现 i18next 与应用程序的集成。一切看起来都很好,我没有收到任何错误,但最终翻译不起作用。

我使用 Vue 和 Webpack。这是我的代码:

main.js:

...
import VueI18Next from "./i18next.js";
...
Vue.use(VueI18Next, (i18next) => {
  let router = require("./router").default; // Load only after i18next initialized

  new Vue({
    el: "#app",
    components: {
      App
    },
    router,
    store,
    render: h => h("app")
  });
});

i18next.js:

import Vue from "vue";
import { isFunction, defaultsDeep } from "lodash";
import i18next from "i18next";
import i18NextXHR from "i18next-xhr-backend";

function install(Vue, callback, options = {}) {
  i18next
    .use(i18NextXHR)
    .init(defaultsDeep({}, {
      lng: "en",
      debug: true,
      fallbackLng: "en",
      whitelist: ["en", "ru"],
      ns: ["app"],
      defaultNS: "app",
      load: "languageOnly",
      saveMissing: true,
      saveMissingTo: "all", // "fallback", "current", "all"

//piece of code #1
/*    resources: {
              en: {
                app: {
                  "SeeAllNotifications": "a b c",
                  "Test2": "Test 2"
                }
              }
            },*/

//piece of code #2
      backend: {
        // path where resources get loaded from
        loadPath: "/locales/resources.json?lng={{lng}}&ns={{ns}}",
        // path to post missing resources
        addPath: "/locales/add/{{lng}}/{{ns}}",
        // server supports multiloading
        allowMultiLoading: false,
        // allow cross domain requests
        crossDomain: false
      },
    }), (err, t) => {


      Vue.prototype.$lng = i18next.language;
      Vue.prototype._ = (key, opts) => {
        return t(key, opts);
      };

      console.log("I18Next initialized! Language: " + i18next.language);

      console.error('======TEST======' + i18next.t('SeeAllNotifications'));

      if (isFunction(callback))
        callback(i18next, t);
    });

  // Register as a filter
  Vue.filter("i18n", function(value, options) {
    return i18next.t(value, options);
  });

  // Register as a directive
  Vue.directive("i18n", {
    bind: function(el, binding, vnode) {
      el.innerHTML = i18next.t(binding.expression);
    }
  });

  Vue.prototype.$i18n = i18next;
  Vue.prototype._ = (key, opts) => {
    return i18next.t(key, opts);
  };
}

export default {
  install
};

资源 URL 正确。 http://localhost:4000/locales/resources.json?lng=en&ns=app 作为回应,我得到了正确的数据:

{"en":{"app":{"SeeAllNotifications":"查看所有通知",...}}}

当我加载页面时,我会收到以下消息:

i18next::backendConnector: loaded namespace app for language en 
{en: {…}}
    en:
        app: {SeeAllNotifications: "See all notifications", ...",
i18next: languageChanged en
i18next: initialized
I18Next initialized! Language: en

看起来一切都准备好了,但是我得到了:

======TEST======SeeAllNotifications
i18next::translator: missingKey en app SeeAllNotifications SeeAllNotifications

翻译已加载,但无法正常工作。如果不是使用代码#2 而是使用代码#1,那么一切正常,但我需要从后端加载资源。

我尝试了不同的选项,但没有任何帮助。我将不胜感激。

【问题讨论】:

  • 也许这有点离题但是当语言改变时你将如何更新组件?
  • @User28 我将使用 i18next-browser-languagedetector。它会给我很多机会。我现在不使用它,因为它现在无关紧要。

标签: javascript node.js vue.js webpack i18next


【解决方案1】:

您必须设置没有语言和命名空间的资源文件,因为您已经在loadPath 中指定了lngns

{
  "SeeAllNotifications": "a b c",
  "Test2": "Test 2"
}

或者你必须启用allowMultiLoading:

import BackendAdapter from "i18next-multiload-backend-adapter";
import XHR from "i18next-xhr-backend";

i18next
  .use(BackendAdapter)
  .init({
    ...
    backend: {
      backend: XHR,
      backendOption: {
        loadPath: "/locales/resources.json?lng={{lng}}&ns={{ns}}",
        addPath: "/locales/add/{{lng}}/{{ns}}",
        allowMultiLoading: true,
        ...
      }
    }
    ...
  }

Example

【讨论】:

  • 你说得对。问题实际上在于语言和ns。我也早些时候发现了这一点,现在我正在寻找如何解决这个问题。您的解决方案(i18next-multiload-backend-adapter)完美运行!现在一切都很好。顺便说一句,在我的翻译文件中没有语言和 ns,问题是不同的。我在后端使用 i18next-express-middleware (app.get('/locales/resources.json', i18nextExpress.getResourcesHandler(i18next));) ,据我了解,它仅适用于多语言模式并添加语言和 ns作为回应。
猜你喜欢
  • 2022-01-11
  • 2018-04-20
  • 2019-01-07
  • 2021-11-03
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多