AngularJS:i18n和复数

时间:2013-02-25 17:31:58

标签: internationalization angularjs

以西班牙语here查看复数部分,作为示例:

我明白了 var PLURAL_CATEGORY = {ZERO:“0”,ONE:“one”,TWO:“two”,FEW:“less”,MANY:“many”,OTHER:“other”}; 显然,一切都是英文的

任何人都可以解释这是不是一个错误?

非常感谢

利奥尔

2 个答案:

答案 0 :(得分:0)

通过浏览代码,我可以看到它是一组简单的复数规则。 Every locale有这个常数。所以不,这不是一个错误。

答案 1 :(得分:0)

以下是我在进行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,并具有不同的翻译文本。