我昨天刚开始使用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文件,这将是一件好事。
我敢打赌,这已经融入了框架中,我已经错过了它,所以对正确方向的推动表示赞赏。
感谢。
答案 0 :(得分:5)
希望它有所帮助...
答案 1 :(得分:2)
要获得更灵活的基础,请结帐http://angular-translate.github.io/
答案 2 :(得分:1)
以下是我在进行i18n工作的方式,看起来效果很好!它基于一组在运行时初始化的本地化资源文件。
.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);
}]);
.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>
.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>
{
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>
而不是您建议的更简单的标签。阅读他的文章,看看它是否回答了你的问题,但我认为确实如此。