我想匹配我的路由服务中的语言。我的问题是,该语言必须是我的首选语言。
例如:
/ en / xxx
/ fr / xxx
/ en / yyy
/ fr / yyy
因为我想使用此参数,所以我添加了以下路由
{ path: ':lang', children: [
{path: '', redirectTo: 'xxx', pathMatch: 'full'},
{path: 'xxx', component: x},
{path: 'yyy', component: y}
]}
问题是,所有内容都匹配:lang。
例如:
/ abc / xxx
我想为此添加约束,以便可以说:lang只能是。
现在,当我想转到/robots.txt(应该向我显示robots.txt文件)时,它将映射到:lang并将我发送到“ /robots.txt/xxx”
我尝试过分别映射每种语言,但随后我无法访问route参数。
我已经尝试在上面添加robots.txt,但由于它是资产文件,我不知道如何通过在route.ts文件中添加一行来显示它。
我曾尝试在路由保护器中添加一个异常,但由于它一直在:lang参数上进行映射,因此我无法重定向至robots.txt。
这是我当前的routes.ts文件:
{path: '', redirectTo: '/xxx', pathMatch: 'full', canActivate: [LangGuard]}, {path: 'xxx', component: xxx, canActivate: [LangGuard]}, {path: 'yyy', component: yyy, canActivate: [LangGuard]}, { path: ':lang', canActivate: [LangGuard], children: [ {path: '', redirectTo: 'xxx', pathMatch: 'full'}, {path: 'xxx', component: x}, {path: 'yyy', component: y} ]}
我的LangGuard非常广泛,但请写下简短的版本:
Get route parameters If parameter is "nl", "fr", "de" or "en" then return true //do nothing else router.navigate('/' + decideLanguage() + state.url) // redirect to new url
也许是我想实现的目标以及获得的目标的概述:
我想要的
/ -> /en/xxx /abc -> /en/xxx /xxx -> /en/xxx /yyy -> /en/yyy /en/xxx -> ok /fr/xxx -> ok /de/xxx -> ok /en/abc -> notfound /abc/xxx -> notfound /abc/yyy -> notfound /robots.txt -> ok
我有什么
/ -> /en/xxx /abc -> /en/xxx /xxx -> /en/xxx /yyy -> /en/yyy /en/xxx -> ok /fr/xxx -> ok /de/xxx -> ok /en/abc -> notfound /abc/xxx -> ok (WRONG) /abc/yyy -> ok (WRONG) /robots.txt -> /robots.txt/xxx (WRONG)
注意:由于语言是根据本地存储选择的,因此我不能使用redirectTo作为语言,这就是为什么我使用routeguard的原因
如果我需要添加更多信息或您有任何疑问,请随时提出,我将尽我所能回答。
谢谢
我想匹配我的路由服务中的语言。我的问题是,该语言必须先行。例如:/ en / xxx / fr / xxx / en / yyy / fr / yyy因为我想使用这个...
我会尝试AngularUrlMatcher。这样您就可以定义自己的网址匹配功能。恕我直言,防护人员更倾向于检查身份验证,而不是检查路由是否有效。
您可以使用canActivate
防护并将其用于以编程方式确定lang
路线参数是您提到的四种语言之一。
选定的答案用于此目的,值得一提的是,如果某个人具有一个自定义组件(例如找不到的语言),则此灵活性不够。除非听起来很不错,而且不可能从匹配功能内部进行导航,我对此表示怀疑。我认为在那种情况下,理想的情况是拥有一个容器组件来进行检查,否则导航匹配的:lang并将其余的加载为子对象。