angularjs - 插值之前捕获页面上的所有翻译文本

标签 angularjs angular-translate

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)
    };
}

然后在翻译过滤器中,我能够访问 translationIdoriginal-value

不久之后,我想起我已经忘记了有关指令的所有内容,谁知道我可能还忘记了使用相同插值器的其他内容。

现在感觉找到一个替代方案会更安全,我可以在不编辑过滤器和指令的情况下捕获 translationIdoriginal-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/

相关文章:

angularjs - Angular 翻译属性与过滤器

javascript - Angular 翻译:过滤器忽略 namespace

javascript - 使用 $translate 时获取所选语言

javascript - json 与对象中的比较

css - 如何在 angularjs 中为页面的一部分制作加载掩码?

php - 将数据写入mysql

ruby-on-rails - 如何在 Angular Translate Rails 中使用动态变量?

javascript - 三元运算符中的 Angular 翻译过滤器

javascript - AngularJS 中的时区在 ie9 文档模式下不正确

javascript - 将一个数组复制到另一个数组时出现问题