Trying to create a possibility for admins to change translations on the current page without editing language files directly.
我正在使用 Angular 翻译,我想在插值之前捕获当前页面上的所有翻译文本。我需要什么:
translationId: original-value-without-interpolation
首先,我更改了翻译过滤器并编写了一个自定义插值器来返回一个对象,而不仅仅是插值。
interpolate: function (string, interpolateParams) {
return {
string: string,
interpolateParams: interpolateParams,
translated: $translateDefaultInterpolation.interpolate(string, interpolateParams)
};
}
然后在翻译过滤器中,我能够访问 translationId
和 original-value
。
不久之后,我想起我已经忘记了有关指令的所有内容,谁知道我可能还忘记了使用相同插值器的其他内容。
现在感觉找到一个替代方案会更安全,我可以在不编辑过滤器和指令的情况下捕获 translationId
和 original-value
。
是否有一个我可以自己连接但尚未找到的功能?
请记住,我只想捕获当前页面上的翻译,并且需要在替换 {{values}} 之前获取它们。
- Angular 1.2.28
- Angular 翻译 1.5.2
编辑:显然我可以访问翻译表$translateProvider.translations()
,我可以在插值之前获取值。然后我只需要追踪当前页面上使用的所有翻译。 (Edit2:无法在运行时访问 $translationTable)
最佳答案
我找到了解决方案。
我做的第一件事是创建一个自定义加载程序。这是基于默认的,但它也将所有加载的翻译存储到一个对象中。后来就流传下来了。
其次,我创建了一个 translate
过滤器和指令。这也很大程度上基于所提供的一个放置,并添加了:
过滤
angular.module('app')
.filter('translate', ['$parse', '$translate', 'TranslationsHandler', function ($parse, $translate, TranslationsHandler) {
var translateFilter = function (translationId, interpolateParams, interpolation) {
if ( ! angular.isObject(interpolateParams)) {
interpolateParams = $parse(interpolateParams)(this);
}
TranslationsHandler.addViewTranslation($translate.use(), translationId);
return $translate.instant(translationId, interpolateParams, interpolation);
};
// Since AngularJS 1.3, filters which are not stateless (depending at the scope)
// have to explicit define this behavior.
translateFilter.$stateful = true;
return translateFilter;
}]);
<小时/>
指令
angular.module('app')
.directive('translate', ['TranslationsHandler', '$translate', function (TranslationsHandler, $translate) {
return {
link: function (scope, el, attrs) {
TranslationsHandler.addViewTranslation($translate.use(), attrs.translate);
}
};
}]);
这两个都添加了 TranslationsHandler.addViewTranslation
由于我提到我正在尝试更改页面上的翻译,因此翻译对象如下所示:
var stuff = {
file: {}, // Data loaded from translation files
server: {}, // Already changed & saved translations but not yet merged with files
changed: {}, // Currently changed translations
current: {}, // Current view translations
merged: {} // All together in this order: file + server + changed
}
// When in translation mode, the merged array is the one passed to angular-translate as the translation table
// Also on state change I clear the current object so that I can fill that up again
// And I use $injector.get('$translate').refresh() this after every blur event on the input to change the translation. This way I am able to display the change on the page.
关于angularjs - 插值之前捕获页面上的所有翻译文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475092/