如何通过ngx-translate的TranslateService.get()获取嵌套JSON翻译值
解决TranslateService返回扁平翻译结构的问题
这个场景我太熟悉了!Angular的TranslateService(应该是ngx-translate吧?)默认在批量请求带点分隔的嵌套翻译键时,确实会返回扁平的键值对,而不是我们预期的嵌套对象。不过有两个简单的办法能满足你的需求:
方法一:直接获取父级翻译节点
如果你的目标是获取LANG下的所有子翻译,没必要逐个指定子键,直接请求LANG这个父级键就行:
this.translate.get('LANG') .subscribe((langTranslations) => { console.log(langTranslations.French); // 输出 "Français" console.log(langTranslations.English); // 输出 "Anglais" });
这样返回的langTranslations就是你预期的嵌套结构,完全不用处理扁平数据。
方法二:手动将扁平结构转换为嵌套结构
如果你确实需要批量获取不同路径的翻译键(比如同时要LANG.French和其他非LANG下的键),可以写一个小工具函数把扁平对象转成嵌套结构:
// 扁平对象转嵌套对象的工具函数 function convertFlatToNested(flatData: Record<string, any>): Record<string, any> { const nestedObj = {}; Object.entries(flatData).forEach(([fullKey, value]) => { const keyParts = fullKey.split('.'); let currentLevel = nestedObj; keyParts.forEach((key, index) => { if (index === keyParts.length - 1) { currentLevel[key] = value; } else { currentLevel[key] = currentLevel[key] || {}; currentLevel = currentLevel[key]; } }); }); return nestedObj; } // 使用示例 this.translate.get(['LANG.French', 'LANG.English', 'LANG.Dutch']) .subscribe((flatTranslations) => { const nestedTranslations = convertFlatToNested(flatTranslations); console.log(nestedTranslations.LANG.French); // 现在能正常访问啦 });
补充说明
为什么TranslateService默认返回扁平结构?其实是为了灵活性——如果你的翻译键里包含特殊字符(比如某些语言里的点),或者你需要同时请求不同层级的零散键,扁平结构能避免解析冲突。但如果是明确的嵌套结构需求,上面两个方法都能完美解决问题。
内容的提问来源于stack exchange,提问作者Abel
相关产品推荐
相关产品推荐

