Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 从服务器获取默认语言决策_Angularjs_Angular Translate - Fatal编程技术网

Angularjs 从服务器获取默认语言决策

Angularjs 从服务器获取默认语言决策,angularjs,angular-translate,Angularjs,Angular Translate,我使用角度翻译来支持多种语言。 我有本地的4种语言json。(en.json,ru,json,is.json,jp.json),我在app config中编写了如下代码 app.config(['$stateProvider' , '$urlRouterProvider', '$translateProvider', 'TENANT_KEY', 'LANG_KEY', function ($stateProvider, $urlRouterProvider, $translateProv

我使用角度翻译来支持多种语言。 我有本地的4种语言json。(en.json,ru,json,is.json,jp.json),我在app config中编写了如下代码

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';
            };
        }
    ]);

您不能将服务注入
config
块中。改用
run
block

原因如下:

您的代码应该如下所示:

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

       $translateProvider.preferredLanguage(LocaleService.get());
}]);

但是localeService不是一个同步方法,实际上它是一个异步方法(因为这里persistenceService是异步方法),我们不能直接将其设置为PreferredLanguage我看到您使用的是
locale=persistenceService.get(LANG_KEY)在您的代码中。如果
PersistenceService
是异步方法:o,那该如何工作呢?是的,您是正确的。我在这里犯了一个错误,你能举个例子说明如何基于服务器db存储设置语言吗?你能更新你问题中的
PersistenceService
的代码吗?代码非常复杂,实际上是PersistenceSercie.get不是异步调用,但PersistenceService.init是ajax调用,在init中,我们将从服务器获取所有存储数据。我只是将3个相关文件复制到一个文件中。请帮我看一下