From 722fdc01248e6dfef21ccb768e289f7fc7af2d00 Mon Sep 17 00:00:00 2001 From: Danilo Di Nuzzo Date: Tue, 30 Jun 2020 16:42:58 +0200 Subject: [PATCH] [CST-2877] rm browser lang for SSR reqs --- src/app/core/locale/locale.interceptor.ts | 2 +- src/app/core/locale/locale.service.ts | 20 +++---- src/app/core/locale/server-locale.service.ts | 60 ++++++++++++++++++++ src/modules/app/server-app.module.ts | 6 ++ 4 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 src/app/core/locale/server-locale.service.ts diff --git a/src/app/core/locale/locale.interceptor.ts b/src/app/core/locale/locale.interceptor.ts index fd32e5c5d4..9327db5d38 100644 --- a/src/app/core/locale/locale.interceptor.ts +++ b/src/app/core/locale/locale.interceptor.ts @@ -4,7 +4,7 @@ import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/c import { Observable } from 'rxjs'; import { LocaleService } from './locale.service'; -import { reduce, mergeMap, scan } from 'rxjs/operators'; +import { mergeMap, scan } from 'rxjs/operators'; @Injectable() export class LocaleInterceptor implements HttpInterceptor { diff --git a/src/app/core/locale/locale.service.ts b/src/app/core/locale/locale.service.ts index f4343b953a..b7f9314a33 100644 --- a/src/app/core/locale/locale.service.ts +++ b/src/app/core/locale/locale.service.ts @@ -7,7 +7,7 @@ import { CookieService } from '../services/cookie.service'; import { environment } from '../../../environments/environment'; import { AuthService } from '../auth/auth.service'; import { Observable, of as observableOf, combineLatest } from 'rxjs'; -import { map, take, flatMap, tap } from 'rxjs/operators'; +import { map, take, flatMap } from 'rxjs/operators'; import { NativeWindowService, NativeWindowRef } from '../services/window.service'; export const LANG_COOKIE = 'language_cookie'; @@ -21,11 +21,6 @@ export enum LANG_ORIGIN { BROWSER }; -/** - * Eperson language metadata - */ -const EPERSON_LANG_METADATA = 'eperson.language'; - /** * Service to provide localization handler */ @@ -34,11 +29,16 @@ const EPERSON_LANG_METADATA = 'eperson.language'; }) export class LocaleService { + /** + * Eperson language metadata + */ + EPERSON_LANG_METADATA = 'eperson.language'; + constructor( @Inject(NativeWindowService) protected _window: NativeWindowRef, - private cookie: CookieService, - private translate: TranslateService, - private authService: AuthService) { + protected cookie: CookieService, + protected translate: TranslateService, + protected authService: AuthService) { } /** @@ -81,7 +81,7 @@ export class LocaleService { take(1), map((eperson) => { const languages: string[] = []; - const ePersonLang = eperson.firstMetadataValue(EPERSON_LANG_METADATA); + const ePersonLang = eperson.firstMetadataValue(this.EPERSON_LANG_METADATA); if (ePersonLang) { languages.push(...this.setQuality( [ePersonLang], diff --git a/src/app/core/locale/server-locale.service.ts b/src/app/core/locale/server-locale.service.ts new file mode 100644 index 0000000000..b33338240f --- /dev/null +++ b/src/app/core/locale/server-locale.service.ts @@ -0,0 +1,60 @@ +import { LocaleService, LANG_ORIGIN } from './locale.service'; +import { Injectable } from '@angular/core'; +import { Observable, combineLatest, of as observableOf } from 'rxjs'; +import { take, flatMap, map } from 'rxjs/operators'; +import { isNotEmpty, isEmpty } from 'src/app/shared/empty.util'; + +@Injectable() +export class ServerLocaleService extends LocaleService { + + /** + * Get the languages list of the user in Accept-Language format + * + * @returns {Observable} + */ + getLanguageCodeList(): Observable { + const obs$ = combineLatest([ + this.authService.isAuthenticated(), + this.authService.isAuthenticationLoaded() + ]); + + return obs$.pipe( + take(1), + flatMap(([isAuthenticated, isLoaded]) => { + let epersonLang$: Observable = observableOf([]); + if (isAuthenticated && isLoaded) { + epersonLang$ = this.authService.getAuthenticatedUserFromStore().pipe( + take(1), + map((eperson) => { + const languages: string[] = []; + const ePersonLang = eperson.firstMetadataValue(this.EPERSON_LANG_METADATA); + if (ePersonLang) { + languages.push(...this.setQuality( + [ePersonLang], + LANG_ORIGIN.EPERSON, + !isEmpty(this.translate.currentLang))); + } + return languages; + }) + ); + } + return epersonLang$.pipe( + map((epersonLang: string[]) => { + const languages: string[] = []; + if (this.translate.currentLang) { + languages.push(...this.setQuality( + [this.translate.currentLang], + LANG_ORIGIN.UI, + false)); + } + if (isNotEmpty(epersonLang)) { + languages.push(...epersonLang); + } + return languages; + }) + ) + }) + ); + } + +} diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index 5abd8e3aa1..6b58d8663a 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -25,6 +25,8 @@ import { ServerSubmissionService } from '../../app/submission/server-submission. import { Angulartics2DSpace } from '../../app/statistics/angulartics/dspace-provider'; import { Angulartics2RouterlessModule } from 'angulartics2/routerlessmodule'; import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; +import { ServerLocaleService } from 'src/app/core/locale/server-locale.service'; +import { LocaleService } from 'src/app/core/locale/locale.service'; export function createTranslateLoader() { return new TranslateJson5UniversalLoader('dist/server/assets/i18n/', '.json5'); @@ -73,6 +75,10 @@ export function createTranslateLoader() { { provide: SubmissionService, useClass: ServerSubmissionService + }, + { + provide: LocaleService, + useClass: ServerLocaleService } ] })