You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:09:59