如何使用AngularJS在路由中获取本地化模板(templateUrl)

如何使用AngularJS在路由中获取本地化模板(templateUrl),angularjs,Angularjs,在构建国际web应用程序时,有一个非常流行的用例: 每个区域性都有本地化模板,名称约定为“en_US/name.html”、“ru_ru/name.html”等 只有在用户登录后才能获取用户的区域设置(或者用户可以选择区域设置) 因此,我发现的最佳选择是使用DI提供本地化值(因此它可以在任何地方进行更新——或者当我使用用户配置从后端收到响应时,或者当用户选择某个内容时) 但只能在配置步骤中配置路由,其中无法注入“值”。因此,您不能注入区域设置配置并根据该值添加templateUrl 这里有一个例

在构建国际web应用程序时,有一个非常流行的用例:

每个区域性都有本地化模板,名称约定为“en_US/name.html”、“ru_ru/name.html”等

只有在用户登录后才能获取用户的区域设置(或者用户可以选择区域设置)

因此,我发现的最佳选择是使用DI提供本地化值(因此它可以在任何地方进行更新——或者当我使用用户配置从后端收到响应时,或者当用户选择某个内容时)

但只能在配置步骤中配置路由,其中无法注入“值”。因此,您不能注入区域设置配置并根据该值添加templateUrl

这里有一个例子来说明我的解决方案

我看到的唯一其他解决方案是修改路由的私有数组(使用$route.routes[]),但这听起来像是丑陋的黑客行为


是否有其他解决方案来实现使用本地化模板的常见用例?

可能有一些方法可以根据您的需要执行此操作,例如覆盖
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。。。