我在翻译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;
}
});
答案 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。