Angular:如何从APP_INITIALIZER中的路径语言?

时间:2018-02-06 08:55:55

标签: angular angular-universal

所以,我们正在使用APP_INITIALIZER在app load上加载一些设置(通过http)....但问题是这些设置取决于语言路径

所以 mydomain.com/en 获得不同的设置 mydomain.com/it

我们如何(安全地)从应用程序路径中确定语言?

这是我们现在的逻辑

site.service.ts

  load(): Promise<SiteConfiguration> {
    const promise = this.getSiteSettings().toPromise();

    promise.then(config => {
      this.config = config;
       return config;
    }
    return promise;

  }

  getSiteSettings(): Observable<any> {
    // language logic supposed to be
    const langId = 'en';

    return this.http.get(`${environment.apiPath}/${langId}.siteconfiguration.json`)
    .map(res)
    .catch((error: any) => Observable.throw(error || 'Server error'));
  }

假设语言始终是路径中的第一个参数

1 个答案:

答案 0 :(得分:1)

假设您在后端使用express / nodejs

  1. 在后端服务器上,从快速请求中识别语言ID

    let languageId = req.path.split('/')[1];
    
  2. 在后端服务器上,提供语言URL

    renderModuleFactory(AppServerModuleNgFactory, {
        // Our index.html
        document: template,
        url: url,
        extraProviders: [
          provideModuleMap(LAZY_MODULE_MAP),
          {
            provide: 'languageId',
            useValue: languageId
          }
        ]
    
  3. 修改初始化服务以注入语言

    constructor(private http: HttpClient, @Inject(PLATFORM_ID) private 
    platformId: Object, @Optional() @Inject('languageId') protected languageId: string)    
    {
    }
    
  4. 使用注入值

      getSiteSettings(): Observable<any> {
    
        const langId = isPlatformBrowser(this.platformId)? window.location.pathname.split('/')[1] : this.languageId;
        return this.http.get(`${environment.apiPath}/${langId}.siteconfiguration.json`)
        .map(res)
        .catch((error: any) => Observable.throw(error || 'Server error'));
      }