如何同时在自定义 Typescript 库和主机上使用 i18next?

How to use i18next on a custom Typescript library and a host at the same time?

我正在制作一个接受对象并吐出 excel 的打字稿库。这个库应该与几个 React 应用程序一起使用。每个 React 应用程序 [Host] 将提供一个对象和自定义库 returns 一个 excel.

所有 React 应用程序都使用 i18next 进行翻译。自定义库还需要使用自己的一组翻译,以便也有 i18next。我试图避免将翻译字符串从主机传递到我的图书馆。

问题: 一旦我调用我的库中的任何函数,库中的 i18next 就会接管 Host 的 i18n。这是预期的,因为我们有两个 i18next.init() 函数 [一个在我的库中,一个在主机中]。最后被调用的人获胜[在我的例子中是图书馆]。由于库中新初始化的 i18next 看不到主机翻译,因此主机中的所有翻译字符串都已丢失 [由库的 i18nxt]。

问题:

如果我需要在库和主机上都保留 i18n,我该如何解决这个问题?我希望两者都有自己的翻译。

我相信您不需要任何代码就能理解这个问题。

当我更新我的问题时,我已经设法让它工作了。就我而言,我有多个使用我的库的反应主机应用程序。有些主机没有安装 i18next,有些主机已经将其作为依赖项安装。我需要一种方法来检测 i8next 是否已初始化。如果没有初始化,用excel代库资源初始化。下面是我根据 i18next 的状态检测和 adding/updating 资源的代码。对于我的图书馆资源,我使用的是命名空间,因此不会出现名称冲突。您可以访问您的图书馆资源,例如 t("tkdirectequibuild:heading")。我必须始终指定名称空间和密钥,这还不错。我将 lang 保留为可选,因为 i18next 可以在已经实例化的主机的情况下检测语言。

import i18next from "i18next";
import enResources from "./translations/en/translation.json";
import frResources from "./translations/fr/translation.json";

export function addExcelResource(lang?: string) {
  if (i18next.isInitialized) {
    console.info("i18Next Exists");
    if (!i18next.hasResourceBundle("en", "tkdirectequibuild")) {
      console.info("en-Added");
      i18next.addResourceBundle("en", "tkdirectequibuild", enResources);
    }
    if (!i18next.hasResourceBundle("fr", "tkdirectequibuild")) {
      console.info("fr-Added");
      i18next.addResourceBundle("fr", "tkdirectequibuild", frResources);
    }
    if (lang) {
      i18next.changeLanguage(lang);
    }
  } else {
    console.info("i18Next is missing in the HOST. Adding our own");
    i18next.init({
      lng: lang,
      ns: ["tkdirectequibuild"],
      initImmediate: false,
      resources: {
        en: {
          tkdirectequibuild: enResources,
        },
        fr: {
          tkdirectequibuild: frResources,
        },
      },
    });
  }

  return i18next;
}

在调用库函数中,我添加了这些行,

const i18n = addExcelResource(lang); const { t } = i18n;