让我们首先重组你logEntry
的分离出 interpolateParams
var translationId = 'Log.' + msg.context.entity_type) + '.' + msg.context.action;
var interpolateParams = {
'object_name': msg.context.object_name,
'user': msg.context.user_name
};
var translated = $translate(translationId, interpolateParams);
return $sce.trustAsHtml(translated);
您想转义所有 HTML,interpolateParams
但在翻译模板中保留任何 HTML。使用此代码复制对象,迭代其值并替换为转义的 HTML。
var safeParams = angular.copy(interpolateParams);
angular.forEach(safeParams, function(value, key, obj) {
obj[key] = encodeEntities(value)
// if you want safe/sanitized HTML, use this instead
// obj[key] = $sanitize(value);
});
var translated = $translate(translationId, safeParams);
最后,encodeEntities
没有暴露 angular 的功能,所以我们不得不从angular-sanitize.js中借用源码
var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
// Match everything outside of normal chars and " (quote character)
NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
function encodeEntities(value) {
return value.
replace(/&/g, '&').
replace(SURROGATE_PAIR_REGEXP, function(value) {
var hi = value.charCodeAt(0);
var low = value.charCodeAt(1);
return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
}).
replace(NON_ALPHANUMERIC_REGEXP, function(value) {
return '&#' + value.charCodeAt(0) + ';';
}).
replace(/</g, '<').
replace(/>/g, '>');
}
更新:更新到 angular-translate 2.7.0 后出现此消息:
pascalprecht.translate.$translateSanitization:未配置任何清理策略。这可能会产生严重的安全隐患。有关详细信息,请参阅
http://angular-translate.github.io/docs/#/guide/19_security。
Sp 而不是trustlate
上面的答案, angular-translate 可以通过以下方式完成相同的结果:
$translateProvider.useSanitizeValueStrategy('escapeParameters');
有关更多清理价值策略的信息,请参阅文档