angularjs i18n项目设置

时间:2013-06-27 19:34:26

标签: javascript html angularjs

我昨天刚开始使用angularjs,所以假设我一无所知。我要做的第一件事就是将我的UI的所有标签放入一个文件中(以便我们可以将它们换成i18n)。

根据我的理解,这是可行的,导入js文件,然后在html中添加包含标签作为控制器的函数,如下所示:

<html ng-app>
...
<script src="js/i18n/en-US.js"></script> <!-- function inside this named lang -->
...
<body>
... <!-- some html -->
<div ng-controller="lang">
<label class="span5">{{nameOfLabelVar}}</label>
</div>
</body>
</html>

这一切都有效。但是现在我在代码组织方面有点迷失。在div内部是一些选择菜单,我也想要使用角度。

我希望标签的js代码在一个文件中,并且页面的视图逻辑在不同的js文件中(name-of-that-page-view-model.js)。我不确定如何做到这一点。据我所知,你不能嵌套ng-controller标签,我不能将它们添加到它将用于的特定标签。

能够有一个全局控制器可以导入该页面的所有其他js文件,这将是一件好事。

我敢打赌,这已经融入了框架中,我已经错过了它,所以对正确方向的推动表示赞赏。

感谢。

4 个答案:

答案 0 :(得分:5)

经过大量研究后,这是我的2美分: 我的个人结论是angular-translate库对我来说是最好的。 有许多很好的解决方案,比如那个library合并了关于该主题的2个教程。 但是角度翻译有我需要的所有要求:

  • 通过凉亭安装
  • JSON文件支持我喜欢的结构
  • 简易初始化
  • 检查浏览器文化
  • 在运行时间改变文化
  • 伟大的翻译装载机
  • 精彩文档
  • 最受欢迎,最大的社区,也是唯一一个静止的社区 经常维护

希望它有所帮助...

答案 1 :(得分:2)

要获得更灵活的基础,请结帐http://angular-translate.github.io/

答案 2 :(得分:1)

以下是我在进行i18n工作的方式,看起来效果很好!它基于一组在运行时初始化的本地化资源文件。

I18n模块用于保存字符串id映射和参数插入

.factory('I18n', ['$http', 'User', function($http, User) {
    // Resource File
    var LANG_FILE;

    // Fetch Resource File
    function init() {
        return $http.get('resources/locales/' + User.locale + '.json')
            .then(function(response) {
                LANG_FILE = response.data;
            });
    }

    function lang(stringId, params) {
        var string = LANG_FILE[stringId] || stringId;

        if (params && params.length) {
            for (var i = 0; i < params.length; i++) {
                string = string.replace('%' + (i + 1), params[i]);
            }
        }

        return string;
    }

    return {
        init: init,
        lang: lang
    };

}]);

可以使用.run块

初始化
.run(['I18n', function(I18n) {
    I18n.init();
}]);

并在任何地方用来翻译像这样的字符串

.controller(['$scope', 'I18n', function($scope, I18n) {
    $scope.title = I18n.lang(some_string_id);
}]);

自定义i18n DIRECTIVE处理一次性翻译

.directive('i18n', ['I18n', function(I18n) {
    return {
        restrict: 'A',
        scope: {},
        link: function(scope, $el, attrs) {
            $el[0].innerHTML = I18n.lang(attrs.i18n);
        }
    };
}]);

可以这样使用。

<div i18n="some_string_id"></div>

自定义PLURALIZE指令,它匹配资源文件中的字符串ID,并将count作为参数。

.directive('pluralize', ['I18n', function(I18n) {
    return {
        restrict: 'A',
        scope: {
            count: '='
        },
        link: function($scope, $el, attrs) {
            var when  = JSON.parse(attrs.when)
              , param = [$scope.count];
            if (when[$scope.count]) {
                $el[0].innerHTML = I18n.lang(when[$scope.count], param);
            } else {
                $el[0].innerHTML = I18n.lang(when['other'], param);
            }
        }
    };
}]);

可以像这样使用。

<div pluralize count="{{obj.count}}" when="{1:'single_item','other': 'multiple_item'}"></div>   

String Resource文件位于resources / locales / en-US.json,看起来像这样。

{
    some_string_id: 'This is in English',
    single_item: '%1 item',
    multiple_item: '%1 items'
}

其他语言环境将具有相同的字符串ID,并具有不同的翻译文本。

答案 3 :(得分:0)

我认为这个链接:

(bruno's i18n approach in angular js)

很好地回答你的问题。他的方法在概念上与你想要做的类似,但我认为他的实现涉及过滤器,允许你使用像

这样的结构
<span class="author">{{ 'WRITTENBY' | i18n }} Bruno</span>

而不是您建议的更简单的标签。阅读他的文章,看看它是否回答了你的问题,但我认为确实如此。