Angular 2路由 - 重定向到不同的应用程序

时间:2018-06-15 07:00:24

标签: javascript angular angular-routing angular-i18n

我正在以其他语言生成各种版本的应用。我正在使用AOT(提前)编译,所以我最终得到的静态可部署站点的结构如下所示:

dist -
  index.html -- entry file for the default (English language) app
  -fr
    index.html -- entry file for French language version
  -de
    index.html -- entry file for German language version

我目前可以使用下拉菜单在主要语言网站之间切换,用户可以选择他们的首选语言,然后我使用纯JavaScript来加载所需网站的主条目文件,如下所示:

const baseUrl = window.location.origin;
window.location.href = baseUrl + '/' + requestedLanguage + '/index.html'; // e.g. requestedLanguage = 'fr'

这很有效,因为似乎请求实际的index.html文件意味着Angular不会将请求href解释为Angular路径。

我想要发生的是,当用户输入已包含路径中语言版本的URL时,我希望提供该语言版本。我还希望保留URL路径,以便Angular路由为所请求的URL加载适当的组件。

例如:

  • 用户输入myDomain.com/fr/myPage

  • 加载了/fr/子目录下的应用,该应用中的Angular路由加载了MyPage的相关组件

目前,如果我输入网址myDomain.com/fr/myPage,Angular路由会尝试将所需的子文件夹fr解释为不存在的路由,因此我收到以下错误:

Error: Cannot match any routes. URL Segment: 'fr/instruments'

如何加载所需的应用和正确的组件?必须有一种让Angular能够识别URL中的fr引用不同应用的方法。也许我错过了构建配置或什么?这是package.json中用于构建法语版本的脚本:

"build:fr": "ng build --aot --output-path=dist/fr --base-href /fr/ --i18nFile=src/locale/messages.fr.xlf --i18nFormat=xlf --locale=fr",

3 个答案:

答案 0 :(得分:2)

只使用Components而不是使用不同的单独应用,并使用下面的示例 >

for (i = 0; i < MAX_LIMIT; i++) begin: a
    wire [i+1:0] clock_slow;
end

然后您可以通过URL直接访问页面

答案 1 :(得分:1)

对英语,法语和丹麦语的不同路径使用角度router概念。

然后使用基于语言的路径。

答案 2 :(得分:0)

我能够通过为我的.NET后端配置管道来加载应用程序的不同语言版本,以便为每个不同的语言应用程序加载Angular静态索引页面(在此处称为“SPA”)码)。它的工作原理是检查请求网址中是否有第一个子文件夹的'index.html'页面(例如'/ fr /','/ de /'),如果它存在,它会加载该页面:

Startup.cs

public class Startup
{
    public void Configuration()
    {
        app.Use((context, next) =>
        {
            if (!context.Request.Path.HasValue)
                return next();

            IFileInfo fi;
            string spaIndex = "index.html";

            Uri uri = new Uri(context.Request.Uri.ToString());
            var segs = uri.Segments;
            var folder = segs.Length > 1 ? String.Format("/{0}", segs[1]) : "/";

            if (!physicalFileSystem.TryGetFileInfo(context.Request.Path.Value, out fi)) {

                // check if this is a request for a sub-application, e.g an alternative language version
                // if so, load the app
                if (physicalFileSystem.TryGetFileInfo(String.Format("{0}{1}", folder, spaIndex), out fi))
                {
                    context.Request.Path = new PathString(String.Format("{0}{1}", folder, spaIndex));                           
                }
            }

            return next();
        });
    }
}

然后,URL的其余部分(语言子文件夹之后的部分)被解释为已加载的应用程序内的路径(例如,法语应用程序)。这意味着为应用程序加载了正确的组件(我不完全确定这部分是如何工作的 - 可能路径的其余部分落到.NET请求管道的不同部分并传递给Angular应用程序? )