乐闻世界logo
搜索文章和话题

i18next 常见问题及解决方案有哪些?

2月18日 22:06

常见问题

1. 翻译不显示

问题: 调用 t() 函数返回键名而不是翻译文本

原因:

  • 翻译资源未正确加载
  • 命名空间配置错误
  • 语言代码不匹配

解决方案:

javascript
// 检查翻译资源是否加载 console.log(i18next.store.data); // 确保语言代码匹配 i18next.init({ lng: 'en', // 确保与资源中的键匹配 resources: { en: { translation: { welcome: 'Welcome' } } } }); // 检查命名空间 i18next.init({ ns: ['translation', 'common'], defaultNS: 'translation' });

2. 语言切换不生效

问题: 调用 changeLanguage() 后翻译没有更新

原因:

  • 组件没有监听语言变化
  • 翻译资源未加载
  • React 组件没有重新渲染

解决方案:

javascript
// React 组件中使用 useTranslation function MyComponent() { const { t, i18n } = useTranslation(); useEffect(() => { const handleLanguageChange = () => { // 语言变化时重新渲染 }; i18n.on('languageChanged', handleLanguageChange); return () => { i18n.off('languageChanged', handleLanguageChange); }; }, [i18n]); return <h1>{t('welcome')}</h1>; } // 确保翻译资源已加载 await i18next.loadLanguages(['zh', 'fr']);

3. 插值不工作

问题: 使用 {{variable}} 插值时变量没有被替换

原因:

  • 插值配置错误
  • 变量名拼写错误
  • 转义设置问题

解决方案:

javascript
// 检查插值配置 i18next.init({ interpolation: { escapeValue: false, // React 中通常设为 false prefix: '{{', suffix: '}}' } }); // 确保变量名正确 t('greeting', { name: 'John' }); // 翻译资源 { "greeting": "Hello {{name}}" }

4. 复数处理不正确

问题: 复数形式显示不正确

原因:

  • 复数规则配置错误
  • 语言不支持默认复数规则

解决方案:

javascript
// 为特定语言配置复数规则 i18next.init({ lng: 'ru', resources: { ru: { translation: { "item_one": "один предмет", "item_few": "{{count}} предмета", "item_many": "{{count}} предметов", "item_other": "{{count}} предмет" } } } }); // 使用正确的复数键 t('item', { count: 1 }); // один предмет t('item', { count: 2 }); // 2 предмета t('item', { count: 5 }); // 5 предметов

5. 性能问题

问题: 翻译加载缓慢,影响应用性能

原因:

  • 加载了过多翻译资源
  • 没有使用缓存
  • 网络请求过多

解决方案:

javascript
// 使用延迟加载 i18next.init({ ns: ['translation'], // 只加载必要的命名空间 defaultNS: 'translation' }); // 需要时加载其他命名空间 i18next.loadNamespaces(['admin', 'settings']); // 使用缓存 import LocalStorageBackend from 'i18next-localstorage-backend'; i18next .use(LocalStorageBackend) .init({ backend: { expirationTime: 7 * 24 * 60 * 60 * 1000 // 7天 } }); // 预加载关键资源 i18next.init({ preload: ['en', 'zh'] });

6. 缺失翻译处理

问题: 缺失的翻译显示键名而不是回退文本

解决方案:

javascript
// 配置缺失翻译处理 i18next.init({ fallbackLng: 'en', saveMissing: true, missingKeyHandler: (lng, ns, key) => { console.warn(`Missing translation: ${lng}.${ns}.${key}`); // 发送到翻译管理系统 reportMissingTranslation(lng, ns, key); }, parseMissingKeyHandler: (key) => { return `Translation missing: ${key}`; } });

7. SSR 问题

问题: 服务端渲染时翻译不显示

解决方案:

javascript
// Next.js 示例 import { appWithTranslation } from 'next-i18next'; export default appWithTranslation(MyApp); // 服务端获取翻译 export async function getServerSideProps({ locale }) { return { props: { ...(await serverSideTranslations(locale, ['common', 'home'])) } }; }

8. 内存泄漏

问题: 组件卸载后事件监听器未清理

解决方案:

javascript
function MyComponent() { const { i18n } = useTranslation(); useEffect(() => { const handleLanguageChange = () => { console.log('Language changed'); }; i18n.on('languageChanged', handleLanguageChange); // 清理事件监听器 return () => { i18n.off('languageChanged', handleLanguageChange); }; }, [i18n]); return <div>Content</div>; }

调试技巧

启用调试模式

javascript
i18next.init({ debug: true, // 启用调试日志 initImmediate: false });

检查翻译资源

javascript
console.log('Current language:', i18next.language); console.log('Loaded languages:', i18next.languages); console.log('Translation data:', i18next.store.data); console.log('Namespaces:', i18next.store.data[i18next.language]);

监听事件

javascript
i18next.on('loaded', (loaded) => { console.log('Resources loaded:', loaded); }); i18next.on('failedLoading', (lng, ns, msg) => { console.error('Failed to load:', { lng, ns, msg }); }); i18next.on('languageChanged', (lng) => { console.log('Language changed to:', lng); });

最佳实践

  1. 错误处理: 始终处理初始化和加载错误
  2. 调试模式: 开发环境启用调试模式
  3. 日志记录: 记录关键事件和错误
  4. 性能监控: 监控翻译加载性能
  5. 单元测试: 编写测试覆盖常见问题
  6. 文档: 记录配置和使用方法
  7. 版本控制: 使用版本号管理翻译资源
标签:i18next