如何使用AngularJS在路由中获取本地化模板(templateUrl)
在构建国际web应用程序时,有一个非常流行的用例: 每个区域性都有本地化模板,名称约定为“en_US/name.html”、“ru_ru/name.html”等 只有在用户登录后才能获取用户的区域设置(或者用户可以选择区域设置) 因此,我发现的最佳选择是使用DI提供本地化值(因此它可以在任何地方进行更新——或者当我使用用户配置从后端收到响应时,或者当用户选择某个内容时) 但只能在配置步骤中配置路由,其中无法注入“值”。因此,您不能注入区域设置配置并根据该值添加templateUrl 这里有一个例子来说明我的解决方案 我看到的唯一其他解决方案是修改路由的私有数组(使用$route.routes[]),但这听起来像是丑陋的黑客行为如何使用AngularJS在路由中获取本地化模板(templateUrl),angularjs,Angularjs,在构建国际web应用程序时,有一个非常流行的用例: 每个区域性都有本地化模板,名称约定为“en_US/name.html”、“ru_ru/name.html”等 只有在用户登录后才能获取用户的区域设置(或者用户可以选择区域设置) 因此,我发现的最佳选择是使用DI提供本地化值(因此它可以在任何地方进行更新——或者当我使用用户配置从后端收到响应时,或者当用户选择某个内容时) 但只能在配置步骤中配置路由,其中无法注入“值”。因此,您不能注入区域设置配置并根据该值添加templateUrl 这里有一个例
是否有其他解决方案来实现使用本地化模板的常见用例?可能有一些方法可以根据您的需要执行此操作,例如覆盖
templateCache
,而不是修改路由,但我将以不同的方式处理此问题
在您的方法中,随着站点的增长,很难维护(至少)2个模板副本。如果你支持更多的语言,那么你会遇到麻烦
我将创建一个服务,它为语言保存类似字典的对象
angular.module("myApp", [])
.factory("Internationalization", function () {
var dict: {
en_US: {
hello: "Hello,"
},
fr_FR: {
salut: "Salut,"
}
};
var get = function (locale, key) {
return formatdict[locale][key];
}
return {get: get};
});
然后您可以将服务注入控制器并将其附加到作用域
这应该有助于您入门,如果您想要
string.format
支持,您可能需要查看。实际上,我的项目中所有模板的副本都是使用默认的Razor国际化方法在后端生成的。所以实际上我有一个模板,内容像@Hello
和带有翻译的XML文件。然后我们编写了hanlder,它将使用URL改变文化,所以要获得英语翻译的模板,您需要通过URL/en_US/index.html
获取并缓存它。这样,它的工作速度要快得多(就像i18n在服务器上运行一次,然后缓存结果一样),并且易于维护。唯一的问题是TemplateURL。。。