diff --git a/package-lock.json b/package-lock.json index 7c88e2f1b..ef575293b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4009,6 +4009,21 @@ "tslib": "^1.9.0" } }, + "@ngx-translate/http-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-6.0.0.tgz", + "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", diff --git a/package.json b/package.json index 32d26a11c..216c81e2c 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@fortawesome/fontawesome-svg-core": "1.2.18", "@fortawesome/free-solid-svg-icons": "5.8.2", "@ngx-translate/core": "11.0.1", + "@ngx-translate/http-loader": "^6.0.0", "chart.js": "3.0.0-alpha", "core-js": "2.5.0", "lodash": "4.17.21", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index b40720476..47494917c 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -5,9 +5,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { HttpClientModule } from '@angular/common/http'; import { ServiceWorkerModule } from '@angular/service-worker'; -/** Tanslation Imports */ -import { TranslateModule } from '@ngx-translate/core'; - /** Environment Configuration */ import { environment } from 'environments/environment'; @@ -55,7 +52,6 @@ import { AppRoutingModule } from './app-routing.module'; HammerModule, HttpClientModule, ServiceWorkerModule.register('./ngsw-worker.js', { enabled: environment.production }), - TranslateModule.forRoot(), CoreModule, HomeModule, LoginModule, diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 26666babb..192837186 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -4,7 +4,8 @@ import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common import { RouteReuseStrategy, RouterModule } from '@angular/router'; /** Translation Imports */ -import { TranslateModule } from '@ngx-translate/core'; +import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; /** Custom Services */ import { AuthenticationService } from './authentication/authentication.service'; @@ -47,7 +48,15 @@ import { ContentComponent } from './shell/content/content.component'; imports: [ SharedModule, HttpClientModule, - TranslateModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: (http: HttpClient) => { + return new TranslateHttpLoader(http, `${ window.location.protocol }//${ window.location.host }/assets/translations/`, '.json'); + }, + deps: [HttpClient] + } + }), RouterModule ], declarations: [ diff --git a/src/app/core/http/api-prefix.interceptor.ts b/src/app/core/http/api-prefix.interceptor.ts index 927b77a7a..9371577f0 100644 --- a/src/app/core/http/api-prefix.interceptor.ts +++ b/src/app/core/http/api-prefix.interceptor.ts @@ -18,7 +18,13 @@ export class ApiPrefixInterceptor implements HttpInterceptor { * Intercepts a Http request and prefixes it with `environment.serverUrl`. */ intercept(request: HttpRequest, next: HttpHandler): Observable> { - request = request.clone({ url: environment.serverUrl + request.url }); + /** + * Ignore URLs that are complete for i18n + */ + if (!request.url.includes('http:') && !request.url.includes('https:')) { + request = request.clone({ url: environment.serverUrl + request.url }); + } + return next.handle(request); } diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts index 913b07e56..fe5af51f3 100644 --- a/src/app/core/i18n/i18n.service.ts +++ b/src/app/core/i18n/i18n.service.ts @@ -34,11 +34,7 @@ export class I18nService { defaultLanguage: string; supportedLanguages: string[]; - constructor(private translateService: TranslateService) { - // Embed languages to avoid extra HTTP requests - translateService.setTranslation('en-US', enUS); - translateService.setTranslation('fr-FR', frFR); - } + constructor(private translateService: TranslateService) { } /** * Initializes i18n for the application. @@ -78,7 +74,8 @@ export class I18nService { } log.debug(`Language set to ${language}`); - this.translateService.use(language); + localStorage.setItem(this.languageStorageKey, language); + this.translateService.setDefaultLang(language); } /** diff --git a/src/app/core/shell/toolbar/toolbar.component.html b/src/app/core/shell/toolbar/toolbar.component.html index 57babc698..2a897d4ff 100644 --- a/src/app/core/shell/toolbar/toolbar.component.html +++ b/src/app/core/shell/toolbar/toolbar.component.html @@ -20,19 +20,19 @@ - Accounting + {{ 'Accounting' | translate }} - Reports + {{ 'Reports' | translate }} - Admin + {{ 'Admin' | translate }} - Self Service + {{ 'Self Service' | translate }} diff --git a/src/app/shared/language-selector/language-selector.component.ts b/src/app/shared/language-selector/language-selector.component.ts index 07ddfa701..00c8b612b 100644 --- a/src/app/shared/language-selector/language-selector.component.ts +++ b/src/app/shared/language-selector/language-selector.component.ts @@ -27,6 +27,7 @@ export class LanguageSelectorComponent implements OnInit { */ constructor(private i18nService: I18nService) { this.languageSelector.setValue(this.currentLanguage); + this.languageSelector.valueChanges.subscribe( language => this.setLanguage(language) ); } ngOnInit() { diff --git a/src/translations/en-US.json b/src/assets/translations/en-US.json similarity index 70% rename from src/translations/en-US.json rename to src/assets/translations/en-US.json index 74a98e2f5..412335662 100644 --- a/src/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -11,5 +11,10 @@ "Username is required": "Username is required", "Username or password incorrect.": "Username or password incorrect", "Remember me": "Remember me", - "Version": "Version" + "Version": "Version", + "Accounting": "Accounting", + "Reports": "Reports", + "Admin": "Admin", + "Self Service": "Self Service", + "Institution": "Institution" } diff --git a/src/translations/fr-FR.json b/src/assets/translations/fr-FR.json similarity index 71% rename from src/translations/fr-FR.json rename to src/assets/translations/fr-FR.json index d235f82e4..c6bbf1699 100644 --- a/src/translations/fr-FR.json +++ b/src/assets/translations/fr-FR.json @@ -11,5 +11,10 @@ "Username is required": "Identifiant requis", "Username or password incorrect.": "Identifiant ou mot de passe incorrect", "Remember me": "Rester connecté", - "Version": "Version" + "Version": "Version", + "Accounting": "Comptabilité", + "Reports": "Rapports", + "Admin": "Admin", + "Self Service": "En libre service", + "Institution": "Institution" }