diff --git a/html_source/src/app/app.component.ts b/html_source/src/app/app.component.ts index c0997044..19c21a48 100644 --- a/html_source/src/app/app.component.ts +++ b/html_source/src/app/app.component.ts @@ -14,11 +14,12 @@ import { paths, pathsChildrenAuth } from './pages/paths'; import { hasOwnProperty } from '@parts/functions/hasOwnProperty'; import { Dialog } from '@angular/cdk/dialog'; import { ParamsCallRpc } from '@api/models/call_rpc.model'; +import { ZanoLoadersService } from '@parts/services/zano-loaders.service'; @Component({ selector: 'app-root', template: ` - +

@@ -33,6 +34,13 @@ import { ParamsCallRpc } from '@api/models/call_rpc.model';

+
+

+ {{ zanoLoadersService.getMessage('fullScreen') | async | translate }} +

+
+
+ @@ -66,7 +74,8 @@ export class AppComponent implements OnInit, OnDestroy { private intToMoneyPipe: IntToMoneyPipe, private modalService: ModalService, private store: Store, - private dialog: Dialog + private dialog: Dialog, + public zanoLoadersService: ZanoLoadersService ) { translate.addLangs(['en', 'fr', 'de', 'it', 'pt']); translate.setDefaultLang('en'); @@ -117,9 +126,9 @@ export class AppComponent implements OnInit, OnDestroy { return; } - await this.ngZone.run(async () => { - await this.router.navigate(['/']); - }); + // await this.ngZone.run(async () => { + // await this.router.navigate(['/']); + // }); this.dialog.closeAll(); this.needOpenWallets = []; diff --git a/html_source/src/app/layouts/sidebar/sidebar.component.ts b/html_source/src/app/layouts/sidebar/sidebar.component.ts index 02d48bce..9cfe9083 100644 --- a/html_source/src/app/layouts/sidebar/sidebar.component.ts +++ b/html_source/src/app/layouts/sidebar/sidebar.component.ts @@ -8,6 +8,7 @@ import { ConfirmModalComponent, ConfirmModalData } from '@parts/modals/confirm-m import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { WalletsService } from '@parts/services/wallets.service'; +import { ZanoLoadersService } from '@parts/services/zano-loaders.service'; @Component({ selector: 'app-sidebar', @@ -101,7 +102,8 @@ export class SidebarComponent implements OnDestroy { private route: ActivatedRoute, private router: Router, private ngZone: NgZone, - private dialog: Dialog + private dialog: Dialog, + public zanoLoadersService: ZanoLoadersService ) {} ngOnDestroy(): void { @@ -153,11 +155,17 @@ export class SidebarComponent implements OnDestroy { } logOut(): void { - this.variablesService.stopCountdown(); - this.variablesService.appLogin = false; - this.variablesService.appPass = ''; - this.ngZone.run(() => { - this.router.navigate(['/login'], { queryParams: { type: 'auth' } }); - }); + this.zanoLoadersService.open('fullScreen', 'SIDEBAR.SYNCHRONIZATION.LOGGING_OUT'); + + setTimeout(() => { + this.variablesService.stopCountdown(); + this.variablesService.appLogin = false; + this.variablesService.appPass = ''; + this.ngZone.run(() => { + this.router.navigate(['/login'], { queryParams: { type: 'auth' } }).then(() => { + this.zanoLoadersService.close('fullScreen'); + }); + }); + }, 500); } } diff --git a/html_source/src/app/pages/auth/login/login.component.ts b/html_source/src/app/pages/auth/login/login.component.ts index 4103294d..b7ece879 100644 --- a/html_source/src/app/pages/auth/login/login.component.ts +++ b/html_source/src/app/pages/auth/login/login.component.ts @@ -5,7 +5,7 @@ import { BackendService } from '@api/services/backend.service'; import { VariablesService } from '@parts/services/variables.service'; import { Wallet } from '@api/models/wallet.model'; import { hasOwnProperty } from '@parts/functions/hasOwnProperty'; -import { Subject } from 'rxjs'; +import { BehaviorSubject, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { regExpPassword, ZanoValidators } from '@parts/utils/zano-validators'; import { WalletsService } from '@parts/services/wallets.service'; @@ -112,16 +112,20 @@ import { WalletsService } from '@parts/services/wallets.service'; + + `, styles: [ ` @@ -134,6 +138,10 @@ import { WalletsService } from '@parts/services/wallets.service'; ], }) export class LoginComponent implements OnInit, OnDestroy { + submitLoading$ = new BehaviorSubject(false); + + resetLoading$ = new BehaviorSubject(false); + fb = inject(FormBuilder); regForm = this.fb.group( @@ -211,38 +219,53 @@ export class LoginComponent implements OnInit, OnDestroy { } dropSecureAppData(): void { - this.backend.dropSecureAppData(() => { - this.onSkipCreatePass(); - }); - this.closeAllWallets(); - this.variablesService.contacts = []; + this.resetLoading$.next(true); + + // This delay is necessary for the loader to display, as the application freezes for a few seconds + setTimeout(() => { + this.backend.dropSecureAppData(() => { + this.resetLoading$.next(false); + this.onSkipCreatePass(); + }); + this.closeAllWallets(); + this.variablesService.contacts = []; + }, 500); } onSubmitAuthPass(): void { - if (this.authForm.valid) { - this.variablesService.appPass = this.authForm.get('password').value; - if (this.variablesService.dataIsLoaded) { - this.backend.checkMasterPassword({ pass: this.variablesService.appPass }, status => { - if (status) { - this.variablesService.appLogin = true; - if (this.variablesService.settings.appLockTime) { - this.variablesService.startCountdown(); - } - this.ngZone.run(() => { - this.router.navigate(['/'], { - queryParams: { prevUrl: 'login' }, + this.submitLoading$.next(true); + + // This delay is necessary for the loader to display, as the application freezes for a few seconds + setTimeout(() => { + if (this.authForm.valid) { + this.variablesService.appPass = this.authForm.get('password').value; + if (this.variablesService.dataIsLoaded) { + this.backend.checkMasterPassword({ pass: this.variablesService.appPass }, status => { + if (status) { + this.variablesService.appLogin = true; + if (this.variablesService.settings.appLockTime) { + this.variablesService.startCountdown(); + } + this.ngZone.run(() => { + this.submitLoading$.next(false); + this.router.navigate(['/'], { + queryParams: { prevUrl: 'login' }, + }); }); - }); - } else { - this.ngZone.run(() => { - this.setAuthPassError({ wrong_password: true }); - }); - } - }); + } else { + this.ngZone.run(() => { + this.submitLoading$.next(false); + this.setAuthPassError({ wrong_password: true }); + }); + } + }); + } else { + this.getData(this.variablesService.appPass); + } } else { - this.getData(this.variablesService.appPass); + this.submitLoading$.next(false); } - } + }, 500); } getData(appPass): void { @@ -259,6 +282,7 @@ export class LoginComponent implements OnInit, OnDestroy { if (this.variablesService.wallets.length > 0) { this.ngZone.run(() => { + this.submitLoading$.next(false); this.router.navigate(['/wallet/']); }); return; @@ -275,6 +299,7 @@ export class LoginComponent implements OnInit, OnDestroy { this.getWalletData(data['wallets']); } else { this.ngZone.run(() => { + this.submitLoading$.next(false); this.router.navigate(['/']); }); } @@ -284,6 +309,7 @@ export class LoginComponent implements OnInit, OnDestroy { this.getWalletData(data); } else { this.ngZone.run(() => { + this.submitLoading$.next(false); this.router.navigate(['/']); }); } @@ -292,6 +318,7 @@ export class LoginComponent implements OnInit, OnDestroy { if (data.error_code === 'WRONG_PASSWORD') { this.ngZone.run(() => { + this.submitLoading$.next(false); this.setAuthPassError({ wrong_password: true }); }); } @@ -365,6 +392,7 @@ export class LoginComponent implements OnInit, OnDestroy { } }); }); + this.submitLoading$.next(false); } closeAllWallets(): void { diff --git a/html_source/src/app/pages/create-wallet/create-wallet.component.ts b/html_source/src/app/pages/create-wallet/create-wallet.component.ts index b22ece76..963b02a0 100644 --- a/html_source/src/app/pages/create-wallet/create-wallet.component.ts +++ b/html_source/src/app/pages/create-wallet/create-wallet.component.ts @@ -9,6 +9,7 @@ import { TranslateService } from '@ngx-translate/core'; import { regExpPassword, ZanoValidators } from '@parts/utils/zano-validators'; import { WalletsService } from '@parts/services/wallets.service'; import { BreadcrumbItems } from '@parts/components/breadcrumbs/breadcrumbs.models'; +import { BehaviorSubject } from 'rxjs'; @Component({ selector: 'app-create-wallet', @@ -118,11 +119,14 @@ import { BreadcrumbItems } from '@parts/components/breadcrumbs/breadcrumbs.model + + `, styles: [ ` @@ -137,6 +141,8 @@ import { BreadcrumbItems } from '@parts/components/breadcrumbs/breadcrumbs.model export class CreateWalletComponent { variablesService = inject(VariablesService); + loading$ = new BehaviorSubject(false); + breadcrumbItems: BreadcrumbItems = [ { routerLink: '/add-wallet', @@ -179,8 +185,12 @@ export class CreateWalletComponent { } createWallet(): void { - const { path: selectedPath, password, name } = this.createForm.getRawValue(); - this.backend.generateWallet(selectedPath, password, async (generate_status, generate_data, errorCode) => { + this.loading$.next(true); + + // This delay is necessary for the loader to display, as the application freezes for a few seconds + setTimeout(() => { + const { path: selectedPath, password, name } = this.createForm.getRawValue(); + this.backend.generateWallet(selectedPath, password, async (generate_status, generate_data, errorCode) => { if (generate_status) { const { wallet_id } = generate_data; const { path, address, balance, unlocked_balance, mined_total, tracking_hey } = generate_data['wi']; @@ -198,18 +208,27 @@ export class CreateWalletComponent { this.backend.storeSecureAppData(); } this.variablesService.setCurrentWallet(wallet_id); + this.loading$.next(false); await this.router.navigate(['/seed-phrase'], { queryParams: { wallet_id } }); }); } else { console.log(run_data['error_code']); + this.ngZone.run(() => { + this.loading$.next(false); + }); } }); } else { const errorTranslationKey = errorCode === 'ALREADY_EXISTS' ? 'CREATE_WALLET.ERROR_CANNOT_SAVE_TOP' : 'CREATE_WALLET.ERROR_CANNOT_SAVE_SYSTEM'; this.modalService.prepareModal('error', errorTranslationKey); + + this.ngZone.run(() => { + this.loading$.next(false); + }); } }); + }, 500); } selectWalletLocation(): void { diff --git a/html_source/src/app/pages/open-wallet/open-wallet.component.ts b/html_source/src/app/pages/open-wallet/open-wallet.component.ts index ce5b03e5..72f7e90c 100644 --- a/html_source/src/app/pages/open-wallet/open-wallet.component.ts +++ b/html_source/src/app/pages/open-wallet/open-wallet.component.ts @@ -6,7 +6,7 @@ import { ModalService } from '@parts/services/modal.service'; import { ActivatedRoute, Router } from '@angular/router'; import { Wallet } from '@api/models/wallet.model'; import { TranslateService } from '@ngx-translate/core'; -import { Subject } from 'rxjs'; +import { BehaviorSubject, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { regExpPassword, ZanoValidators } from '@parts/utils/zano-validators'; import { WalletsService } from '@parts/services/wallets.service'; @@ -76,8 +76,7 @@ import { BreadcrumbItems } from '@parts/components/breadcrumbs/breadcrumbs.model
@@ -86,17 +85,21 @@ import { BreadcrumbItems } from '@parts/components/breadcrumbs/breadcrumbs.model
- + + `, }) export class OpenWalletComponent implements OnInit, OnDestroy { + loading$ = new BehaviorSubject(false); + fb = inject(NonNullableFormBuilder); breadcrumbItems: BreadcrumbItems = [ @@ -118,7 +121,6 @@ export class OpenWalletComponent implements OnInit, OnDestroy { password: this.fb.control('', [Validators.pattern(regExpPassword)]), filePath: this.fb.control('', Validators.required), }); - submitted = false; private destroy$ = new Subject(); @@ -166,108 +168,124 @@ export class OpenWalletComponent implements OnInit, OnDestroy { } openWallet(): void { - this.submitted = true; + this.loading$.next(true); + if (this.openWalletForm.valid) { - const { filePath, password, name } = this.openWalletForm.getRawValue(); - const { count: txs_to_return } = this.variablesService; - this.backend.openWallet( - filePath, - password, - txs_to_return, - false, - (openStatus, openData, errorCode: 'WRONG_PASSWORD' | 'FILE_NOT_FOUND' | 'INVALID_FILE' | 'ALREADY_EXISTS' | string) => { - console.log('openData', openData); - if (errorCode === 'WRONG_PASSWORD') { - this.ngZone.run(() => { - this.openWalletForm.controls.password.setErrors({ - wrongPassword, + // This delay is necessary for the loader to display, as the application freezes for a few seconds + setTimeout(() => { + const { filePath, password, name } = this.openWalletForm.getRawValue(); + const { count: txs_to_return } = this.variablesService; + this.backend.openWallet( + filePath, + password, + txs_to_return, + false, + (openStatus, openData, errorCode: 'WRONG_PASSWORD' | 'FILE_NOT_FOUND' | 'INVALID_FILE' | 'ALREADY_EXISTS' | string) => { + console.log('openData', openData); + if (errorCode === 'WRONG_PASSWORD') { + this.ngZone.run(() => { + this.openWalletForm.controls.password.setErrors({ + wrongPassword, + }); + this.loading$.next(false); }); - }); - return; - } - - let errorText = errorCode; + return; + } - if (errorCode === 'FILE_NOT_FOUND') { - errorText = this.translate.instant('OPEN_WALLET.FILE_NOT_FOUND1'); - errorText += ':
' + filePath; - errorText += this.translate.instant('OPEN_WALLET.FILE_NOT_FOUND2'); - } + let errorText = errorCode; - if (errorCode === 'INVALID_FILE') { - errorText = this.translate.instant(notFileZanoWallet.errorText); - } + if (errorCode === 'FILE_NOT_FOUND') { + errorText = this.translate.instant('OPEN_WALLET.FILE_NOT_FOUND1'); + errorText += ':
' + filePath; + errorText += this.translate.instant('OPEN_WALLET.FILE_NOT_FOUND2'); + } - if (['INVALID_FILE', 'FILE_NOT_FOUND'].includes(errorCode)) { - this.modalService.prepareModal('error', errorText); - return; - } + if (errorCode === 'INVALID_FILE') { + errorText = this.translate.instant(notFileZanoWallet.errorText); + } - if (openStatus || errorCode === 'FILE_RESTORED') { - let exists = false; - this.variablesService.wallets.forEach(wallet => { - if (wallet.address === openData['wi'].address) { - exists = true; - } - }); + if (['INVALID_FILE', 'FILE_NOT_FOUND'].includes(errorCode)) { + this.modalService.prepareModal('error', errorText); + this.ngZone.run(() => { + this.loading$.next(false); + }); + return; + } - if (exists) { - this.modalService.prepareModal('error', 'OPEN_WALLET.WITH_ADDRESS_ALREADY_OPEN'); - this.backend.closeWallet(openData.wallet_id, () => { - this.ngZone.run(() => { - this.router.navigate(['/']); - }); + if (openStatus || errorCode === 'FILE_RESTORED') { + let exists = false; + this.variablesService.wallets.forEach(wallet => { + if (wallet.address === openData['wi'].address) { + exists = true; + } }); - } else { - const new_wallet = new Wallet( - openData.wallet_id, - name, - password, - openData['wi'].path, - openData['wi'].address, - openData['wi'].balance, - openData['wi'].unlocked_balance, - openData['wi'].mined_total, - openData['wi'].tracking_hey - ); - new_wallet.alias = this.backend.getWalletAlias(new_wallet.address); - new_wallet.currentPage = 1; - new_wallet.open_from_exist = true; - new_wallet.exclude_mining_txs = false; - new_wallet.is_auditable = openData['wi'].is_auditable; - new_wallet.is_watch_only = openData['wi'].is_watch_only; - if (openData.recent_history && openData.recent_history.history) { - new_wallet.total_history_item = openData.recent_history.total_history_items; - new_wallet.totalPages = Math.ceil( - openData.recent_history.total_history_items / this.variablesService.count - ); - new_wallet.totalPages > this.variablesService.maxPages - ? (new_wallet.pages = new Array(5).fill(1).map((value, index) => value + index)) - : (new_wallet.pages = new Array(new_wallet.totalPages).fill(1).map((value, index) => value + index)); - new_wallet.prepareHistory(openData.recent_history.history); - } else { - new_wallet.total_history_item = 0; - new_wallet.pages = new Array(1).fill(1); - new_wallet.totalPages = 1; - } - this.walletsService.addWallet(new_wallet); - this.backend.runWallet(openData.wallet_id, (run_status, run_data) => { - if (run_status) { - if (this.variablesService.appPass) { - this.backend.storeSecureAppData(); - } + + if (exists) { + this.modalService.prepareModal('error', 'OPEN_WALLET.WITH_ADDRESS_ALREADY_OPEN'); + this.backend.closeWallet(openData.wallet_id, () => { this.ngZone.run(() => { - this.variablesService.setCurrentWallet(openData.wallet_id); - this.router.navigate(['/wallet/']); + this.loading$.next(false); + this.router.navigate(['/']); }); + }); + } else { + const new_wallet = new Wallet( + openData.wallet_id, + name, + password, + openData['wi'].path, + openData['wi'].address, + openData['wi'].balance, + openData['wi'].unlocked_balance, + openData['wi'].mined_total, + openData['wi'].tracking_hey + ); + new_wallet.alias = this.backend.getWalletAlias(new_wallet.address); + new_wallet.currentPage = 1; + new_wallet.open_from_exist = true; + new_wallet.exclude_mining_txs = false; + new_wallet.is_auditable = openData['wi'].is_auditable; + new_wallet.is_watch_only = openData['wi'].is_watch_only; + if (openData.recent_history && openData.recent_history.history) { + new_wallet.total_history_item = openData.recent_history.total_history_items; + new_wallet.totalPages = Math.ceil( + openData.recent_history.total_history_items / this.variablesService.count + ); + new_wallet.totalPages > this.variablesService.maxPages + ? (new_wallet.pages = new Array(5).fill(1).map((value, index) => value + index)) + : (new_wallet.pages = new Array(new_wallet.totalPages).fill(1).map((value, index) => value + index)); + new_wallet.prepareHistory(openData.recent_history.history); } else { - console.log(run_data['error_code']); + new_wallet.total_history_item = 0; + new_wallet.pages = new Array(1).fill(1); + new_wallet.totalPages = 1; } - }); + this.walletsService.addWallet(new_wallet); + this.backend.runWallet(openData.wallet_id, (run_status, run_data) => { + if (run_status) { + if (this.variablesService.appPass) { + this.backend.storeSecureAppData(); + } + this.ngZone.run(() => { + this.variablesService.setCurrentWallet(openData.wallet_id); + this.router.navigate(['/wallet/']); + this.loading$.next(false); + }); + } else { + console.log(run_data['error_code']); + this.ngZone.run(() => { + this.loading$.next(false); + }); + } + }); + } } } - } - ); + ); + }, 500); + } else { + this.loading$.next(false); } + } } diff --git a/html_source/src/app/pages/wallet/wallet/wallet.component.ts b/html_source/src/app/pages/wallet/wallet/wallet.component.ts index 79f7eab7..effd8b30 100644 --- a/html_source/src/app/pages/wallet/wallet/wallet.component.ts +++ b/html_source/src/app/pages/wallet/wallet/wallet.component.ts @@ -13,6 +13,14 @@ import { Asset } from '@api/models/assets.model'; import { AssetDetailsComponent } from '@parts/modals/asset-details/asset-details.component'; import { WalletsService } from '@parts/services/wallets.service'; import { Wallet } from '@api/models/wallet.model'; +import { + NavigationCancel, + NavigationEnd, + NavigationError, + NavigationStart, + Router, + RouterEvent +} from '@angular/router'; interface Tab { id: string; @@ -307,7 +315,13 @@ const objTabs: { [key in TabNameKeys]: Tab } = {
- + +
+

+ {{ 'Loading...' | translate }} +

+
+
`, @@ -327,13 +341,16 @@ export class WalletComponent implements OnInit, OnDestroy { private destroy$ = new Subject(); + loader = true; + constructor( private backend: BackendService, public variablesService: VariablesService, private ngZone: NgZone, private store: Store, private dialog: Dialog, - private walletsService: WalletsService + private walletsService: WalletsService, + private router: Router ) { if (!this.variablesService.currentWallet && this.variablesService.wallets.length > 0) { this.variablesService.setCurrentWallet(0); @@ -369,6 +386,34 @@ export class WalletComponent implements OnInit, OnDestroy { this.setHiddenTabs(['swap'], hidden); } }); + + this.router.events.pipe(takeUntil(this.destroy$)).subscribe((e: RouterEvent) => { + this.navigationInterceptor(e); + }); + } + + navigationInterceptor(event: RouterEvent): void { + if (event instanceof NavigationStart) { + + this.loader = true; + + } + if (event instanceof NavigationEnd) { + setTimeout(() => { + this.loader = false; + }, 500); + } + if (event instanceof NavigationCancel) { + setTimeout(() => { + this.loader = true; + }, 500); + } + if (event instanceof NavigationError) { + setTimeout(() => { + this.loader = true; + }, 500); + } + } createTabs({ is_auditable, is_watch_only }: Wallet): void { diff --git a/html_source/src/app/parts/services/zano-loaders.service.ts b/html_source/src/app/parts/services/zano-loaders.service.ts new file mode 100644 index 00000000..5748b061 --- /dev/null +++ b/html_source/src/app/parts/services/zano-loaders.service.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +type TLoaderId = 'fullScreen'; + +interface TDataLoader { + state: boolean; + message: string; +} + +type TDataLoaders = { + [key in TLoaderId]: TDataLoader +}; + +@Injectable({ + providedIn: 'root' +}) +export class ZanoLoadersService { + private _loaders$ = new BehaviorSubject({ + fullScreen: { state: false, message: 'Loading' } + }); + + getState(id: TLoaderId): Observable { + return this._loaders$.pipe(map((loader) => loader[id].state )); + } + + getMessage(id: TLoaderId): Observable { + return this._loaders$.pipe(map((loader) => loader[id].message )); + } + + + open(id: TLoaderId, message: string = 'Loading'): void { + this._loaders$.next({ + ...this._loaders$.value, + [id]: { + state: true, + message + } + }); + } + + close(id: TLoaderId): void { + this._loaders$.next({ + ...this._loaders$.value, + [id]: { + ...this._loaders$.value[id], + state: false + } + }); + } +} diff --git a/html_source/src/assets/i18n/af.json b/html_source/src/assets/i18n/af.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/af.json +++ b/html_source/src/assets/i18n/af.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/ar.json b/html_source/src/assets/i18n/ar.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/ar.json +++ b/html_source/src/assets/i18n/ar.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/ca.json b/html_source/src/assets/i18n/ca.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/ca.json +++ b/html_source/src/assets/i18n/ca.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/cs.json b/html_source/src/assets/i18n/cs.json index 2cde7ed9..3695cb75 100644 --- a/html_source/src/assets/i18n/cs.json +++ b/html_source/src/assets/i18n/cs.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "Chyba systému", "LOADING": "Nahrávání blockchainových dat", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/da.json b/html_source/src/assets/i18n/da.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/da.json +++ b/html_source/src/assets/i18n/da.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/de.json b/html_source/src/assets/i18n/de.json index c6c26c05..d1476599 100644 --- a/html_source/src/assets/i18n/de.json +++ b/html_source/src/assets/i18n/de.json @@ -664,6 +664,7 @@ "DOWNLOADING": "wird heruntergeladen", "ERROR": "Systemfehler", "LOADING": "Lade Blockchain-Daten", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/el.json b/html_source/src/assets/i18n/el.json index 9f7e5152..f25ef749 100644 --- a/html_source/src/assets/i18n/el.json +++ b/html_source/src/assets/i18n/el.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/en.json b/html_source/src/assets/i18n/en.json index e68457b9..8ec71c29 100644 --- a/html_source/src/assets/i18n/en.json +++ b/html_source/src/assets/i18n/en.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/es.json b/html_source/src/assets/i18n/es.json index 05af0904..f0ce070c 100644 --- a/html_source/src/assets/i18n/es.json +++ b/html_source/src/assets/i18n/es.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/fi.json b/html_source/src/assets/i18n/fi.json index 120d97c8..3baf0c63 100644 --- a/html_source/src/assets/i18n/fi.json +++ b/html_source/src/assets/i18n/fi.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/fr.json b/html_source/src/assets/i18n/fr.json index 4ff6921c..d6617102 100644 --- a/html_source/src/assets/i18n/fr.json +++ b/html_source/src/assets/i18n/fr.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Téléchargement", "ERROR": "Erreur de système", "LOADING": "Chargement des données de la blockchain", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Hors ligne", "ONLINE": "En ligne", diff --git a/html_source/src/assets/i18n/he.json b/html_source/src/assets/i18n/he.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/he.json +++ b/html_source/src/assets/i18n/he.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/hu.json b/html_source/src/assets/i18n/hu.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/hu.json +++ b/html_source/src/assets/i18n/hu.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/id.json b/html_source/src/assets/i18n/id.json index 13452f0a..d47f6f99 100644 --- a/html_source/src/assets/i18n/id.json +++ b/html_source/src/assets/i18n/id.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Mengunduh", "ERROR": "Sistem error", "LOADING": "Memuat data blockchain", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/it.json b/html_source/src/assets/i18n/it.json index b8945a2b..552ebfdd 100644 --- a/html_source/src/assets/i18n/it.json +++ b/html_source/src/assets/i18n/it.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Download", "ERROR": "Errore di sistema", "LOADING": "Caricamento dati blockchain", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/ja.json b/html_source/src/assets/i18n/ja.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/ja.json +++ b/html_source/src/assets/i18n/ja.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/ko.json b/html_source/src/assets/i18n/ko.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/ko.json +++ b/html_source/src/assets/i18n/ko.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/nl.json b/html_source/src/assets/i18n/nl.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/nl.json +++ b/html_source/src/assets/i18n/nl.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/no.json b/html_source/src/assets/i18n/no.json index 120d97c8..3baf0c63 100644 --- a/html_source/src/assets/i18n/no.json +++ b/html_source/src/assets/i18n/no.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/pl.json b/html_source/src/assets/i18n/pl.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/pl.json +++ b/html_source/src/assets/i18n/pl.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/pt.json b/html_source/src/assets/i18n/pt.json index 273b65ce..ab52f8dc 100644 --- a/html_source/src/assets/i18n/pt.json +++ b/html_source/src/assets/i18n/pt.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Baixando", "ERROR": "Erro de sistema", "LOADING": "A carregar informação da blockchain", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/ro.json b/html_source/src/assets/i18n/ro.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/ro.json +++ b/html_source/src/assets/i18n/ro.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/ru.json b/html_source/src/assets/i18n/ru.json index 492f2bb8..f2f39182 100644 --- a/html_source/src/assets/i18n/ru.json +++ b/html_source/src/assets/i18n/ru.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/sr.json b/html_source/src/assets/i18n/sr.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/sr.json +++ b/html_source/src/assets/i18n/sr.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/sv.json b/html_source/src/assets/i18n/sv.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/sv.json +++ b/html_source/src/assets/i18n/sv.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/tr.json b/html_source/src/assets/i18n/tr.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/tr.json +++ b/html_source/src/assets/i18n/tr.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/uk.json b/html_source/src/assets/i18n/uk.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/uk.json +++ b/html_source/src/assets/i18n/uk.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/vi.json b/html_source/src/assets/i18n/vi.json index df8d8857..2e2674de 100644 --- a/html_source/src/assets/i18n/vi.json +++ b/html_source/src/assets/i18n/vi.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online", diff --git a/html_source/src/assets/i18n/zh.json b/html_source/src/assets/i18n/zh.json index 3589e298..e0d27821 100644 --- a/html_source/src/assets/i18n/zh.json +++ b/html_source/src/assets/i18n/zh.json @@ -664,6 +664,7 @@ "DOWNLOADING": "Downloading", "ERROR": "System error", "LOADING": "Loading blockchain data", + "LOGGING_OUT": "Logging out", "MB": "MB", "OFFLINE": "Offline", "ONLINE": "Online",