在控制器中使用$ translate

时间:2016-04-01 00:47:03

标签: angularjs

我想在我的控制器中使用$translate,当我更改语言时,所有字符串都会被翻译,这在我使用时会起作用:{{'Menu.CANDIDATURES.VIEW' | translate}}但我也希望在我的控制器上使用它。 / p>

为此,我使用$watch如下:

.controller('CandidaturesDatatableCtrl', function ($scope, DTOptionsBuilder, DTColumnBuilder, $filter) {

    $scope.view = '';
    $scope.update = '';
    $scope.delete = '';

    $scope.$watch(
      function() { return $filter('translate')('ACTIONS.VIEW'); },
      function(newval) { $scope.view = newval; console.log(newval); }
    );

    $scope.$watch(
      function() { return $filter('translate')('ACTIONS.UPDATE'); },
      function(newval) { $scope.update = newval }
    );

    $scope.$watch(
      function() { return $filter('translate')('ACTIONS.DELETE'); },
      function(newval) { $scope.delete = newval }
    );

   // deleted code
        .renderWith(function(data, type, full, meta) {
          if (true) {
            return '<button class="btn btn-blue btn-primary btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.view+'</span></button>&nbsp;'
              + '<button class="btn btn-bl btn-success btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.update+'</span></button>&nbsp;'
              + '<button class="btn btn-danger btn-rounded btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.delete+'</span></button>';
          } else {
            return '';
          }

        })
    ];
  });

$watch工作正常,因为您可以在我的代码中看到有console.log(newval)记录新的翻译,但是$ scope.view,$ scope.update和$ scopte.delete没有得到我改变语言后翻译,所以我需要刷新页面才能看到新的翻译。

我该如何解决?

正如你所看到的,我写的代码非常难看,如果你知道其他方式,我将不胜感激。

编辑:

我尝试使用$translateChangeSuccess事件代替$watch,如下所示:

 .controller('CandidaturesDatatableCtrl', function ($scope, DTOptionsBuilder, DTColumnBuilder, $filter, $rootScope, $translate) {

    $scope.view = $filter('translate')('ACTIONS.VIEW');
    $scope.update = $filter('translate')('ACTIONS.UPDATE');
    $scope.delete = $filter('translate')('ACTIONS.DELETE');

    $rootScope.$on('$translateChangeSuccess', function() {
      $translate(['ACTIONS.VIEW','ACTIONS.UPDATE','ACTIONS.DELETE']).then(function (newval) {
        console.log(newval);
        $scope.view = newval['ACTIONS.VIEW'];
        $scope.update = newval['ACTIONS.UPDATE'];
        $scope.delete = newval['ACTIONS.DELETE'];
      });
    });
//...
      DTColumnBuilder.newColumn(null).withTitle('Actions').notSortable()
        .renderWith(function(data, type, full, meta) {
          if (true) {
            return '<button class="btn btn-blue btn-primary btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.view+'</span></button>&nbsp;'
              + '<button class="btn btn-bl btn-success btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.update+'</span></button>&nbsp;'
              + '<button class="btn btn-danger btn-rounded btn-ef btn-ef-5 btn-ef-5b mb-10"><i class="fa fa-trash"></i> <span>'+$scope.delete+'</span></button>';
          } else {
            return '';
          }

        })
    ];
  });

但它不起作用我的行为与使用$watch时的行为相同。

要查看我的代码是如何工作的,这是我加载它时的页面状态:

enter image description here

上一页是法语,然后我将其更改为英语:

enter image description here

你可以看到除了我在控制器中翻译的AfficherModifierSupprimer之外,所有标签都被翻译成了英文,你可以注意到控制台中的日志$translateChangeSuccess已经有效,但无法更改视图中的值。

1 个答案:

答案 0 :(得分:1)

不想看到那些观察者......你实际上可以听一些事件,即$ translateChangeSuccess

这里是plunker:http://plnkr.co/edit/njVZQ2plsXK95JvuxP1J?p=preview

$rootScope.$on('$translateChangeSuccess', function(){
  $translate(['ACTIONS.VIEW', 'ACTIONS.UPDATE']).then(function (result) {
    $scope.view = result['ACTIONS.VIEW'];
    $scope.update= result['ACTIONS.UPDATE'];
  });
});