【问题标题】:How to load Angular-translate before any UI is displayed with ui-router resolve如何在使用 ui-router resolve 显示任何 UI 之前加载 Angular-translate
【发布时间】:2016-09-11 20:08:51
【问题描述】:

我将angular-translate 用于 i18n。我想将$translatePartialLoader 服务用于模块化语言键作为延迟加载。我也想为此使用ui-router resolve 选项。

现在该怎么做?可以为我添加代码示例吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    我找到解决方案并解决我的问题。

    在配置中:

    $translatePartialLoaderProvider.addPart('index');
            $translateProvider
                .useSanitizeValueStrategy(null)
                .fallbackLanguage('en-us')
                .registerAvailableLanguageKeys(['en-us','pt-br'], {
                    'en_*': 'en-us',
                    'pt_*': 'pt-br'
                })
                .useLoader('$translatePartialLoader', {
                    urlTemplate: '{part}/locale_{lang}.json'
                })
                .useLoaderCache(true)
                .useCookieStorage()
                .determinePreferredLanguage();
    

    ui-router 中为索引:

    .state('index', {
        url: '/index',
        templateUrl: 'index.html',                   
        controller:'IndexCtrl',
        resolve: {
            trans:['RequireTranslations',
                function (RequireTranslations) {
                    RequireTranslations('index');
                }],
            dep: ['trans','$ocLazyLoad',
                function(trans,$ocLazyLoad){
                    return $ocLazyLoad.load(['plugin']).then(
                        function(){
                            return $ocLazyLoad.load(['IndexCtrl.js']);
                        }
                    );
                }]
        }
    })
    .state('index.users',{
        url: "/users",
        templateUrl: "users.html",
        controller:'UserListCtrl',
        resolve: {
            trans:['RequireTranslations',
                function (RequireTranslations) {
                    RequireTranslations('modules/user');
                }],
            dep: ['trans','$ocLazyLoad',
                function(trans,$ocLazyLoad){
                    return $ocLazyLoad.load(['UserListCtrl.js'])
                }]
    
        }
    })
    

    run:

    app.run(function($rootScope,$translate) {
    
        // translate refresh is necessary to load translate table
        $rootScope.$on('$translatePartialLoaderStructureChanged', function () {
            $translate.refresh();
        });
    
        $rootScope.$on('$translateChangeEnd', function() {
            // get current language
            $rootScope.currentLanguage = $translate.use();
        });
    })
    

    RequireTranslations工厂:

    app.factory('RequireTranslations', function($translatePartialLoader, $translate,$rootScope) {
        return function() {
            angular.forEach(arguments, function(translationKey) {
                $translatePartialLoader.addPart(translationKey);
            });
            return $translate.refresh().then(
                function(){
                    return $translate.use($rootScope.currentLanguage);
                }
            );
        };
    });
    

    请注意,您应该在所有controllers 中添加$translatePartialLoadertrans 作为参数,如下所示:

    app.controller('UserListCtrl',function($scope,...,$translatePartialLoader,trans){
    

    【讨论】:

    • 非常有帮助的答案帮助我解决了我面临的问题
    猜你喜欢
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多