角路由器参数匹配正则表达式

时间:2019-02-23 11:25:49

标签: angular angular-router

我想用与字符串数组或正则表达式匹配的语言开始所有的url

FROM python:2.7 RUN rm /bin/sh && ln -s /bin/bash /bin/sh WORKDIR /app RUN apt-get update RUN pip install --upgrade pip RUN apt-get update && \ apt-get -y install sudo ADD ./requirements.txt ./requirements.txt RUN pip install -r requirements.txt ADD . /app RUN cd ./A && ./install.sh ENV WEB_CONCURRENCY 5 CMD gunicorn app:app const languages = ['nl', 'en', 'de', 'fr']

我的routeConfig如下

const languageRegex = /(nl|en|de|fr)/g

可惜这没用,我认为这是一个易于阅读的配置:

const appRoutes: Routes = [ { path: '', pathMatch: 'full', redirectTo: 'en/configuration', }, { children: [ { path: '', pathMatch: 'full', redirectTo: 'configuration' }, { loadChildren: '../modules/booking-flow/configuration.module#ConfigurationModule', path: RouteHelper.paths.configuration, }, { loadChildren: '../modules/booking-flow/personal-info.module#PersonalInfoModule', path: RouteHelper.paths.personalInfo, }, { loadChildren: '../modules/booking-flow/summary.module#SummaryModule', path: RouteHelper.paths.summary, }, { loadChildren: '../modules/booking-flow/payment-method.module#PaymentMethodModule', path: RouteHelper.paths.paymentMethod, }, { loadChildren: '../modules/booking-flow/confirmation.module#ConfirmationModule', path: RouteHelper.paths.confirmation, }, { component: ErrorPageComponent, path: RouteHelper.paths.errorNotFound, }, { path: '**', pathMatch: 'full', redirectTo: RouteHelper.paths.errorNotFound, }, ], component: null, path: ':language', runGuardsAndResolvers: 'always', }, ];

我想要以下模式。

  • path: ':language(/nl|en|de|fr/g)',重定向到/作品
  • /en/configuration重定向到/nl作品
  • /nl/configuration重定向到/es无效
  • 404重定向到/es/configuration无效
  • 404重定向到/en/invalid作品

2 个答案:

答案 0 :(得分:1)

因此,正如我所看到的,仅通过路由器配置就无法实现这一点,它没有这种功能。相反,您可以使用 RouteGuard 检查language中是否包含['nl', 'en', 'de', 'fr']参数,如果不是,则可以返回 UrlTree (在找不到页面的情况(角度7.1+的情况),或使用 router (角度<= 7.1)手动重定向用户

后卫看起来像这样:

const allowedLanguages = ['nl', 'en', 'de', 'fr'];

@Injectable({
  providedIn: 'root'
})
export class LanguageGuard implements CanActivate {
  constructor(private router: Router) {}

  canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    return this.next.params.pipe(
        map(params => {
            return params && allowedLanguages.includes(params.language)
               ? true
               : this.router.parseUrl(RouteHelper.paths.errorNotFound)
        })
    );
  }
}

然后,您只需要将此保护措施应用于您的父路线即可。希望有帮助。

答案 1 :(得分:0)

我认为有更好的方法来解决您的问题;如果确实您的问题与应用程序中支持不同语言有关。

ngx-translate是一个受支持的知名/文档化库,可让您轻松进行国际化应用程序。

该库允许您提供应用程序支持的语言,在该库中,您将根据所支持的语言提供JSON文件,其中包含所需的正确语言翻译。

它们看起来像这样:

{
    "title": "My title"
}

该库提供了管道,指令,可以在HTML中使用如下代码:

<span translate>title</span>

<span> {{ 'title' | translate }}</span>

两者都将在span元素内呈现My Title-。

该库允许您执行更多操作,例如参数插值-您可以在其中将动态值传递给翻译。它还为您提供在代码中进行翻译的服务。