i18n中如何直接调用嵌套命名空间内的翻译键避免前缀冗余写法
问题解决方案
你想要的免前缀调用效果完全可以实现,不需要给每个翻译键加前缀,以下是两种可落地的实现方案:
方案1:拆分翻译文件为真实分层命名空间(推荐中大型项目使用)
i18next原生支持用路径格式定义命名空间,你只需要调整翻译文件的目录结构,把原本嵌套在contract.json里的index字段单独拆分为独立文件:
- 原结构:
locales/{{语言}}/contract.json里嵌套index字段 - 新结构:
locales/{{语言}}/contract/index.json,文件内容直接为:
{ "pageTitle": "Contract" }
然后在调用时直接传入路径格式的命名空间即可:
const { t, i18n } = useTranslation('contract/index', { useSuspense: false }); // 直接调用无需前缀 t('pageTitle')
这种方式更符合大项目的翻译文件拆分规范,后续维护和扩展更清晰。
方案2:保留现有JSON结构,使用keyPrefix配置(无需调整现有文件)
如果你不想改动现有翻译文件的嵌套结构,可以直接使用useTranslation hook 自带的keyPrefix参数指定统一的键前缀:
const { t, i18n } = useTranslation('contract', { useSuspense: false, keyPrefix: 'index' }); // 直接调用无需前缀 t('pageTitle')
该配置会自动给当前hook返回的t函数的所有调用加上指定前缀,完全满足你的使用需求。
补充说明
你之前尝试的contract:index、contract.index写法不生效,是因为i18next中冒号是命名空间与翻译键的分隔符,仅在翻译键调用场景下生效,不能直接作为命名空间参数传入useTranslation。
内容的提问来源于stack exchange,提问作者Pelicer
相关产品推荐
相关产品推荐

