javascript - angularjs ng-重复来自不同 i18n 文件的下拉值

标签 javascript jquery angularjs angularjs-ng-repeat angular-translate

这是一个英语 json i18n 语言文件示例:

{
  "project": {
    "SPONSORINFO": {
      "MAIN" : "Select the Sponsor Name",
      "SPONSORLIST": [
        {"spons" :"SponsorName 1" },
        {"spons" :"SponsorName 2" }
      ]
    }
  }
}

这是我的 html View :

<div class="form-group" >
    <label for="form-field-select-1" translate="project.SPONSORINFO.MAIN">
    </label>
    <select class="form-control"  ng-model="myModel.sponsors">
       <option ng-repeat="s in projectJSON.project.SPONSORINFO.SPONSORLIST" value="{{s.spons}}">{{s.spons | translate}}</option>
    </select>
</div>

标签 中的translate="project.SPONSORINFO.MAIN" 立即正确显示值"Select the Sponsor Name"当点击语言切换时(不需要刷新)。

问题:

我在我的 View Controller 中使用以下函数根据所选语言加载语言文件并将其传递到 $scope.projectJSON 以便我可以在 ng- 中调用它在我的 html View 中重复:

var lang = $translate.use();
$http.get('assets/i18n/'+lang+'.json').success(function(data) {
    $scope.projectJSON= data;
});


问题是切换语言后,下拉菜单不会更改为所选语言,除非我刷新或更改 View 并返回。我该如何解决这个问题,使其像标签一样工作?

附件:

我的 ma​​in.js 中的翻译全局配置如下所示:

app.config(['$translateProvider',
function ($translateProvider) {

    // prefix and suffix information  is required to specify a pattern
    // You can simply use the static-files loader with this pattern:
    $translateProvider.useStaticFilesLoader({
        prefix: 'assets/i18n/',
        suffix: '.json'
    });

    // Since you've now registered more then one translation table, angular-translate has to know which one to use.
    // This is where preferredLanguage(langKey) comes in.
    $translateProvider.preferredLanguage('en');

    // Store the language in the local storage
    $translateProvider.useLocalStorage();

}]);

我的 mainCtrl.js 中的翻译配置:

app.controller('AppCtrl', ['$rootScope', '$scope', '$state', '$translate', 
function ($rootScope, $scope, $state, $translate) {

    $scope.language = {
        // Handles language dropdown
        listIsOpen: false,
        // list of available languages
        available: {
            'en': 'English',
            //'it_IT': 'Italiano',
            'de_DE': 'Deutsch'
        },
        // display always the current ui language
        init: function () {
            var proposedLanguage = $translate.proposedLanguage() || $translate.use();
            var preferredLanguage = $translate.preferredLanguage();
            // we know we have set a preferred one in app.config
            $scope.language.selected = $scope.language.available[(proposedLanguage || preferredLanguage)];
        },
        set: function (localeId, ev) {
            $translate.use(localeId);
            $scope.language.selected = $scope.language.available[localeId];
            $scope.language.listIsOpen = !$scope.language.listIsOpen;
        }
    };

    $scope.language.init();

最佳答案

您正在从翻译 json 文件迭代数组。此翻译 json 文件由 $translate 服务加载,您将无法访问加载的内容,但您需要此 json 文件中的数据来迭代它,因此您必须自己发出请求来获取这个数组。也许你不想,但你必须调用 $http.get

在您的代码中,第一个请求是通过执行此行 var lang = $translate.use(newLang); 发出的,第二个调用是由 $http.get 完成的,但是如果 $http.get$translate.use 中的调用被解析之前解析 它不会翻译下拉列表中的内容,因为 $translate.use< 中的请求 尚未解析,$translate 服务没有这些要翻译的翻译。

你可以做的是在 $rootScope 上监听 $translateChangeSuccess 事件(由 $translate 服务发出),然后让你的 ajax调用此处理程序。

我已经在您的示例中测试了以下代码,它工作正常。

[更新]

$rootScope.$on('$translateChangeSuccess', function () {
  // Get new current new language
  var lang = $translate.use();
  $http.get('assets/i18n/'+lang+'.json').success(function(data) {
    $scope.projectJSON = data;
  });
});

有关 Angular 翻译模块的事件部分的详细说明,请查看 this link .

每当你调用 $translate.use(localeId) 时,它都会在内部进行 ajax 调用,当这个调用被解析时,它会发出 $translateChangeSuccess 事件,然后你就可以进行你的请求、加载数据并更新 $scope.projectJSON
唯一的事情是第一次触发这个事件,当你刷新浏览器时,当 $translate.use 没有被调用时。

为此,您只需在页面重新加载时调用一次 $translate.use

[更新]

将以下代码放在 $scope.language.init 函数的末尾。

$translate.use(proposedLanguage || preferredLanguage);

这应该可以解决您的问题。

关于javascript - angularjs ng-重复来自不同 i18n 文件的下拉值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40198763/

相关文章:

javascript - 推特图片上传错误: media parameter is missing

javascript - 使用 JavaScript 更改另一个页面中的 div 的背景图像

jQuery - 如何将 ajax post 响应分配给变量

javascript - Rails 3.1 Ajax 部分中的 Google Charts

html - 如何在 angularjs 中将天数添加到现有的 ng-module 日期?

javascript - Uncaught ReferenceError : handleLocationError is not defined google maps api

javascript - 处理 ResultSet 中的空值

javascript - jstree 以树状数组形式获取数据

angularjs - 观察 ngModel 的变化。$invalid 在 angular 指令中

javascript - javascript中带构造函数的对象和闭包的区别