在我可以在控制器中使用之前,如何让Angular-Translate预加载我的翻译?

时间:2014-02-03 01:28:32

标签: angularjs

我正在尝试使用Angular Translate,我需要在我的控制器中使用翻译,但控制器在我的翻译甚至加载之前运行代码。我的代码是:

var myApp = angular.module('myApp', ['pascalprecht.translate']);

angular.module('myApp').config(function ($translateProvider) {
  $translateProvider.useStaticFilesLoader({
    prefix: 'locales/validation-',
    suffix: '.json'
  });
  // load 'en' table on startup
    $translateProvider.preferredLanguage('en');
});

angular.module('myApp').controller('Ctrl', ['$scope', '$translate', function ($scope, $translate) {

  console.debug($translate('INVALID_INTEGER'));

  $scope.switchLanguage = function (key) {
    $translate.uses(key);
    console.debug($translate('INVALID_INTEGER'));
  };
}]);

在调用console.debug($translate('INVALID_INTEGER'));时,它始终显示INVALID_INTEGER而不是真实的翻译,因此我总结说我的翻译尚未加载。我是Angular和Angular-Translate的新手,所以我不确定下一步该做什么?我需要promise,我更喜欢angular-translate内的内置函数。我想要简单的语言环境语言来自每种语言的外部和单独的json文件。
编辑
我遇到的真正问题是我的所有翻译都直接在控制器内部使用,而不是在视图中使用。似乎angular-translate适用于视图中显示的任何内容,但在控制器中它不会刷新控制器本身内的代码。
请注意,我现在在Github上有一个有效的Beta项目,我在那里使用翻译...

Angular-Validation (表格验证变得简单)

我的项目是一个Angular指令并使用locales语言,如果你运行项目并在加载模板之前选择一种语言然后它可以工作,但之后调用$scope.switchLanguage()虽然视图上的任何翻译都有效,但对控制器没有任何影响。

1 个答案:

答案 0 :(得分:2)

好的,从上面的github项目可以看出,由于以下原因,翻译不起作用:

  1. ngxValidation指令中的链接代码仅在页面加载时运行一次,并将字符串转换为当前语言设置的任何内容。代码永远不会再次运行,除非您完全刷新页面,所以即使您使用$ translate.uses()更改语言,该指令也已经翻译并缓存了字符串,甚至没有尝试再次翻译它们。
  2. 多次单击“加载测试表单”时没有任何反应 - 视图不会重新加载(并且不会重新创建指令,doh!)。这并不奇怪,因为它是相同的观点!为什么angular会重新加载已加载的东西 - 它无法知道你改变了翻译,而你实际上想要在这个特殊情况下重新加载。
  3. 所以你会有一些解决方案,我认为最简单的解决方案是不缓存已翻译的字符串,只是及时翻译 - 在验证器()中。这应该永远有效。如果你想聪明地使用缓存,你必须找到一种方法来确保缓存总是有效的:)我们都知道计算机科学只有两个难题,一个是缓存失效,另一个是[ insert_whatever_youre_working_on_right_now_here]。


    详细说明:

    在您正在执行的指令中:

    messages[i] = $translate('INVALID_URL');
    

    将所有分配替换为:

    messages[i] = 'INVALID_URL';
    

    然后在验证器函数内执行:

    if(!isValid) {
      isFieldValid = false;
      message += $translate(messages[j]);
    }