diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index d6adebbf1..fd7ab3a3d 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -58,6 +58,7 @@ import { PrivacyPolicyComponent } from './components/privacy-policy/privacy-poli
import { TrademarkPolicyComponent } from './components/trademark-policy/trademark-policy.component';
import { StorageService } from './services/storage.service';
import { HttpCacheInterceptor } from './services/http-cache.interceptor';
+import { LanguageService } from './services/language.service';
import { SponsorComponent } from './components/sponsor/sponsor.component';
import { PushTransactionComponent } from './components/push-transaction/push-transaction.component';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
@@ -128,6 +129,7 @@ import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
AudioService,
SeoService,
StorageService,
+ LanguageService,
{ provide: HTTP_INTERCEPTORS, useClass: HttpCacheInterceptor, multi: true }
],
bootstrap: [AppComponent]
diff --git a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html
index 777fa6680..d77f96423 100644
--- a/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html
+++ b/frontend/src/app/components/bisq-master-page/bisq-master-page.component.html
@@ -15,13 +15,13 @@
Mainnet
-
Signet
-
Testnet
+
Mainnet
+
Signet
+
Testnet
Liquid
-
Liquid Testnet
+
Liquid
+
Liquid Testnet
diff --git a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts
index f71e63e46..65f07320d 100644
--- a/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts
+++ b/frontend/src/app/components/liquid-master-page/liquid-master-page.component.ts
@@ -1,6 +1,7 @@
import { Component, OnInit } from '@angular/core';
import { Env, StateService } from '../../services/state.service';
import { merge, Observable, of} from 'rxjs';
+import { LanguageService } from 'src/app/services/language.service';
@Component({
selector: 'app-liquid-master-page',
@@ -14,15 +15,18 @@ export class LiquidMasterPageComponent implements OnInit {
isMobile = window.innerWidth <= 767.98;
officialMempoolSpace = this.stateService.env.OFFICIAL_MEMPOOL_SPACE;
network$: Observable
Bisq
-
Liquid
-
Liquid Testnet
+
Bisq
+
Liquid
+
Liquid Testnet
diff --git a/frontend/src/app/components/master-page/master-page.component.ts b/frontend/src/app/components/master-page/master-page.component.ts
index 32466afa7..fcff5629c 100644
--- a/frontend/src/app/components/master-page/master-page.component.ts
+++ b/frontend/src/app/components/master-page/master-page.component.ts
@@ -1,6 +1,7 @@
import { Component, OnInit } from '@angular/core';
import { Env, StateService } from '../../services/state.service';
import { Observable, merge, of } from 'rxjs';
+import { LanguageService } from 'src/app/services/language.service';
@Component({
selector: 'app-master-page',
@@ -14,15 +15,18 @@ export class MasterPageComponent implements OnInit {
navCollapsed = false;
isMobile = window.innerWidth <= 767.98;
officialMempoolSpace = this.stateService.env.OFFICIAL_MEMPOOL_SPACE;
+ urlLanguage: string;
constructor(
private stateService: StateService,
+ private languageService: LanguageService,
) { }
ngOnInit() {
this.env = this.stateService.env;
this.connectionState$ = this.stateService.connectionState$;
this.network$ = merge(of(''), this.stateService.networkChanged$);
+ this.urlLanguage = this.languageService.getLanguageForUrl();
}
collapse(): void {
diff --git a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts
index 8db685248..5257d6a9e 100644
--- a/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts
+++ b/frontend/src/app/components/mempool-blocks/mempool-blocks.component.ts
@@ -12,7 +12,6 @@ import { RelativeUrlPipe } from 'src/app/shared/pipes/relative-url/relative-url.
selector: 'app-mempool-blocks',
templateUrl: './mempool-blocks.component.html',
styleUrls: ['./mempool-blocks.component.scss'],
- providers: [RelativeUrlPipe],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class MempoolBlocksComponent implements OnInit, OnDestroy {
diff --git a/frontend/src/app/components/search-form/search-form.component.ts b/frontend/src/app/components/search-form/search-form.component.ts
index b9cb1ee9c..40f2c1e88 100644
--- a/frontend/src/app/components/search-form/search-form.component.ts
+++ b/frontend/src/app/components/search-form/search-form.component.ts
@@ -13,7 +13,6 @@ import { RelativeUrlPipe } from 'src/app/shared/pipes/relative-url/relative-url.
selector: 'app-search-form',
templateUrl: './search-form.component.html',
styleUrls: ['./search-form.component.scss'],
- providers: [RelativeUrlPipe],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class SearchFormComponent implements OnInit {
diff --git a/frontend/src/app/services/language.service.ts b/frontend/src/app/services/language.service.ts
new file mode 100644
index 000000000..b96b37e8b
--- /dev/null
+++ b/frontend/src/app/services/language.service.ts
@@ -0,0 +1,41 @@
+import { DOCUMENT } from '@angular/common';
+import { Inject, Injectable } from '@angular/core';
+import { languages } from 'src/app/app.constants';
+import { RelativeUrlPipe } from '../shared/pipes/relative-url/relative-url.pipe';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class LanguageService {
+ private language = 'en';
+ private languages = languages;
+ constructor(
+ @Inject(DOCUMENT) private document: Document,
+ private relativeUrlPipe: RelativeUrlPipe,
+ ) { }
+
+ getLanguage(): string {
+ return this.language;
+ }
+
+ getLanguageForUrl() {
+ return this.language === 'en' ? '' : '/' + this.language;
+ }
+
+ setLocalLanguage() {
+ const urlLanguage = this.document.location.pathname.split('/')[1];
+ if (this.languages.map((lang) => lang.code).indexOf(urlLanguage) > -1) {
+ this.language = urlLanguage;
+ } else {
+ this.language = 'en';
+ }
+ }
+
+ setLanguage(language: string): void {
+ try {
+ document.cookie = `lang=${language}; expires=Thu, 18 Dec 2050 12:00:00 UTC; path=/`;
+ } catch (e) { }
+
+ this.document.location.href = this.relativeUrlPipe.transform(`/${language}/`);
+ }
+}
diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts
index ead7b20c2..b29303c27 100644
--- a/frontend/src/app/shared/shared.module.ts
+++ b/frontend/src/app/shared/shared.module.ts
@@ -60,6 +60,7 @@ import { ColoredPriceDirective } from './directives/colored-price.directive';
],
providers: [
VbytesPipe,
+ RelativeUrlPipe,
],
exports: [
NgbAccordionModule,