【问题标题】:Using angular-translate's $translate.use() in the ui-router config file在 ui-router 配置文件中使用 angular-translate 的 $translate.use()
【发布时间】:2015-01-10 17:42:30
【问题描述】:

我正在尝试在我的 ui-router 配置文件 routes.js 中使用 $translate.use() 以便我可以切换切换语言的状态,但我得到了一个

未捕获的错误:[$injector:modulerr] 无法实例化模块 frontApp 由于: 错误:[$injector:unpr] 未知提供者:$translate

这是我的文件。

'use strict';

(function() {
    angular.module('frontApp')
        .run(['$rootScope', '$state', '$stateParams', function($rootScope, $state, $stateParams) {
            $rootScope.$state = $state;
            $rootScope.$stateParams = $stateParams;
        }]
    )
    .config(['$urlRouterProvider', '$stateProvider', '$locationProvider', '$translate', function($urlRouterProvider, $stateProvider, $locationProvider, $translate){
        $urlRouterProvider
            .otherwise('/');
        $stateProvider
            .state('home', {
                url: '/',
                templateUrl: '/views/home.html',
                controller: 'HomeCtrl'
            })
            .state('home.rules', {
                url: '^/rules',
                templateUrl: '/views/rules.html'
            })
            .state('home.terms', {
                url: '^/terms',
                templateUrl: '/views/terms.html'
            })
            .state('home.faq', {
                url: '^/faq',
                templateUrl: '/views/faq.html'
            })
            .state('language', {
                controller: function() {
                    console.log('ok');
                    $translate.use(($translate.use() === 'fr') ? 'en' : 'fr' );
                }
            });
        $locationProvider.html5Mode(true);
    }]);
}());

我还有一个包含我的翻译的 translation.js 文件,当不尝试在上述 routes.js 文件中注入和使用 $translate.use() 时,我使用 TranslateController 使用它没有问题:

'use strict';

(function() {
    angular.module('frontApp')
        .config(['$translateProvider', function($translateProvider) {
            $translateProvider
                .translations('fr', {
                    language: 'English',
                    otherLanguage: 'en',
                    cssClass: 'french',
                    linkHome: 'Accueil',
                    linkRules: 'Règlement',
                    linkTerms: 'Termes et conditions',
                    linkFAQ: 'FAQ',
                })
                .translations('en', {
                    language: 'Français',
                    otherLanguage: 'fr',
                    cssClass: 'english',
                    linkHome: 'Home',
                    linkRules: 'Rules',
                    linkTerms: 'Terms and conditions',
                    linkFAQ: 'FAQ',
                });
            $translateProvider.preferredLanguage('fr');
        }])
        .controller('TranslateController', ['$translate', '$scope', '$location', function ($translate, $scope, $location) {
            // The URLs need to be updated
            var host = $location.host();
            if ( host === 'localhost' || host === '0.0.0.0') {
                $translate.use('fr');
            }
            else if (host === 'localhost-en') {
                $translate.use('en');
            }
            $scope.switchLanguage = function() {
                $translate.use(($translate.use() === 'fr') ? 'en' : 'fr' );
            };
        }]);
}());

这里是 app.js:

'use strict';

angular
  .module('frontApp', [
    'ui.router',
    'ngAnimate',
    'ngCookies',
    'ngResource',
    'ngSanitize',
    'ngTouch',
    'pascalprecht.translate'
  ]);

我错过了什么?非常感谢您的时间和帮助。

【问题讨论】:

    标签: javascript angularjs angular-ui-router angular-translate


    【解决方案1】:

    这里的解决方案是将“$translate”的 DI 定义移动到它所属的位置,即移动到 controller 定义中:

     .state('language', {
     // instead of this
     // controller: function() {
    
     // use this
     controller: function($translate) {
    
          console.log('ok');
          $translate.use(($translate.use() === 'fr') ? 'en' : 'fr' );
        }
     });
    

    甚至更好controller: ['$translate', function($translate) {... }]

    为什么当前的解决方案不起作用?好吧,让我们看一下上面代码的摘录:

    // I. CONFIG phase
    .config(['$urlRouterProvider', '$stateProvider', '$locationProvider', '$translate'
           , function($urlRouterProvider, $stateProvider, $locationProvider, $translate){
        ...
        $stateProvider
            ...
            .state('language', {
                // II. CONTROLLER - RUN phase
                controller: function() {
    

    如我们所见,我们在 config 阶段要求上面的$translate。所以我们收到要配置的提供程序。

    但控制器定义需要提供服务 - 已配置。它必须有自己的DI ...因为它将在RUN阶段执行...

    还可以查看此问答以了解有关配置与运行阶段提供程序的更多详细信息 - Getting Error: Unkown provider: $urlMatcherFactory

    【讨论】:

    • 谢谢!实际上我创建了一个 LanguageSwitcher 服务并且得到了同样的错误。所以现在在您的帮助下能够正确使用它。再次感谢!
    • 很高兴见到这位先生,享受 UI-Router 的乐趣 ;) 很棒的库 ... ;)
    猜你喜欢
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2015-11-18
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多