Angular Translate - 如何检索动态变量列表

时间:2015-07-15 15:17:17

标签: angularjs translate

我在翻译json文件中有这个:

{ 
  "test_key" : "Var1: {{var1}} Var2: {{var2}} Var3: {{var3}}" 
}

为此,我需要提供var1,var2和var 3.例如:

$translate('test_key', { var1: 1, var2: 2, var3: 3 });

现在的问题是var1,var2,var3可以是任何动态变量。我现在需要的是获取所有动态变量列表,以便我可以提供它可能需要的任何值。

理想情况下,这是我想要实现的目标(伪代码)

var dynamicVars = getDynamicVarList(); // I need this, but how? 
dynamicVars.forEach(function (key) {
    switch (key) {
        case "var1":
            return 1;

        case "var2":
            return 2;

        case "var3":
            return 3;

        default:
            return null;
    }
});

2 个答案:

答案 0 :(得分:1)

如果 Pascal Precht翻译,则在应用程序初始化之前在模块选项中设置 JSON 文件。使用标准机制是不可能的。它提供 JSON ,但是当它被加载时,很难改变一些东西,而不改变角度转换模块的源代码。 如果您希望这样做的原因是有多种语言,那么您可以在 $ translate 中设置多种语言代码。 另一个解决方案是从服务器加载JSON,它对var1,var2,var3执行操作,因此返回静态json,但您可以使用命令执行 $ http 调用以更改switch语句中的变量。 它看起来有点语言学方法, Java 对此有好处。 Grails 可能是返回REST服务的良好框架。

答案 1 :(得分:0)

同样,为了重申这个问题,问题在于您事先并不知道要使用哪个动态变量。

我使用客户插补器解决了这个问题。

所以当你这样做时

  

{{ '密押' |翻译}}

你的lang.json有:

  

“testkey”:“这是数字{{variable1}}”

它将被解析为

  

这是1号

代码:

app.factory('customTranslateInterpolator',
            ["$interpolate",

            function ($interpolate) {
                var $locale;
                var customTranslateInterpolator = {};

                /**
                 * This will be your custom dynamic vars resolution method
                 */
                var resolveExpressions = function (expressions) {
                    var values = {};
                    expressions.forEach(function (key) {
                        values[key] = resolveVariable(key);
                    });
                    return values;
                }

                /**
                 * The actual method for key:value mapping
                 */
                var resolveVariable = function(key) {
                    var retVal;

                    switch (key) {
                        case "variable1":
                            retVal = 1;
                            break;

                        default:
                            retVal = "";
                    }

                    return retVal;
                }

                customTranslateInterpolator.setLocale = function (locale) {
                    $locale = locale;
                }
                customTranslateInterpolator.getInterpolationIdentifier = function () {
                    return 'custom';
                },

                /**
                 * Custom interpolate
                 * interpolateParams will overwrite resolve expressions. This will allow developers
                 * to pass values to the translate directives or by using $translate service.
                 * 
                 * @param {string} string the string retrieved from the language json file
                 * @param {object} interpolateParams the {key:value} object passed to the angular-translate features.
                 */
                customTranslateInterpolator.interpolate = function (string, interpolateParams) {
                    var result;
                    interpolateParams = interpolateParams || {
                    };

                    // Retrieve expressions and resolve them
                    var interpolatedString = $interpolate(string);
                    var resolvedExpressions = resolveExpressions(interpolatedString.expressions);

                    // Merge interpolateParams onto resolvedExpressions so that interpolateParams overwrites resolvedExpressions
                    angular.extend(resolvedExpressions, interpolateParams);

                    result = interpolatedString(resolvedExpressions);
                    return result;
                }
                return customTranslateInterpolator;
            }]);

确保让angular-translate知道您正在使用自定义插补器

  

$ translateProvider.useInterpolation( 'customTranslateInterpolator');

请注意,您仍然可以提供自己的翻译值,这将覆盖您在resolveVariable()

中的所有内容

所以,如果你这样做

  

{{'testkey'|翻译: “{变量1: '2'}”}}

它将解析为

  

这是2号

希望这有助于其他人。

-Lucky M。