【问题标题】:angularjs translate dropdown list from i18n using ng-repeatangularjs 使用 ng-repeat 从 i18n 翻译下拉列表
【发布时间】:2016-10-22 17:31:08
【问题描述】:

我的英文 i18n 翻译 json 文件assets/i18n/en.json 如下(这是英文翻译,我在同一目录下还有几个其他语言的文件):

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

这是我的 html 视图:

<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 spons.SPONSORLIST" value="{{s.spons}}">{{s.spons}}</option>
    </select>
</div>

标签中的 translate="project.SPONSORINFO.MAIN" 正确显示了 "Select the Sponsor Name" 值。这部分没问题。

问题:

如何对下拉菜单中 SPONSORLIST 列表中的项目进行 ng-repeat?
我目前所拥有的并没有像你猜到的那样显示任何东西。

编辑:

我的 main.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();

}]);

但我的视图控制器中没有关于翻译的任何参考。

编辑 2:

抱歉,我忘了在我的 mainCtrl.js 中分享它,我的 index.html 加载了以下内容:

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();

更新 2(提出的解决方案但不起作用):

在我的视图控制器中,当我手动加载en.json 文件时,我的下拉菜单有效。

$http.get('assets/i18n/en.json').success(function(data) {
     $scope.projectJSON = data;
});

使用 ng-repeat:

<option ng-repeat="s in projectJSON.project.SPONSORINFO.SPONSORLIST" value="{{s.spons}}">{{s.spons | translate}}</option>

但我不知道如何从环境中加载所选语言,以便它自动加载首选语言文件。我的尝试如下但不起作用:

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

提议的答案(效率不高):

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

现在的问题是:
这解决了我的问题,但是当我更改语言、菜单和其他使用 mainCtrl.js 进行翻译的翻译时,通过使用 translate="project.SPONSORINFO.MAIN" 就像我在上面的示例中的 label 一样,它们会立即更新。但是,当我使用我的函数加载所选语言并将其传递给 $http 函数以加载所选语言文件时,菜单不会立即更改为所选语言,我需要刷新页面然后他们已翻译。

如何修复这个错误?我怎么能不通过这个函数并从mainCtrl.js 使用它,因为label 正在使用它?

【问题讨论】:

  • 发布你的 json 数据
  • {{s.spons | translate}}
  • @Sajeetharan 我在上面给出了一个例子。还不够吗?还是你想要别的东西?
  • @Mpondomise 你还没有根据你的代码中的内容设置任何翻译。
  • @Akis ,是的,在我的控制器中,与翻译无关。但是在我的 main.js 中,有并且我已经在上面发布了。这就是为什么在 main.js 代码的帮助下从 en.json 中提取标签的原因。但是,下拉菜单不起作用。

标签: javascript angularjs internationalization angular-translate


【解决方案1】:

您可以使用 angular-translate 的翻译过滤器来实现这一点。一般来说,过滤器是这样工作的:

&lt;ANY&gt;{{'TRANSLATION_ID' | translate}}&lt;/ANY&gt;

在你的情况下应该是这样的:

<option ng-repeat="s in project.SPONSORINFO.SPONSORLIST" value="{{s.spons}}">{{s.spons | translate}}</option>

【讨论】:

  • 这不起作用,我不应该包括project.SPONSORINFO吗?
  • 你有$scope.spons 变量吗?
  • 不,我不知道,我应该在控制器中添加什么?
  • @Mpondomise 我以为你有,更新答案
  • 我使用 main.js 中的配置编辑了我的问题,但在我的视图控制器中没有任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多