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

Angular: how to language from path in APP_INITIALIZER?

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

所以 我的域名。com/en 得到不同的设置 我的域名。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'));
}

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

假设您在后端使用 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'));
      }