建议按以下方式组织资源文件:
locales/
├── en/
│ ├── translation.json # 默认命名空间
│ ├── common.json # 通用翻译
│ └── errors.json # 错误信息
└── zh/
├── translation.json
├── common.json
└── errors.json配置多个命名空间:
export default defineRuntimeConfig({
i18n: {
initOptions: {
ns: ['translation', 'common', 'errors'],
defaultNS: 'translation',
},
},
});使用命名空间:
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation('common');
return <div>{t('welcome')}</div>;
}建议在资源加载失败时提供回退方案:
当使用 SDK 后端或需要确保资源已加载时,使用 useModernI18n 中的 isResourcesReady:
import { useModernI18n } from '@modern-js/plugin-i18n/runtime';
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { isResourcesReady } = useModernI18n();
const { t } = useTranslation();
// 检查资源是否已加载并准备好
if (!isResourcesReady) {
return <div>正在加载翻译资源...</div>;
}
return <div>{t('content', { defaultValue: 'Default content' })}</div>;
}对于简单场景,也可以检查 i18next 的初始化状态:
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t, i18n } = useTranslation();
// 检查 i18n 是否已初始化
if (!i18n.isInitialized) {
return <div>Loading...</div>;
}
return <div>{t('content', { defaultValue: 'Default content' })}</div>;
}
对于 SDK 后端场景,isResourcesReady 更准确,因为它会检查所有必需的资源是否实际已加载,而不仅仅是检查实例是否已初始化。
为翻译键添加类型定义,提高开发体验:
// types/i18n.d.ts
import 'react-i18next';
declare module 'react-i18next' {
interface CustomTypeOptions {
defaultNS: 'translation';
resources: {
translation: {
hello: string;
world: string;
welcome: string;
};
common: {
submit: string;
cancel: string;
};
};
}
}使用类型安全的翻译:
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
// TypeScript 会检查键是否存在
return <div>{t('hello')}</div>; // ✅ 类型安全
// return <div>{t('invalid')}</div>; // ❌ TypeScript 错误
}