diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.component.html b/libs/ui/src/lib/premium-indicator/premium-indicator.component.html
index 71baae6cb..635346ffb 100644
--- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.html
+++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.html
@@ -1,5 +1,6 @@
Allocation
- %
+ %
From 7f00c2881197ecc120cb2bb4517abea331a8f7c1 Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Sat, 4 Jul 2026 13:12:48 +0700
Subject: [PATCH 06/17] Task/improve type safety in accounts page component
(#7195)
* feat(client): resolve type errors
* feat(client): enforce encapsulation
* feat(client): replace constructor based DI with inject functions
* feat(client): replace deprecated getDeviceInfo
---
.../pages/accounts/accounts-page.component.ts | 140 +++++++++---------
.../interfaces/interfaces.ts | 4 +-
2 files changed, 76 insertions(+), 68 deletions(-)
diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts
index cca1eda03..c99fc40ac 100644
--- a/apps/client/src/app/pages/accounts/accounts-page.component.ts
+++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts
@@ -17,7 +17,9 @@ import { DataService } from '@ghostfolio/ui/services';
import {
ChangeDetectorRef,
Component,
+ computed,
DestroyRef,
+ inject,
OnInit
} from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@@ -25,7 +27,7 @@ import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import { Account as AccountModel } from '@prisma/client';
import { DeviceDetectorService } from 'ngx-device-detector';
-import { EMPTY, Subscription } from 'rxjs';
+import { EMPTY } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { GfCreateOrUpdateAccountDialogComponent } from './create-or-update-account-dialog/create-or-update-account-dialog.component';
@@ -41,29 +43,33 @@ import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-ba
templateUrl: './accounts-page.html'
})
export class GfAccountsPageComponent implements OnInit {
- public accounts: AccountModel[];
- public activitiesCount = 0;
- public deviceType: string;
- public hasImpersonationId: boolean;
- public hasPermissionToCreateAccount: boolean;
- public hasPermissionToUpdateAccount: boolean;
- public routeQueryParams: Subscription;
- public totalBalanceInBaseCurrency = 0;
- public totalValueInBaseCurrency = 0;
- public user: User;
-
- public constructor(
- private changeDetectorRef: ChangeDetectorRef,
- private dataService: DataService,
- private destroyRef: DestroyRef,
- private deviceDetectorService: DeviceDetectorService,
- private dialog: MatDialog,
- private impersonationStorageService: ImpersonationStorageService,
- private notificationService: NotificationService,
- private route: ActivatedRoute,
- private router: Router,
- private userService: UserService
- ) {
+ protected accounts: AccountModel[];
+ protected activitiesCount = 0;
+ protected hasImpersonationId: boolean;
+ protected hasPermissionToCreateAccount: boolean;
+ protected hasPermissionToUpdateAccount: boolean;
+ protected totalBalanceInBaseCurrency = 0;
+ protected totalValueInBaseCurrency = 0;
+ protected user: User;
+
+ private readonly deviceType = computed(
+ () => this.deviceDetectorService.deviceInfo().deviceType
+ );
+
+ private readonly changeDetectorRef = inject(ChangeDetectorRef);
+ private readonly dataService = inject(DataService);
+ private readonly destroyRef = inject(DestroyRef);
+ private readonly deviceDetectorService = inject(DeviceDetectorService);
+ private readonly dialog = inject(MatDialog);
+ private readonly impersonationStorageService = inject(
+ ImpersonationStorageService
+ );
+ private readonly notificationService = inject(NotificationService);
+ private readonly route = inject(ActivatedRoute);
+ private readonly router = inject(Router);
+ private readonly userService = inject(UserService);
+
+ public constructor() {
this.route.queryParams
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
@@ -80,7 +86,9 @@ export class GfAccountsPageComponent implements OnInit {
return id === params['accountId'];
});
- this.openUpdateAccountDialog(account);
+ if (account) {
+ this.openUpdateAccountDialog(account);
+ }
} else {
this.router.navigate(['.'], { relativeTo: this.route });
}
@@ -91,8 +99,6 @@ export class GfAccountsPageComponent implements OnInit {
}
public ngOnInit() {
- this.deviceType = this.deviceDetectorService.getDeviceInfo().deviceType;
-
this.impersonationStorageService
.onChangeHasImpersonation()
.pipe(takeUntilDestroyed(this.destroyRef))
@@ -122,32 +128,7 @@ export class GfAccountsPageComponent implements OnInit {
this.fetchAccounts();
}
- public fetchAccounts() {
- this.dataService
- .fetchAccounts()
- .pipe(takeUntilDestroyed(this.destroyRef))
- .subscribe(
- ({
- accounts,
- activitiesCount,
- totalBalanceInBaseCurrency,
- totalValueInBaseCurrency
- }) => {
- this.accounts = accounts;
- this.activitiesCount = activitiesCount;
- this.totalBalanceInBaseCurrency = totalBalanceInBaseCurrency;
- this.totalValueInBaseCurrency = totalValueInBaseCurrency;
-
- if (this.accounts?.length <= 0) {
- this.router.navigate([], { queryParams: { createDialog: true } });
- }
-
- this.changeDetectorRef.markForCheck();
- }
- );
- }
-
- public onDeleteAccount(aId: string) {
+ protected onDeleteAccount(aId: string) {
this.reset();
this.dataService
@@ -163,19 +144,44 @@ export class GfAccountsPageComponent implements OnInit {
});
}
- public onTransferBalance() {
+ protected onTransferBalance() {
this.router.navigate([], {
queryParams: { transferBalanceDialog: true }
});
}
- public onUpdateAccount(aAccount: AccountModel) {
+ protected onUpdateAccount(aAccount: AccountModel) {
this.router.navigate([], {
queryParams: { accountId: aAccount.id, editDialog: true }
});
}
- public openUpdateAccountDialog({
+ private fetchAccounts() {
+ this.dataService
+ .fetchAccounts()
+ .pipe(takeUntilDestroyed(this.destroyRef))
+ .subscribe(
+ ({
+ accounts,
+ activitiesCount,
+ totalBalanceInBaseCurrency,
+ totalValueInBaseCurrency
+ }) => {
+ this.accounts = accounts;
+ this.activitiesCount = activitiesCount;
+ this.totalBalanceInBaseCurrency = totalBalanceInBaseCurrency;
+ this.totalValueInBaseCurrency = totalValueInBaseCurrency;
+
+ if (this.accounts?.length <= 0) {
+ this.router.navigate([], { queryParams: { createDialog: true } });
+ }
+
+ this.changeDetectorRef.markForCheck();
+ }
+ );
+ }
+
+ private openUpdateAccountDialog({
balance,
comment,
currency,
@@ -199,8 +205,8 @@ export class GfAccountsPageComponent implements OnInit {
platformId
}
},
- height: this.deviceType === 'mobile' ? '98vh' : '80vh',
- width: this.deviceType === 'mobile' ? '100vw' : '50rem'
+ height: this.deviceType() === 'mobile' ? '98vh' : '80vh',
+ width: this.deviceType() === 'mobile' ? '100vw' : '50rem'
});
dialogRef
@@ -237,15 +243,15 @@ export class GfAccountsPageComponent implements OnInit {
autoFocus: false,
data: {
accountId: aAccountId,
- deviceType: this.deviceType,
+ deviceType: this.deviceType(),
hasImpersonationId: this.hasImpersonationId,
hasPermissionToCreateActivity:
!this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createActivity) &&
!this.user?.settings?.isRestrictedView
},
- height: this.deviceType === 'mobile' ? '98vh' : '80vh',
- width: this.deviceType === 'mobile' ? '100vw' : '50rem'
+ height: this.deviceType() === 'mobile' ? '98vh' : '80vh',
+ width: this.deviceType() === 'mobile' ? '100vw' : '50rem'
});
dialogRef
@@ -267,15 +273,15 @@ export class GfAccountsPageComponent implements OnInit {
account: {
balance: 0,
comment: null,
- currency: this.user?.settings?.baseCurrency,
+ currency: this.user?.settings?.baseCurrency ?? null,
id: null,
isExcluded: false,
name: null,
platformId: null
}
- },
- height: this.deviceType === 'mobile' ? '98vh' : '80vh',
- width: this.deviceType === 'mobile' ? '100vw' : '50rem'
+ } satisfies CreateOrUpdateAccountDialogParams,
+ height: this.deviceType() === 'mobile' ? '98vh' : '80vh',
+ width: this.deviceType() === 'mobile' ? '100vw' : '50rem'
});
dialogRef
@@ -312,7 +318,7 @@ export class GfAccountsPageComponent implements OnInit {
data: {
accounts: this.accounts
},
- width: this.deviceType === 'mobile' ? '100vw' : '50rem'
+ width: this.deviceType() === 'mobile' ? '100vw' : '50rem'
});
dialogRef
@@ -353,7 +359,7 @@ export class GfAccountsPageComponent implements OnInit {
}
private reset() {
- this.accounts = undefined;
+ this.accounts = [];
this.activitiesCount = 0;
this.totalBalanceInBaseCurrency = 0;
this.totalValueInBaseCurrency = 0;
diff --git a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts
index a3e6272f8..469ebc844 100644
--- a/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts
+++ b/apps/client/src/app/pages/accounts/create-or-update-account-dialog/interfaces/interfaces.ts
@@ -1,5 +1,7 @@
import { Account } from '@prisma/client';
export interface CreateOrUpdateAccountDialogParams {
- account: Omit
;
+ account: Omit & {
+ id: string | null;
+ };
}
From 680a5ce82995121adf1410a1d4d2f12bab2fa28d Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 4 Jul 2026 08:15:34 +0200
Subject: [PATCH 07/17] Task/upgrade yahoo-finance2 to version 3.15.4 (#7204)
* Update yahoo-finance2 to version 3.15.4
* Update changelog
---
CHANGELOG.md | 1 +
package-lock.json | 8 ++++----
package.json | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9c6a4fc79..9cb127833 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Improved the language localization by translating various tooltips across the application
+- Upgraded `yahoo-finance2` from version `3.14.3` to `3.15.4`
## 3.19.1 - 2026-07-03
diff --git a/package-lock.json b/package-lock.json
index 8370a5765..ac172b504 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -95,7 +95,7 @@
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
"undici": "8.5.0",
- "yahoo-finance2": "3.15.3",
+ "yahoo-finance2": "3.15.4",
"zod": "4.4.3",
"zone.js": "0.16.1"
},
@@ -35734,9 +35734,9 @@
}
},
"node_modules/yahoo-finance2": {
- "version": "3.15.3",
- "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.15.3.tgz",
- "integrity": "sha512-AFmVZ4ACg3QFT2a/hyJv4Scp2J45gm/6xetVgvUvXzZypqsqbgreXJad4i+qm0onj6yeCf2fPhvow7Eh0CwwzA==",
+ "version": "3.15.4",
+ "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.15.4.tgz",
+ "integrity": "sha512-90eOw76iqS//ksQGL4d/VcchbysnpWzFXVuiBtG7uuImlBDdxBA0BtccxCuTvVZDDu1aXm1TqBGc+MPr6wNkyQ==",
"license": "MIT",
"dependencies": {
"@deno/shim-deno": "~0.18.0",
diff --git a/package.json b/package.json
index 4585d34ca..b9d5be234 100644
--- a/package.json
+++ b/package.json
@@ -139,7 +139,7 @@
"tablemark": "4.1.0",
"twitter-api-v2": "1.29.0",
"undici": "8.5.0",
- "yahoo-finance2": "3.15.3",
+ "yahoo-finance2": "3.15.4",
"zod": "4.4.3",
"zone.js": "0.16.1"
},
From fc8c85c5e8e7d431aa0cda63a8e095469040325b Mon Sep 17 00:00:00 2001
From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com>
Date: Sat, 4 Jul 2026 08:15:52 +0200
Subject: [PATCH 08/17] Task/harden endpoint of public access for portfolio
sharing (#7205)
* Harden endpoint by restricting to public accesses
* Update changelog
---
CHANGELOG.md | 1 +
apps/api/src/app/endpoints/public/public.controller.ts | 5 ++++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9cb127833..bb5f41685 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
+- Hardened the endpoint of the public access for portfolio sharing by restricting it to public accesses
- Improved the language localization by translating various tooltips across the application
- Upgraded `yahoo-finance2` from version `3.14.3` to `3.15.4`
diff --git a/apps/api/src/app/endpoints/public/public.controller.ts b/apps/api/src/app/endpoints/public/public.controller.ts
index d06e3b5fe..f43e51f7b 100644
--- a/apps/api/src/app/endpoints/public/public.controller.ts
+++ b/apps/api/src/app/endpoints/public/public.controller.ts
@@ -46,7 +46,10 @@ export class PublicController {
public async getPublicPortfolio(
@Param('accessId') accessId: string
): Promise {
- const access = await this.accessService.access({ id: accessId });
+ const access = await this.accessService.access({
+ granteeUserId: null,
+ id: accessId
+ });
if (!access) {
throw new HttpException(
From 75c8429a089de84a2a61f5d0d1876463861454ae Mon Sep 17 00:00:00 2001
From: Arjun jaiswal <156437180+Arjun8242@users.noreply.github.com>
Date: Sat, 4 Jul 2026 12:00:09 +0530
Subject: [PATCH 09/17] Task/improve language localization for UK (20260702)
(#7181)
Update translations
---
CHANGELOG.md | 1 +
apps/client/src/locales/messages.uk.xlf | 84 ++++++++++++-------------
2 files changed, 43 insertions(+), 42 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bb5f41685..0c9d1783d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Hardened the endpoint of the public access for portfolio sharing by restricting it to public accesses
- Improved the language localization by translating various tooltips across the application
+- Improved the language localization for Ukrainian (`uk`)
- Upgraded `yahoo-finance2` from version `3.14.3` to `3.15.4`
## 3.19.1 - 2026-07-03
diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf
index 693fc8e76..f777e6573 100644
--- a/apps/client/src/locales/messages.uk.xlf
+++ b/apps/client/src/locales/messages.uk.xlf
@@ -672,7 +672,7 @@
Paid
- Paid
+ Платний
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
122
@@ -804,7 +804,7 @@
and is driven by the efforts of its contributors
- and is driven by the efforts of its contributors
+ і розвивається завдяки зусиллям своїх учасників
apps/client/src/app/pages/about/overview/about-overview-page.html
49
@@ -932,7 +932,7 @@
Data Gathering Frequency
- Data Gathering Frequency
+ Частота збору даних
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
454
@@ -968,7 +968,7 @@
Subscription History
- Subscription History
+ Історія підписок
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
136
@@ -1008,7 +1008,7 @@
Do you really want to delete these asset profiles?
- Do you really want to delete these asset profiles?
+ Ви справді хочете видалити ці профілі активів?
apps/client/src/app/components/admin-market-data/admin-market-data.service.ts
67
@@ -1116,7 +1116,7 @@
Technology
- Technology
+ Технологія
libs/ui/src/lib/i18n.ts
96
@@ -1124,7 +1124,7 @@
and we share aggregated key metrics of the platform’s performance
- and we share aggregated key metrics of the platform’s performance
+ і ми ділимося агрегованими ключовими показниками ефективності платформи
apps/client/src/app/pages/about/overview/about-overview-page.html
32
@@ -1132,7 +1132,7 @@
Total
- Total
+ Усього
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
155
@@ -1176,7 +1176,7 @@
Asset profile has been saved
- Asset profile has been saved
+ Профіль активу було збережено
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
645
@@ -1216,7 +1216,7 @@
Industrials
- Industrials
+ Промисловість
libs/ui/src/lib/i18n.ts
93
@@ -1260,7 +1260,7 @@
Consumer Cyclical
- Consumer Cyclical
+ Споживчі товари циклічного попиту
libs/ui/src/lib/i18n.ts
88
@@ -1352,7 +1352,7 @@
Find a holding...
- Find a holding...
+ Знайти актив...
libs/ui/src/lib/assistant/assistant.component.ts
448
@@ -1428,7 +1428,7 @@
Explore
- Explore
+ Огляд
apps/client/src/app/pages/resources/overview/resources-overview.component.html
11
@@ -1452,7 +1452,7 @@
Current year
- Current year
+ Поточний рік
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
228
@@ -1628,7 +1628,7 @@
No auto-renewal on membership.
- No auto-renewal on membership.
+ Автоматичне поновлення підписки вимкнено.
apps/client/src/app/components/user-account-membership/user-account-membership.html
74
@@ -1716,7 +1716,7 @@
Could not validate form
- Could not validate form
+ Не вдалося перевірити форму
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
621
@@ -1868,7 +1868,7 @@
If you plan to open an account at
- If you plan to open an account at
+ Якщо ви плануєте відкрити рахунок у
apps/client/src/app/pages/pricing/pricing-page.html
312
@@ -2056,7 +2056,7 @@
The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- The source code is fully available as open source software (OSS) under the AGPL-3.0 license
+ Вихідний код повністю доступний як програмне забезпечення з відкритим вихідним кодом (OSS) за ліцензією AGPL-3.0
apps/client/src/app/pages/about/overview/about-overview-page.html
16
@@ -2120,7 +2120,7 @@
Current week
- Current week
+ Поточний тиждень
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
220
@@ -2200,7 +2200,7 @@
Energy
- Energy
+ Енергетика
libs/ui/src/lib/i18n.ts
90
@@ -2420,7 +2420,7 @@
send an e-mail to
- send an e-mail to
+ надішліть електронний лист на
apps/client/src/app/pages/about/overview/about-overview-page.html
87
@@ -2452,7 +2452,7 @@
Oops! Could not update access.
- Oops! Could not update access.
+ Упс! Не вдалося оновити права доступу.
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
263
@@ -2656,7 +2656,7 @@
Performance with currency effect
- Performance with currency effect
+ Дохідність з урахуванням впливу валютного курсу
apps/client/src/app/pages/portfolio/analysis/analysis-page.html
134
@@ -2744,7 +2744,7 @@
Check the system status at
- Check the system status at
+ Перевірте стан системи на
apps/client/src/app/pages/about/overview/about-overview-page.html
57
@@ -2816,7 +2816,7 @@
Consumer Defensive
- Consumer Defensive
+ Споживчі товари першої необхідності
libs/ui/src/lib/i18n.ts
89
@@ -2904,7 +2904,7 @@
Jump to a page...
- Jump to a page...
+ Перейти до сторінки...
libs/ui/src/lib/assistant/assistant.component.ts
449
@@ -2920,7 +2920,7 @@
Include in
- Include in
+ Включити до
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
386
@@ -2936,7 +2936,7 @@
Utilities
- Utilities
+ Комунальні послуги
libs/ui/src/lib/i18n.ts
97
@@ -2968,7 +2968,7 @@
Coupon
- Coupon
+ Купон
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
127
@@ -3056,7 +3056,7 @@
this is projected to increase to
- this is projected to increase to
+ прогнозується, що збільшиться до
apps/client/src/app/pages/portfolio/fire/fire-page.html
148
@@ -3164,7 +3164,7 @@
Daily
- Daily
+ Щодня
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
210
@@ -3604,7 +3604,7 @@
Could not parse scraper configuration
- Could not parse scraper configuration
+ Не вдалося розібрати конфігурацію скрапера
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
569
@@ -3793,7 +3793,7 @@
per week
- per week
+ на тиждень
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
130
@@ -3841,7 +3841,7 @@
Creation
- Creation
+ Створення
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
145
@@ -3985,7 +3985,7 @@
Edit access
- Edit access
+ Редагувати доступ
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html
11
@@ -4073,7 +4073,7 @@
Basic Materials
- Basic Materials
+ Основні матеріали
libs/ui/src/lib/i18n.ts
86
@@ -4097,7 +4097,7 @@
Get access to 80’000+ tickers from over 50 exchanges
- Get access to 80’000+ tickers from over 50 exchanges
+ Отримайте доступ до понад 80’000 тикерів з понад 50 бірж
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
84
@@ -4201,7 +4201,7 @@
Oops! Could not delete the asset profiles.
- Oops! Could not delete the asset profiles.
+ Упс! Не вдалося видалити профілі активів.
apps/client/src/app/components/admin-market-data/admin-market-data.service.ts
52
@@ -4241,7 +4241,7 @@
less than
- less than
+ менше ніж
apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html
129
@@ -4313,7 +4313,7 @@
Ghostfolio Status
- Ghostfolio Status
+ Стан Ghostfolio
apps/client/src/app/pages/about/overview/about-overview-page.html
62
@@ -4321,7 +4321,7 @@
with your university e-mail address
- with your university e-mail address
+ за допомогою вашої університетської електронної адреси
apps/client/src/app/pages/pricing/pricing-page.html
348
@@ -4353,7 +4353,7 @@
and a safe withdrawal rate (SWR) of
- and a safe withdrawal rate (SWR) of
+ та безпечним рівнем зняття коштів (SWR) у розмірі
apps/client/src/app/pages/portfolio/fire/fire-page.html
109
From 356b52ffe3d7d67c411a32d52f6f01efd447ade3 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sat, 4 Jul 2026 10:31:52 +0200
Subject: [PATCH 10/17] Task/update locales (#7202)
Co-authored-by: github-actions[bot]
---
apps/client/src/locales/messages.ca.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.de.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.es.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.fr.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.it.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.ja.xlf | 330 +++++++++++++++--------
apps/client/src/locales/messages.ko.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.nl.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.pl.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.pt.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.tr.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.uk.xlf | 332 ++++++++++++++++--------
apps/client/src/locales/messages.xlf | 314 ++++++++++++++--------
apps/client/src/locales/messages.zh.xlf | 332 ++++++++++++++++--------
14 files changed, 3093 insertions(+), 1535 deletions(-)
diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf
index 07d1af071..5fc213ec7 100644
--- a/apps/client/src/locales/messages.ca.xlf
+++ b/apps/client/src/locales/messages.ca.xlf
@@ -322,6 +322,14 @@
42
+
+ Fetch market price
+ Fetch market price
+
+ libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
+ 40
+
+
Restricted view
Vista restringida
@@ -595,11 +603,11 @@
libs/ui/src/lib/accounts-table/accounts-table.component.html
- 320
+ 321
libs/ui/src/lib/activities-table/activities-table.component.html
- 481
+ 482
@@ -635,15 +643,15 @@
libs/ui/src/lib/accounts-table/accounts-table.component.html
- 331
+ 332
libs/ui/src/lib/activities-table/activities-table.component.html
- 508
+ 509
libs/ui/src/lib/benchmark/benchmark.component.html
- 187
+ 193
@@ -779,11 +787,11 @@
- and is driven by the efforts of its contributors
- and is driven by the efforts of its contributors
+ and is driven by the efforts of its contributors
+ and is driven by the efforts of its contributors
apps/client/src/app/pages/about/overview/about-overview-page.html
- 49
+ 50
@@ -862,6 +870,14 @@
6
+
+ Watch the Ghostfol.io Trailer on YouTube
+ Watch the Ghostfol.io Trailer on YouTube
+
+ apps/client/src/app/pages/landing/landing-page.html
+ 19
+
+
Market Price
Preu de Mercat
@@ -978,6 +994,14 @@
174
+
+ Apply current market price
+ Apply current market price
+
+ apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
+ 238
+
+
Subscription History
Subscription History
@@ -1155,7 +1179,7 @@
and we share aggregated key metrics of the platform’s performance
apps/client/src/app/pages/about/overview/about-overview-page.html
- 32
+ 33
@@ -1223,7 +1247,15 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 268
+ 269
+
+
+ libs/ui/src/lib/accounts-table/accounts-table.component.html
+ 287
+
+
+ libs/ui/src/lib/activities-table/activities-table.component.html
+ 372
@@ -1927,8 +1959,8 @@
- The source code is fully available as open source software (OSS) under the AGPL-3.0 license
- The source code is fully available as open source software (OSS) under the AGPL-3.0 license
+ The source code is fully available as open source software (OSS) under the AGPL-3.0 license
+ The source code is fully available as open source software (OSS) under the AGPL-3.0 license
apps/client/src/app/pages/about/overview/about-overview-page.html
16
@@ -2075,11 +2107,11 @@
apps/client/src/app/pages/landing/landing-page.html
- 47
+ 48
apps/client/src/app/pages/landing/landing-page.html
- 348
+ 352
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
@@ -2438,6 +2470,14 @@
387
+
+ Ghostfolio in Numbers: Monthly Active Users (MAU)
+ Ghostfolio in Numbers: Monthly Active Users (MAU)
+
+ apps/client/src/app/pages/landing/landing-page.html
+ 63
+
+
5Y
5 anys
@@ -2738,6 +2778,14 @@
176
+
+ Contributors to Ghostfolio
+ Contributors to Ghostfolio
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 54
+
+
Light
Llum
@@ -3063,7 +3111,7 @@
Vaja, la transferència del saldo en efectiu ha fallat.
apps/client/src/app/pages/accounts/accounts-page.component.ts
- 337
+ 343
@@ -3375,7 +3423,7 @@
apps/client/src/app/pages/about/overview/about-overview-page.html
- 189
+ 193
apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts
@@ -3548,11 +3596,11 @@
apps/client/src/app/pages/landing/landing-page.html
- 41
+ 42
apps/client/src/app/pages/landing/landing-page.html
- 344
+ 348
apps/client/src/app/pages/pricing/pricing-page.html
@@ -3724,7 +3772,7 @@
Usuaris actius mensuals
apps/client/src/app/pages/landing/landing-page.html
- 69
+ 71
@@ -3732,11 +3780,11 @@
Estrelles a GitHub
apps/client/src/app/pages/landing/landing-page.html
- 87
+ 90
apps/client/src/app/pages/open/open-page.html
- 103
+ 104
@@ -3744,11 +3792,11 @@
Activa el Docker Hub
apps/client/src/app/pages/landing/landing-page.html
- 105
+ 109
apps/client/src/app/pages/open/open-page.html
- 117
+ 118
@@ -3756,7 +3804,7 @@
Com es veu a
apps/client/src/app/pages/landing/landing-page.html
- 114
+ 118
@@ -3764,7 +3812,7 @@
Protegeix els teus actius . Refina la teva estratègia d’inversió personal .
apps/client/src/app/pages/landing/landing-page.html
- 124
+ 128
@@ -3772,7 +3820,7 @@
Ghostfolio permet a la gent ocupada fer un seguiment d’accions, ETF o criptomonedes sense ser rastrejada.
apps/client/src/app/pages/landing/landing-page.html
- 128
+ 132
@@ -3780,7 +3828,7 @@
Vista de 360°
apps/client/src/app/pages/landing/landing-page.html
- 138
+ 142
@@ -3788,7 +3836,7 @@
Obtingueu la imatge completa de les vostres finances personals en múltiples plataformes.
apps/client/src/app/pages/landing/landing-page.html
- 141
+ 145
@@ -3796,7 +3844,7 @@
Web3 llest
apps/client/src/app/pages/landing/landing-page.html
- 149
+ 153
@@ -3812,7 +3860,7 @@
Utilitza Ghostfolio de manera anònima i sigues propietari de les teves dades financeres.
apps/client/src/app/pages/landing/landing-page.html
- 152
+ 156
@@ -3820,7 +3868,7 @@
Beneficia’t de millores contínues gràcies a una comunitat forta.
apps/client/src/app/pages/landing/landing-page.html
- 162
+ 166
@@ -3836,7 +3884,7 @@
Per què Ghostfolio ?
apps/client/src/app/pages/landing/landing-page.html
- 170
+ 174
@@ -3844,7 +3892,7 @@
Ghostfolio és per a tu si ets...
apps/client/src/app/pages/landing/landing-page.html
- 172
+ 176
@@ -3852,7 +3900,7 @@
negociar accions, ETF o criptomonedes en múltiples plataformes
apps/client/src/app/pages/landing/landing-page.html
- 178
+ 182
@@ -3860,7 +3908,7 @@
perseguint una compra & mantenir l’estratègia
apps/client/src/app/pages/landing/landing-page.html
- 184
+ 188
@@ -3868,7 +3916,7 @@
interessat a obtenir informació sobre la composició de la vostra cartera
apps/client/src/app/pages/landing/landing-page.html
- 189
+ 193
@@ -3876,7 +3924,7 @@
valorant la privadesa i la propietat de les dades
apps/client/src/app/pages/landing/landing-page.html
- 194
+ 198
@@ -3884,7 +3932,7 @@
al minimalisme
apps/client/src/app/pages/landing/landing-page.html
- 197
+ 201
@@ -3892,7 +3940,7 @@
preocupant-se per diversificar els seus recursos econòmics
apps/client/src/app/pages/landing/landing-page.html
- 201
+ 205
@@ -3900,7 +3948,7 @@
interessada en la independència financera
apps/client/src/app/pages/landing/landing-page.html
- 205
+ 209
@@ -3908,7 +3956,7 @@
dir no als fulls de càlcul
apps/client/src/app/pages/landing/landing-page.html
- 209
+ 213
@@ -3916,7 +3964,7 @@
encara llegint aquesta llista
apps/client/src/app/pages/landing/landing-page.html
- 212
+ 216
@@ -3924,7 +3972,7 @@
Més informació sobre Ghostfolio
apps/client/src/app/pages/landing/landing-page.html
- 217
+ 221
@@ -3940,7 +3988,7 @@
Que nostre usuaris estan dient
apps/client/src/app/pages/landing/landing-page.html
- 226
+ 230
@@ -3948,7 +3996,7 @@
Membres de tot el món estan utilitzant Ghostfolio Premium
apps/client/src/app/pages/landing/landing-page.html
- 265
+ 269
@@ -3956,7 +4004,7 @@
Com ho fa Ghostfolio treballar?
apps/client/src/app/pages/landing/landing-page.html
- 282
+ 286
@@ -3964,7 +4012,7 @@
Comença en només 3 passos
apps/client/src/app/pages/landing/landing-page.html
- 284
+ 288
@@ -3980,7 +4028,7 @@
Registra’t de manera anònima*
apps/client/src/app/pages/landing/landing-page.html
- 290
+ 294
@@ -3988,7 +4036,7 @@
* no es requereix cap adreça de correu electrònic ni targeta de crèdit
apps/client/src/app/pages/landing/landing-page.html
- 292
+ 296
@@ -3996,7 +4044,7 @@
Afegiu qualsevol de les vostres transaccions històriques
apps/client/src/app/pages/landing/landing-page.html
- 304
+ 308
@@ -4004,7 +4052,7 @@
Obteniu informació valuosa sobre la composició de la vostra cartera
apps/client/src/app/pages/landing/landing-page.html
- 316
+ 320
@@ -4012,7 +4060,7 @@
Són tu llest?
apps/client/src/app/pages/landing/landing-page.html
- 330
+ 334
@@ -4020,12 +4068,12 @@
Uneix-te ara o consulteu el compte d’exemple
apps/client/src/app/pages/landing/landing-page.html
- 333
+ 337
- At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status.
- A Ghostfolio, la transparència és la base dels nostres valors. Publiquem el codi font com a programari de codi obert (OSS) sota el Llicència AGPL-3.0 i compartim obertament mètriques clau agregades de l’estat operatiu de la plataforma.
+ At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status.
+ A Ghostfolio, la transparència és la base dels nostres valors. Publiquem el codi font com a programari de codi obert (OSS) sota el Llicència AGPL-3.0 i compartim obertament mètriques clau agregades de l’estat operatiu de la plataforma.
apps/client/src/app/pages/open/open-page.html
7
@@ -4036,7 +4084,7 @@
(Últimes 24 hores)
apps/client/src/app/pages/open/open-page.html
- 37
+ 38
@@ -4044,7 +4092,7 @@
Ghostfolio Status
apps/client/src/app/pages/about/overview/about-overview-page.html
- 62
+ 64
@@ -4060,11 +4108,11 @@
Usuaris actius
apps/client/src/app/pages/open/open-page.html
- 40
+ 41
apps/client/src/app/pages/open/open-page.html
- 62
+ 63
@@ -4072,11 +4120,11 @@
(Últims 30 dies)
apps/client/src/app/pages/open/open-page.html
- 48
+ 49
apps/client/src/app/pages/open/open-page.html
- 59
+ 60
@@ -4092,7 +4140,7 @@
Usuaris nous
apps/client/src/app/pages/open/open-page.html
- 51
+ 52
@@ -4100,7 +4148,7 @@
Usuaris de la comunitat Slack
apps/client/src/app/pages/open/open-page.html
- 75
+ 76
@@ -4116,7 +4164,7 @@
Col·laboradors a GitHub
apps/client/src/app/pages/open/open-page.html
- 89
+ 90
@@ -4124,7 +4172,7 @@
(Últims 90 dies)
apps/client/src/app/pages/open/open-page.html
- 127
+ 128
@@ -4132,7 +4180,7 @@
Temps de funcionament
apps/client/src/app/pages/open/open-page.html
- 132
+ 133
@@ -4280,7 +4328,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 407
+ 408
@@ -4296,7 +4344,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 421
+ 422
@@ -4320,7 +4368,7 @@
or start a discussion at
apps/client/src/app/pages/about/overview/about-overview-page.html
- 94
+ 98
@@ -5173,7 +5221,7 @@
Alternativa de codi obert a
apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
- 42
+ 43
@@ -5245,7 +5293,7 @@
Website of Thomas Kaul
apps/client/src/app/pages/about/overview/about-overview-page.html
- 44
+ 45
@@ -5316,6 +5364,14 @@
274
+
+ Upgrade to Ghostfolio Premium
+ Upgrade to Ghostfolio Premium
+
+ libs/ui/src/lib/premium-indicator/premium-indicator.component.html
+ 4
+
+
❌ No
❌ No
@@ -5529,7 +5585,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 435
+ 436
@@ -5541,7 +5597,7 @@
libs/ui/src/lib/activities-table/activities-table.component.html
- 448
+ 449
@@ -5565,7 +5621,7 @@
Clonar
libs/ui/src/lib/activities-table/activities-table.component.html
- 487
+ 488
@@ -5573,7 +5629,7 @@
Exporta l’esborrany com a ICS
libs/ui/src/lib/activities-table/activities-table.component.html
- 497
+ 498
@@ -5833,7 +5889,7 @@
Import total previst
libs/ui/src/lib/fire-calculator/fire-calculator.component.html
- 59
+ 66
@@ -5849,7 +5905,7 @@
Dipòsit
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 404
+ 410
@@ -5865,7 +5921,7 @@
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 414
+ 420
libs/ui/src/lib/i18n.ts
@@ -5877,7 +5933,7 @@
Estalvi
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
- 424
+ 430
@@ -5891,10 +5947,18 @@
libs/ui/src/lib/holdings-table/holdings-table.component.html
122
+
+ libs/ui/src/lib/holdings-table/holdings-table.component.html
+ 123
+
libs/ui/src/lib/top-holdings/top-holdings.component.html
40
+
+ libs/ui/src/lib/top-holdings/top-holdings.component.html
+ 41
+
libs/ui/src/lib/top-holdings/top-holdings.component.html
116
@@ -5957,7 +6021,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 283
+ 284
libs/ui/src/lib/i18n.ts
@@ -5989,7 +6053,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 302
+ 303
libs/ui/src/lib/i18n.ts
@@ -6108,6 +6172,14 @@
449
+
+ Ghostfolio in Numbers: Pulls on Docker Hub
+ Ghostfolio in Numbers: Pulls on Docker Hub
+
+ apps/client/src/app/pages/landing/landing-page.html
+ 101
+
+
Preset
Predefinit
@@ -6205,7 +6277,7 @@
libs/ui/src/lib/accounts-table/accounts-table.component.html
- 314
+ 315
@@ -6241,7 +6313,7 @@
Comissió
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 255
+ 256
libs/ui/src/lib/activities-table/activities-table.component.html
@@ -6525,7 +6597,7 @@
libs/ui/src/lib/benchmark/benchmark.component.html
- 220
+ 226
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
@@ -6661,7 +6733,7 @@
Open Source
apps/client/src/app/pages/landing/landing-page.html
- 159
+ 163
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
@@ -6733,7 +6805,7 @@
View Holding
libs/ui/src/lib/activities-table/activities-table.component.html
- 474
+ 475
@@ -6833,7 +6905,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 338
+ 339
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html
@@ -6841,7 +6913,7 @@
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
- 47
+ 48
libs/ui/src/lib/i18n.ts
@@ -6889,7 +6961,7 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 340
+ 341
libs/ui/src/lib/i18n.ts
@@ -6973,7 +7045,7 @@
send an e-mail to
apps/client/src/app/pages/about/overview/about-overview-page.html
- 87
+ 91
@@ -7001,7 +7073,7 @@
libs/ui/src/lib/value/value.component.ts
- 180
+ 182
@@ -7012,6 +7084,14 @@
60
+
+ Compare Ghostfolio to -
+ Compare Ghostfolio to -
+
+ apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html
+ 32
+
+
Oops! Invalid currency.
Oops! Invalid currency.
@@ -7435,11 +7515,11 @@
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html
- 349
+ 350
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html
- 49
+ 50
@@ -7467,7 +7547,7 @@
Check the system status at
apps/client/src/app/pages/about/overview/about-overview-page.html
- 57
+ 59
@@ -7594,6 +7674,14 @@
380
+
+ Ghostfolio in Numbers: Stars on GitHub
+ Ghostfolio in Numbers: Stars on GitHub
+
+ apps/client/src/app/pages/landing/landing-page.html
+ 82
+
+
Performance
Performance
@@ -7609,6 +7697,10 @@
libs/ui/src/lib/holdings-table/holdings-table.component.html
166
+
+ libs/ui/src/lib/holdings-table/holdings-table.component.html
+ 167
+
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
380
@@ -7623,7 +7715,7 @@
The project has been initiated by
apps/client/src/app/pages/about/overview/about-overview-page.html
- 40
+ 41
@@ -7868,7 +7960,7 @@
Do you really want to delete this item?
libs/ui/src/lib/benchmark/benchmark.component.ts
- 141
+ 142
@@ -7981,11 +8073,11 @@
Live Demo
apps/client/src/app/pages/landing/landing-page.html
- 48
+ 49
apps/client/src/app/pages/landing/landing-page.html
- 349
+ 353
libs/common/src/lib/routes/routes.ts
@@ -8062,6 +8154,14 @@
16
+
+ Post to Ghostfolio on X (formerly Twitter)
+ Post to Ghostfolio on X (formerly Twitter)
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 85
+
+
Get Access
Get Access
@@ -8300,11 +8400,11 @@
- If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
- If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
+ If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
+ If you encounter a bug, would like to suggest an improvement or a new feature , please join the Ghostfolio Slack community, post to @ghostfolio_
apps/client/src/app/pages/about/overview/about-overview-page.html
- 69
+ 71
@@ -8716,11 +8816,19 @@
Find Ghostfolio on GitHub
apps/client/src/app/pages/about/overview/about-overview-page.html
- 99
+ 20
apps/client/src/app/pages/about/overview/about-overview-page.html
- 138
+ 103
+
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 142
+
+
+ apps/client/src/app/pages/open/open-page.html
+ 12
@@ -8728,7 +8836,11 @@
Join the Ghostfolio Slack community
apps/client/src/app/pages/about/overview/about-overview-page.html
- 109
+ 78
+
+
+ apps/client/src/app/pages/about/overview/about-overview-page.html
+ 113
@@ -8736,7 +8848,7 @@
Follow Ghostfolio on X (formerly Twitter)
apps/client/src/app/pages/about/overview/about-overview-page.html
- 118
+ 122
@@ -8744,11 +8856,11 @@
Send an e-mail
apps/client/src/app/pages/about/overview/about-overview-page.html
- 89
+ 93
apps/client/src/app/pages/about/overview/about-overview-page.html
- 128
+ 132
@@ -8764,7 +8876,7 @@
Follow Ghostfolio on LinkedIn
apps/client/src/app/pages/about/overview/about-overview-page.html
- 147
+ 151
@@ -8772,7 +8884,7 @@
Ghostfolio is an independent & bootstrapped business
apps/client/src/app/pages/about/overview/about-overview-page.html
- 157
+ 161
@@ -8780,7 +8892,7 @@
Support Ghostfolio
apps/client/src/app/pages/about/overview/about-overview-page.html
- 166
+ 170