[重构/日常工作] 在提供者重新渲染时保留 i18next 实例
作者: hyoban创建于 2026年9月17日更新于 2026年9月17日
标签project#dify
描述:保留 i18next 实例,直到装载的 `I18nClientProvider` 生命周期结束。`web/app/components/provider/i18n.tsx` 在渲染体中直接调用 `createI18nextInstance(locale, resource)`。`web/i18n-config/client.ts` 中的工厂每次都会创建和初始化一个新实例,包括 `initReactI18next`。一个组件级的诊断,使用实际源代码和完全填充的 en-US/zh-Hans 资源对象:1. 使用 `locale="en-US"` 来调用提供者,并捕获返回的 `I18nextProvider` 元素上的实例。2. 等待 `instance.changeLanguage('zh-Hans')`。3. 使用相同的属性再次调用提供者。4. 比较返回的实例和翻译。观察到的结果:`sameInstance=false`,旧实例的语言为 `zh-Hans`,新实例的语言为 `en-US`;翻译标记恢复为英语。此诊断直接调用组件函数;它 **不是一个已装载的 React 重新渲染测试或特定导航路径的端到端重现**。它展示了渲染构建了一个新实例并丢弃了之前实例的语言状态。在实现过程中应创建一个已装载的回归测试和一个真实的触发路径。共享/嵌入式聊天消费者更改现有实例的语言,因此其生命周期很重要。
内容来源: langgenius/dify