угловой перевод получить решение о языке по умолчанию с сервера

Я использую angular-translate для поддержки нескольких языков. У меня есть 4 языка json на местном уровне. (en.json, ru, json, is.json, jp.json), и я написал код, как показано ниже, в конфигурации приложения

app.config(['$stateProvider' , '$urlRouterProvider', '$translateProvider', 'TENANT_KEY', 'LANG_KEY',
    function ($stateProvider, $urlRouterProvider, $translateProvider, TENANT_KEY) {
        'use strict';
        ...
        $translateProvider.useStaticFilesLoader({
                    prefix: '/assets/languages/',
                    suffix: '.json'
                });

        $translateProvider.preferredLanguage('en');
        ...
        }]);

Вот вопрос: я хочу, чтобы приложение запускалось с языка на стороне сервера, как в прошлый раз, когда я выбирал «ru» в качестве текущего языка, и в следующий раз, когда я открою приложение, язык по умолчанию будет «ru».

Я написал localService, чтобы запомнить выбор языка, но в app.config мы не можем использовать сервис, что мне с ним делать?

angular.module('storm.common')
    .constant('LANG_KEY', 'lang')
    .service('LocaleService', ['PersistenceService', 'LANG_KEY', '$window', '$translate',
        function (PersistenceService, LANG_KEY, $window, $translate) {
            'use strict';
            // 'is' is used for i18n team for their testing !!!
            var supportedLocale = ['en', 'ja', 'ru', 'is'];
            this.set = function (locale) {
                if (!locale) {
                    if (PersistenceService.get(LANG_KEY)) {
                        locale = PersistenceService.get(LANG_KEY);
                    } else {
                        locale = ($window.navigator.language || 'en').replace(/^(en)-.*/, '$1');
                    }
                }
                if (supportedLocale.join(',').indexOf(locale) === -1) {
                    locale = 'en';
                }
                PersistenceService.set(LANG_KEY, locale);
                $translate.use(locale);
//                moment.locale(locale);
            };

            this.get = function () {
                return PersistenceService.get(LANG_KEY) || 'en';
            };
        }
    ]);

person huan feng    schedule 05.08.2015    source источник


Ответы (1)


Вы не можете внедрить свой сервис внутрь блока config. Вместо этого используйте блок run.

Причина объясняется здесь: как внедрить зависимость в module.config (configFn) в угловом

Ваш код должен быть таким:

app.run(['$translateProvider', 'LocaleService', 
    function($translateProvider, LocaleService){ 
       'use strict';
       ....
       $translateProvider.useStaticFilesLoader({
                prefix: '/assets/languages/',
                suffix: '.json'
            });

       $translateProvider.preferredLanguage(LocaleService.get());
}]);
person Huy Hoang Pham    schedule 05.08.2015
comment
Но localeService не является методом синхронизации, на самом деле это асинхронный метод (потому что здесь persistenceService является асинхронным методом), и мы не можем напрямую установить его в предпочтительный язык. - person huan feng; 05.08.2015
comment
Я вижу, что вы используете locale = PersistenceService.get(LANG_KEY); в своем коде. Как это может работать, если PersistenceService является асинхронным методом :o? - person Huy Hoang Pham; 05.08.2015
comment
Да вы правы. Я сделал ошибку здесь, можете ли вы просто привести пример того, как я могу установить язык на основе хранилища БД сервера? - person huan feng; 05.08.2015
comment
Можете ли вы обновить код вашего PersistenceService в своем вопросе? - person Huy Hoang Pham; 05.08.2015
comment
Код действительно сложный, на самом деле PersistenceService.get не асинхронный вызов, а PersistenceService.init — это ajax-вызов, и в init мы получим все данные хранилища с сервера. я просто копирую 3 связанных файла в plunkr: plnkr.co/edit/1qeRtWdFZabbz2SjnG8t?p=info Пожалуйста, помогите взглянуть - person huan feng; 05.08.2015