使用 i18next-http-backend 延迟加载翻译时页面闪烁
Page flickers when lazy-loading translations with i18next-http-backend
我不确定这是否真的是插件和我的配置问题,或者这是否只是标准行为。
我正在使用带有 i18next-http-backend 的 react-i18next 从 public 文件夹加载翻译文件。延迟加载是一个很好的好处,但我实际上使用的是后端插件,因为文件是在外部管理的(由非程序员),我无法预先知道哪些文件存在。我不是在服务器端工作,所以我不能直接从文件系统读取。
问题:我有一个可折叠部分,其内容仅在展开部分时呈现。当该内容需要之前未加载的翻译文件时,文件的获取似乎会触发页面重新加载:它会闪烁并向上滚动。
我觉得很奇怪,因为取文件导致页面闪烁。我想 i18next 正在更新,因为它正在加载一个新的命名空间并导致闪烁。那有意义吗?如果是这样,有没有办法告诉 http 后端所有命名空间(即 /public/locales 中的所有文件名),仍然保持延迟加载?我的配置中是否遗漏了什么?
这是我的配置:
import en from './en/translation.json';
import de from './de/translation.json';
const localResources = { ...de, ...en };
const customLocalBackend = {
type: 'backend',
init: function (services, backendOptions, i18nextOptions) {
/* use services and options */
},
read: function (language, namespace, callback) {
callback(null, localResources[language][namespace]);
},
};
export const i18n = i18next
.use(initReactI18next)
.use(ChainedBackend)
.use(LanguageDetector)
.init({
lng: 'de',
fallbackLng: 'de',
supportedLngs: ['de','en'],
load: 'languageOnly',
debug: true,
backend: {
backends: [
HttpBackend, // load resources from /public folder
customLocalBackend, // load local resources
],
backendOptions: [
{
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
{},
],
},
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
},
keySeparator: false,
});
感谢您的帮助!
问题是由包装完整 React 应用程序的 <React.Suspense fallback={<div />}>
引起的。当在 运行 时间注入一个新的翻译时,回退 div 被渲染,导致“闪烁”。
我删除了包装器并在 i18n 配置中设置了 react: { useSuspense: false }
,现在一切都按预期工作了。
我不确定这是否真的是插件和我的配置问题,或者这是否只是标准行为。
我正在使用带有 i18next-http-backend 的 react-i18next 从 public 文件夹加载翻译文件。延迟加载是一个很好的好处,但我实际上使用的是后端插件,因为文件是在外部管理的(由非程序员),我无法预先知道哪些文件存在。我不是在服务器端工作,所以我不能直接从文件系统读取。
问题:我有一个可折叠部分,其内容仅在展开部分时呈现。当该内容需要之前未加载的翻译文件时,文件的获取似乎会触发页面重新加载:它会闪烁并向上滚动。
我觉得很奇怪,因为取文件导致页面闪烁。我想 i18next 正在更新,因为它正在加载一个新的命名空间并导致闪烁。那有意义吗?如果是这样,有没有办法告诉 http 后端所有命名空间(即 /public/locales 中的所有文件名),仍然保持延迟加载?我的配置中是否遗漏了什么?
这是我的配置:
import en from './en/translation.json';
import de from './de/translation.json';
const localResources = { ...de, ...en };
const customLocalBackend = {
type: 'backend',
init: function (services, backendOptions, i18nextOptions) {
/* use services and options */
},
read: function (language, namespace, callback) {
callback(null, localResources[language][namespace]);
},
};
export const i18n = i18next
.use(initReactI18next)
.use(ChainedBackend)
.use(LanguageDetector)
.init({
lng: 'de',
fallbackLng: 'de',
supportedLngs: ['de','en'],
load: 'languageOnly',
debug: true,
backend: {
backends: [
HttpBackend, // load resources from /public folder
customLocalBackend, // load local resources
],
backendOptions: [
{
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
{},
],
},
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
},
keySeparator: false,
});
感谢您的帮助!
问题是由包装完整 React 应用程序的 <React.Suspense fallback={<div />}>
引起的。当在 运行 时间注入一个新的翻译时,回退 div 被渲染,导致“闪烁”。
我删除了包装器并在 i18n 配置中设置了 react: { useSuspense: false }
,现在一切都按预期工作了。