【问题标题】:angular translate using useStaticFilesLoader to load nested json使用 useStaticFilesLoader 加载嵌套 json 的角度翻译
【发布时间】:2015-11-05 05:37:19
【问题描述】:

我有一个像这样的嵌套 json 结构

    {
        "module1": {
            "component1": "text1",
            "component2": "text2" 
        }   
    }

所以在我的代码中,我使用的是{"module1.component1" | translate},它永远不会得到解决,而如果我这样做了

    {      
        "component1": "text1",
        "component2": "text2"           
    }

{"component1" | translate} 有效。有没有办法使用useStaticFilesLoader解析嵌套的 JSON 数据

编辑 1: 这是我的 useStaticFilesLoader 配置,如下所示:

$translateProvider.useStaticFilesLoader({
        prefix: './langfiles/',
        suffix: '.json'
      });
    $translate.use(lang);//lang is derived from header 

langfiles 包含: en_US.json 等

【问题讨论】:

  • 你在使用翻译过滤器吗?请通过 plunker 或在 stackoverflow 代码编辑器中发布您的控制器/创建一个运行示例。通过“json”进行过滤适用于任一数据,因此您的翻译过滤器最有可能是问题所在。
  • @Enkode:我不确定你是否听懂了我的问题。正如问题中提到的,当我尝试获取平面 json 文件时没有问题,但问题是当有嵌套的 json 数据时,路径不会被诸如 {"this.is.nested.data" 之类的角度转换过滤器解析|翻译}而这有效{“数据”|翻译} 。无论如何,如果您需要更多信息,请告诉我。
  • 我不明白你的问题,因为你没有明确说你正在使用 $translateProvider。

标签: javascript json angularjs angular-translate


【解决方案1】:

查看这篇文章:Accessing nested JSON objects 看看是否有帮助。他们的 JSFiddle 展示了如何做到这一点:http://jsfiddle.net/z1uLjg89/

// Including ngTranslate
angular.module("ngTranslate", ["ng"]).config(["$provide", function (n) {
    $TranslateProvider = function () {
        var n, t = {};
        this.translations = function (n, r) {
            if (!n && !r) return t;
            if (n && !r) {
                if (angular.isString(n)) return t[n];
                t = n
            } else t[n] = r
        }, this.uses = function (r) {
            if (!r) return n;
            if (!t[r]) throw Error("$translateProvider couldn't find translationTable for langKey: '" + r + "'");
            n = r
        }, this.$get = ["$interpolate", "$log", function (r, a) {
            return $translate = function (e, i) {
                var l = n ? t[n][e] : t[e];
                return l ? r(l)(i) : (a.warn("Translation for " + e + " doesn't exist"), e)
            }
        }]
    }, n.provider("$translate", $TranslateProvider)
}]), angular.module("ngTranslate").directive("translate", ["$filter", "$interpolate", function (n, t) {
    var r = n("translate");
    return {
        restrict: "A",
        scope: !0,
        link: function (n, a, e) {
            e.$observe("translate", function (r) {
                n.translationId = angular.equals(r, "") ? t(a.text())(n.$parent) : r
            }), e.$observe("values", function (t) {
                n.interpolateParams = t
            }), n.$watch("translationId + interpolateParams", function () {
                a.html(r(n.translationId, n.interpolateParams))
            })
        }
    }
}]), angular.module("ngTranslate").filter("translate", ["$parse", "$translate", function (n, t) {
    return function (r, a) {
        return angular.isObject(a) || (a = n(a)()), t(r, a)
    }
}]);

// Configuring your module, asking for ngTranslate as dependency
var app = angular.module('myApp', ['ngTranslate']);

// Configuring $translateProvider
app.config(['$translateProvider', function ($translateProvider) {

    // Simply register translation table as object hash
    $translateProvider.translations('en', {
        "SEARCH": {
            "SEARCH": "Recherce",
                "ABILITY": "Abilities",
                "MANAGEMENT": "Management Competencies",
                "PERSONAL": "Personal Suitability"
        },

            "ABILITIES": {
            "TITLE": "Test Title here",
                "ADVISORY": {
                "TITLE": "Advisory Skills",
                    "QUESTIONS": [{
                    "TYPE": "A",
                        "LEVEL": "45",
                        "DESCRIPTION": "Can you tell me how awesome you are"
                }, {
                    "TYPE": "B",
                        "LEVEL": "100",
                        "DESCRIPTION": "Tell me about your wicked project"
                }]
            }
        },

            "HEADLINE": "Oh No!",
            "SUB_HEADLINE": "Looks like you are not amazing"
    });

    var list = $translateProvider.translations('en');
    console.log(list);
    var getTitle = list.HEADLINE;
    var getSearch = list.SEARCH.ABILITY;
    console.log(getSearch);
    console.log(getTitle);
}]);
<div ng-app="myApp"></div>

一种可能的解决方法是扁平化您的 json 文件

Fastest way to flatten / un-flatten nested JSON objectsConvert complex JavaScript object to dot notation object

这个小提琴向你展示了它的样子:http://fiddle.jshell.net/blowsie/S2hsS/show/light/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多