如何同时在自定义 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;
我正在制作一个接受对象并吐出 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;