常见问题
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. 内存泄漏
问题: 组件卸载后事件监听器未清理
解决方案:
javascriptfunction 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>; }
调试技巧
启用调试模式
javascripti18next.init({ debug: true, // 启用调试日志 initImmediate: false });
检查翻译资源
javascriptconsole.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]);
监听事件
javascripti18next.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); });
最佳实践
- 错误处理: 始终处理初始化和加载错误
- 调试模式: 开发环境启用调试模式
- 日志记录: 记录关键事件和错误
- 性能监控: 监控翻译加载性能
- 单元测试: 编写测试覆盖常见问题
- 文档: 记录配置和使用方法
- 版本控制: 使用版本号管理翻译资源