Browse Source

Merge remote-tracking branch 'upstream/main' into fix/holdings-quantity

pull/5600/head
Germán Martín 4 weeks ago
parent
commit
fb66171276
  1. 56
      CHANGELOG.md
  2. 18
      apps/api/src/app/admin/admin.controller.ts
  3. 1
      apps/api/src/app/endpoints/sitemap/sitemap.controller.ts
  4. 138
      apps/api/src/app/endpoints/sitemap/sitemap.service.ts
  5. 1
      apps/api/src/app/portfolio/portfolio.controller.ts
  6. 10
      apps/api/src/app/portfolio/portfolio.service.ts
  7. 4
      apps/api/src/app/user/update-user-setting.dto.ts
  8. 5
      apps/api/src/app/user/user.service.ts
  9. 1
      apps/api/src/assets/sitemap.xml
  10. 4
      apps/api/src/middlewares/html-template.middleware.ts
  11. 7
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  12. 14
      apps/api/src/services/queues/data-gathering/data-gathering.service.ts
  13. 2
      apps/client/src/app/app-routing.module.ts
  14. 10
      apps/client/src/app/components/admin-jobs/admin-jobs.component.ts
  15. 58
      apps/client/src/app/components/admin-jobs/admin-jobs.html
  16. 4
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  17. 9
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts
  18. 9
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html
  19. 2
      apps/client/src/app/components/home-market/home-market.component.ts
  20. 4
      apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts
  21. 8
      apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html
  22. 23
      apps/client/src/app/components/home-watchlist/home-watchlist.component.ts
  23. 1
      apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts
  24. 2
      apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts
  25. 133
      apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html
  26. 4
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
  27. 4
      apps/client/src/app/components/user-account-access/user-account-access.component.ts
  28. 5
      apps/client/src/app/directives/file-drop/file-drop.directive.ts
  29. 9
      apps/client/src/app/directives/file-drop/file-drop.module.ts
  30. 17
      apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.component.ts
  31. 201
      apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html
  32. 9
      apps/client/src/app/pages/blog/blog-page-routing.module.ts
  33. 24
      apps/client/src/app/pages/blog/blog-page.html
  34. 8
      apps/client/src/app/pages/home/home-page.routes.ts
  35. 4
      apps/client/src/app/pages/markets/markets-page.component.ts
  36. 22
      apps/client/src/app/pages/open/open-page-routing.module.ts
  37. 20
      apps/client/src/app/pages/open/open-page.component.ts
  38. 20
      apps/client/src/app/pages/open/open-page.module.ts
  39. 15
      apps/client/src/app/pages/open/open-page.routes.ts
  40. 72
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  41. 4
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  42. 14
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  43. 26
      apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
  44. 43
      apps/client/src/app/pages/portfolio/fire/fire-page.html
  45. 9
      apps/client/src/app/pipes/symbol/symbol.module.ts
  46. 5
      apps/client/src/app/pipes/symbol/symbol.pipe.ts
  47. 84
      apps/client/src/app/services/data.service.ts
  48. BIN
      apps/client/src/assets/images/blog/hacktoberfest-2025.png
  49. 122
      apps/client/src/locales/messages.ca.xlf
  50. 122
      apps/client/src/locales/messages.de.xlf
  51. 122
      apps/client/src/locales/messages.es.xlf
  52. 122
      apps/client/src/locales/messages.fr.xlf
  53. 122
      apps/client/src/locales/messages.it.xlf
  54. 122
      apps/client/src/locales/messages.nl.xlf
  55. 122
      apps/client/src/locales/messages.pl.xlf
  56. 122
      apps/client/src/locales/messages.pt.xlf
  57. 122
      apps/client/src/locales/messages.tr.xlf
  58. 122
      apps/client/src/locales/messages.uk.xlf
  59. 114
      apps/client/src/locales/messages.xlf
  60. 122
      apps/client/src/locales/messages.zh.xlf
  61. 6
      apps/client/src/styles/table.scss
  62. 6
      libs/common/src/lib/chart-helper.ts
  63. 3
      libs/common/src/lib/interfaces/fire-wealth.interface.ts
  64. 2
      libs/common/src/lib/interfaces/index.ts
  65. 3
      libs/common/src/lib/interfaces/portfolio-summary.interface.ts
  66. 1
      libs/common/src/lib/interfaces/user-settings.interface.ts
  67. 10
      libs/ui/src/lib/accounts-table/accounts-table.component.scss
  68. 4
      libs/ui/src/lib/activities-filter/activities-filter.component.ts
  69. 4
      libs/ui/src/lib/activities-table/activities-table.component.html
  70. 471
      libs/ui/src/lib/activities-table/activities-table.component.stories.ts
  71. 4
      libs/ui/src/lib/activities-table/activities-table.component.ts
  72. 4
      libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts
  73. 67
      libs/ui/src/lib/assistant/assistant.component.ts
  74. 10
      libs/ui/src/lib/benchmark/benchmark.component.scss
  75. 1
      libs/ui/src/lib/fire-calculator/fire-calculator.component.html
  76. 2
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
  77. 10
      libs/ui/src/lib/holdings-table/holdings-table.component.scss
  78. 2
      libs/ui/src/lib/holdings-table/holdings-table.component.ts
  79. 5
      libs/ui/src/lib/line-chart/line-chart.component.ts
  80. 4
      libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
  81. 4
      libs/ui/src/lib/top-holdings/top-holdings.component.ts
  82. 104
      package-lock.json
  83. 8
      package.json

56
CHANGELOG.md

@ -7,6 +7,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Added
- Added support for a date range query parameter in the data gathering endpoint
- Added a _Storybook_ story for the activities table component
## 2.206.0 - 2025-10-04
### Changed
- Localized the number formatting in the settings dialog to customize the rule thresholds of the _X-ray_ page
- Improved the usability of the assistant by preselecting the first search result
- Improved the usability of the _Cancel_ / _Close_ buttons in the create watchlist item dialog
- Refactored the `fireWealth` from `number` type to a structured object in the summary of the portfolio details endpoint
- Refactored the _Open Startup_ (`/open`) page to standalone
- Refactored the file drop directive to standalone
- Refactored the symbol pipe to standalone
### Fixed
- Handled an exception in the get asset profile functionality of the _Financial Modeling Prep_ service
- Added the missing `CommonModule` import in the import activities dialog
## 2.205.0 - 2025-10-01
### Changed
- Restricted the selection of the retirement date picker in the _FIRE_ calculator to a future date
- Improved the support for mutual funds in the _Financial Modeling Prep_ service (get asset profiles)
- Improved the language localization for German (`de`)
- Upgraded `prisma` from version `6.16.1` to `6.16.3`
## 2.204.0 - 2025-09-30
### Added
- Added the safe withdrawal rate to the user settings (experimental)
### Changed
- Improved the number formatting of the y-axis labels in the investment chart component
- Localized the number formatting of the y-axis labels in the line chart component
- Improved the wording of the 4% rule in the _FIRE_ section
- Improved the usability of the create asset profile dialog in the market data section of the admin control panel
- Improved the language localization for German (`de`)
### Fixed
- Improved the table headers’ alignment of the activities table
## 2.203.0 - 2025-09-27
### Added
- Added support for column sorting to the queue jobs table in the admin control panel
- Added a blog post: _Hacktoberfest 2025_
### Changed
- Removed the deprecated `ITEM` activity type

18
apps/api/src/app/admin/admin.controller.ts

@ -6,6 +6,7 @@ import { ManualService } from '@ghostfolio/api/services/data-provider/manual/man
import { DemoService } from '@ghostfolio/api/services/demo/demo.service';
import { PropertyDto } from '@ghostfolio/api/services/property/property.dto';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper';
import {
DATA_GATHERING_QUEUE_PRIORITY_HIGH,
DATA_GATHERING_QUEUE_PRIORITY_MEDIUM,
@ -22,6 +23,7 @@ import {
} from '@ghostfolio/common/interfaces';
import { permissions } from '@ghostfolio/common/permissions';
import type {
DateRange,
MarketDataPreset,
RequestWithUser
} from '@ghostfolio/common/types';
@ -161,9 +163,21 @@ export class AdminController {
@HasPermission(permissions.accessAdminControl)
public async gatherSymbol(
@Param('dataSource') dataSource: DataSource,
@Param('symbol') symbol: string
@Param('symbol') symbol: string,
@Query('range') dateRange: DateRange
): Promise<void> {
this.dataGatheringService.gatherSymbol({ dataSource, symbol });
let date: Date;
if (dateRange) {
const { startDate } = getIntervalFromDateRange(dateRange, new Date());
date = startDate;
}
this.dataGatheringService.gatherSymbol({
dataSource,
date,
symbol
});
return;
}

1
apps/api/src/app/endpoints/sitemap/sitemap.controller.ts

@ -37,6 +37,7 @@ export class SitemapController {
response.setHeader('content-type', 'application/xml');
response.send(
interpolate(this.sitemapXml, {
blogPosts: this.sitemapService.getBlogPosts({ currentDate }),
personalFinanceTools: this.configurationService.get(
'ENABLE_FEATURE_SUBSCRIPTION'
)

138
apps/api/src/app/endpoints/sitemap/sitemap.service.ts

@ -17,6 +17,121 @@ export class SitemapService {
private readonly i18nService: I18nService
) {}
public getBlogPosts({ currentDate }: { currentDate: string }) {
const rootUrl = this.configurationService.get('ROOT_URL');
return [
{
languageCode: 'de',
routerLink: ['2021', '07', 'hallo-ghostfolio']
},
{
languageCode: 'en',
routerLink: ['2021', '07', 'hello-ghostfolio']
},
{
languageCode: 'en',
routerLink: ['2022', '01', 'ghostfolio-first-months-in-open-source']
},
{
languageCode: 'en',
routerLink: ['2022', '07', 'ghostfolio-meets-internet-identity']
},
{
languageCode: 'en',
routerLink: ['2022', '07', 'how-do-i-get-my-finances-in-order']
},
{
languageCode: 'en',
routerLink: ['2022', '08', '500-stars-on-github']
},
{
languageCode: 'en',
routerLink: ['2022', '10', 'hacktoberfest-2022']
},
{
languageCode: 'en',
routerLink: ['2022', '11', 'black-friday-2022']
},
{
languageCode: 'en',
routerLink: [
'2022',
'12',
'the-importance-of-tracking-your-personal-finances'
]
},
{
languageCode: 'de',
routerLink: ['2023', '01', 'ghostfolio-auf-sackgeld-vorgestellt']
},
{
languageCode: 'en',
routerLink: ['2023', '02', 'ghostfolio-meets-umbrel']
},
{
languageCode: 'en',
routerLink: ['2023', '03', 'ghostfolio-reaches-1000-stars-on-github']
},
{
languageCode: 'en',
routerLink: [
'2023',
'05',
'unlock-your-financial-potential-with-ghostfolio'
]
},
{
languageCode: 'en',
routerLink: ['2023', '07', 'exploring-the-path-to-fire']
},
{
languageCode: 'en',
routerLink: ['2023', '08', 'ghostfolio-joins-oss-friends']
},
{
languageCode: 'en',
routerLink: ['2023', '09', 'ghostfolio-2']
},
{
languageCode: 'en',
routerLink: ['2023', '09', 'hacktoberfest-2023']
},
{
languageCode: 'en',
routerLink: ['2023', '11', 'black-week-2023']
},
{
languageCode: 'en',
routerLink: ['2023', '11', 'hacktoberfest-2023-debriefing']
},
{
languageCode: 'en',
routerLink: ['2024', '09', 'hacktoberfest-2024']
},
{
languageCode: 'en',
routerLink: ['2024', '11', 'black-weeks-2024']
},
{
languageCode: 'en',
routerLink: ['2025', '09', 'hacktoberfest-2025']
}
]
.map(({ languageCode, routerLink }) => {
return this.createRouteSitemapUrl({
currentDate,
languageCode,
rootUrl,
route: {
routerLink: [publicRoutes.blog.path, ...routerLink],
path: undefined
}
});
})
.join('\n');
}
public getPersonalFinanceTools({ currentDate }: { currentDate: string }) {
const rootUrl = this.configurationService.get('ROOT_URL');
@ -43,20 +158,21 @@ export class SitemapService {
});
return personalFinanceTools.map(({ alias, key }) => {
const location = [
rootUrl,
languageCode,
const routerLink = [
resourcesPath,
personalFinanceToolsPath,
`${productPath}-${alias ?? key}`
].join('/');
return [
' <url>',
` <loc>${location}</loc>`,
` <lastmod>${currentDate}T00:00:00+00:00</lastmod>`,
' </url>'
].join('\n');
];
return this.createRouteSitemapUrl({
currentDate,
languageCode,
rootUrl,
route: {
routerLink,
path: undefined
}
});
});
}).join('\n');
}

1
apps/api/src/app/portfolio/portfolio.controller.ts

@ -195,7 +195,6 @@ export class PortfolioController {
'excludedAccountsAndActivities',
'fees',
'filteredValueInBaseCurrency',
'fireWealth',
'grossPerformance',
'grossPerformanceWithCurrencyEffect',
'interest',

10
apps/api/src/app/portfolio/portfolio.service.ts

@ -2092,9 +2092,13 @@ export class PortfolioService {
filteredValueInPercentage: netWorth
? filteredValueInBaseCurrency.div(netWorth).toNumber()
: undefined,
fireWealth: new Big(currentValueInBaseCurrency)
.minus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber(),
fireWealth: {
today: {
valueInBaseCurrency: new Big(currentValueInBaseCurrency)
.minus(emergencyFundHoldingsValueInBaseCurrency)
.toNumber()
}
},
grossPerformance: new Big(netPerformance).plus(fees).toNumber(),
grossPerformanceWithCurrencyEffect: new Big(
netPerformanceWithCurrencyEffect

4
apps/api/src/app/user/update-user-setting.dto.ts

@ -104,6 +104,10 @@ export class UpdateUserSettingDto {
@IsOptional()
retirementDate?: string;
@IsNumber()
@IsOptional()
safeWithdrawalRate?: number;
@IsNumber()
@IsOptional()
savingsRate?: number;

5
apps/api/src/app/user/user.service.ts

@ -265,6 +265,11 @@ export class UserService {
PerformanceCalculationType.ROAI;
}
// Set default value for safe withdrawal rate
if (!(user.settings.settings as UserSettings)?.safeWithdrawalRate) {
(user.settings.settings as UserSettings).safeWithdrawalRate = 0.04;
}
// Set default value for view mode
if (!(user.settings.settings as UserSettings).viewMode) {
(user.settings.settings as UserSettings).viewMode = 'DEFAULT';

1
apps/api/src/assets/sitemap.xml

@ -5,5 +5,6 @@
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
${publicRoutes}
${blogPosts}
${personalFinanceTools}
</urlset>

4
apps/api/src/middlewares/html-template.middleware.ts

@ -75,6 +75,10 @@ const locales = {
'/en/blog/2024/11/black-weeks-2024': {
featureGraphicPath: 'assets/images/blog/black-weeks-2024.jpg',
title: `Black Weeks 2024 - ${title}`
},
'/en/blog/2025/09/hacktoberfest-2025': {
featureGraphicPath: 'assets/images/blog/hacktoberfest-2025.png',
title: `Hacktoberfest 2025 - ${title}`
}
};

7
apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts

@ -106,7 +106,10 @@ export class FinancialModelingPrepService implements DataProviderInterface {
response.assetClass = assetClass;
response.assetSubClass = assetSubClass;
if (assetSubClass === AssetSubClass.ETF) {
if (
assetSubClass === AssetSubClass.ETF ||
assetSubClass === AssetSubClass.MUTUALFUND
) {
const etfCountryWeightings = await fetch(
`${this.getUrl({ version: 'stable' })}/etf/country-weightings?symbol=${symbol}&apikey=${this.apiKey}`,
{
@ -158,7 +161,7 @@ export class FinancialModelingPrepService implements DataProviderInterface {
}
).then((res) => res.json());
if (etfInformation.website) {
if (etfInformation?.website) {
response.url = etfInformation.website;
}

14
apps/api/src/services/queues/data-gathering/data-gathering.service.ts

@ -94,17 +94,21 @@ export class DataGatheringService {
});
}
public async gatherSymbol({ dataSource, symbol }: AssetProfileIdentifier) {
public async gatherSymbol({ dataSource, date, symbol }: IDataGatheringItem) {
await this.marketDataService.deleteMany({ dataSource, symbol });
const dataGatheringItems = (await this.getSymbolsMax()).filter(
(dataGatheringItem) => {
const dataGatheringItems = (await this.getSymbolsMax())
.filter((dataGatheringItem) => {
return (
dataGatheringItem.dataSource === dataSource &&
dataGatheringItem.symbol === symbol
);
}
);
})
.map((item) => ({
...item,
date: date ?? item.date
}));
await this.gatherSymbols({
dataGatheringItems,
priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH

2
apps/client/src/app/app-routing.module.ts

@ -94,7 +94,7 @@ const routes: Routes = [
{
path: publicRoutes.openStartup.path,
loadChildren: () =>
import('./pages/open/open-page.module').then((m) => m.OpenPageModule)
import('./pages/open/open-page.routes').then((m) => m.routes)
},
{
path: internalRoutes.portfolio.path,

10
apps/client/src/app/components/admin-jobs/admin-jobs.component.ts

@ -16,7 +16,8 @@ import {
ChangeDetectorRef,
Component,
OnDestroy,
OnInit
OnInit,
ViewChild
} from '@angular/core';
import {
FormBuilder,
@ -27,6 +28,7 @@ import {
import { MatButtonModule } from '@angular/material/button';
import { MatMenuModule } from '@angular/material/menu';
import { MatSelectModule } from '@angular/material/select';
import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { IonIcon } from '@ionic/angular/standalone';
import { JobStatus } from 'bull';
@ -44,6 +46,7 @@ import {
removeCircleOutline,
timeOutline
} from 'ionicons/icons';
import { get } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
@ -57,6 +60,7 @@ import { takeUntil } from 'rxjs/operators';
MatButtonModule,
MatMenuModule,
MatSelectModule,
MatSortModule,
MatTableModule,
NgxSkeletonLoaderModule,
ReactiveFormsModule
@ -66,6 +70,8 @@ import { takeUntil } from 'rxjs/operators';
templateUrl: './admin-jobs.html'
})
export class GfAdminJobsComponent implements OnDestroy, OnInit {
@ViewChild(MatSort) sort: MatSort;
public DATA_GATHERING_QUEUE_PRIORITY_LOW = DATA_GATHERING_QUEUE_PRIORITY_LOW;
public DATA_GATHERING_QUEUE_PRIORITY_HIGH =
DATA_GATHERING_QUEUE_PRIORITY_HIGH;
@ -196,6 +202,8 @@ export class GfAdminJobsComponent implements OnDestroy, OnInit {
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ jobs }) => {
this.dataSource = new MatTableDataSource(jobs);
this.dataSource.sort = this.sort;
this.dataSource.sortingDataAccessor = get;
this.isLoading = false;

58
apps/client/src/app/components/admin-jobs/admin-jobs.html

@ -16,9 +16,21 @@
</mat-select>
</mat-form-field>
</form>
<table class="gf-table w-100" mat-table [dataSource]="dataSource">
<table
class="gf-table w-100"
mat-table
matSort
matSortActive="created"
matSortDirection="desc"
[dataSource]="dataSource"
>
<ng-container matColumnDef="index">
<th *matHeaderCellDef class="px-1 py-2 text-right" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2 text-right"
mat-header-cell
mat-sort-header="id"
>
<ng-container i18n>Job ID</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2 text-right" mat-cell>
@ -27,7 +39,12 @@
</ng-container>
<ng-container matColumnDef="type">
<th *matHeaderCellDef class="px-1 py-2" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2"
mat-header-cell
mat-sort-header="name"
>
<ng-container i18n>Type</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2" mat-cell>
@ -42,7 +59,12 @@
</ng-container>
<ng-container matColumnDef="symbol">
<th *matHeaderCellDef class="px-1 py-2" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2"
mat-header-cell
mat-sort-header="data.symbol"
>
<ng-container i18n>Symbol</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2" mat-cell>
@ -51,7 +73,12 @@
</ng-container>
<ng-container matColumnDef="dataSource">
<th *matHeaderCellDef class="px-1 py-2" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2"
mat-header-cell
mat-sort-header="data.dataSource"
>
<ng-container i18n>Data Source</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2" mat-cell>
@ -60,7 +87,12 @@
</ng-container>
<ng-container matColumnDef="priority">
<th *matHeaderCellDef class="px-1 py-2" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2"
mat-header-cell
mat-sort-header="opts.priority"
>
<ng-container i18n>Priority</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2" mat-cell>
@ -79,7 +111,12 @@
</ng-container>
<ng-container matColumnDef="attempts">
<th *matHeaderCellDef class="px-1 py-2 text-right" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2 text-right"
mat-header-cell
mat-sort-header="attemptsMade"
>
<ng-container i18n>Attempts</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2 text-right" mat-cell>
@ -88,7 +125,12 @@
</ng-container>
<ng-container matColumnDef="created">
<th *matHeaderCellDef class="px-1 py-2" mat-header-cell>
<th
*matHeaderCellDef
class="px-1 py-2"
mat-header-cell
mat-sort-header="timestamp"
>
<ng-container i18n>Created</ng-container>
</th>
<td *matCellDef="let element" class="px-1 py-2" mat-cell>

4
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
@ -79,7 +79,7 @@ import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/in
CommonModule,
GfActivitiesFilterComponent,
GfPremiumIndicatorComponent,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
IonIcon,
MatButtonModule,

9
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts

@ -55,6 +55,7 @@ import { CreateAssetProfileDialogMode } from './interfaces/interfaces';
})
export class GfCreateAssetProfileDialogComponent implements OnInit, OnDestroy {
public createAssetProfileForm: FormGroup;
public ghostfolioPrefix = `${ghostfolioPrefix}_`;
public mode: CreateAssetProfileDialogMode;
private customCurrencies: string[];
@ -77,9 +78,7 @@ export class GfCreateAssetProfileDialogComponent implements OnInit, OnDestroy {
addCurrency: new FormControl(null, [
this.iso4217CurrencyCodeValidator()
]),
addSymbol: new FormControl(`${ghostfolioPrefix}_`, [
Validators.required
]),
addSymbol: new FormControl(null, [Validators.required]),
searchSymbol: new FormControl(null, [Validators.required])
},
{
@ -95,6 +94,8 @@ export class GfCreateAssetProfileDialogComponent implements OnInit, OnDestroy {
}
public onRadioChange(mode: CreateAssetProfileDialogMode) {
this.createAssetProfileForm.reset();
this.mode = mode;
}
@ -133,7 +134,7 @@ export class GfCreateAssetProfileDialogComponent implements OnInit, OnDestroy {
} else if (this.mode === 'manual') {
this.dialogRef.close({
dataSource: 'MANUAL',
symbol: this.createAssetProfileForm.get('addSymbol').value
symbol: `${this.ghostfolioPrefix}${this.createAssetProfileForm.get('addSymbol').value}`
});
}
}

9
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html

@ -38,6 +38,7 @@
<mat-form-field appearance="outline" class="w-100">
<mat-label i18n>Symbol</mat-label>
<input formControlName="addSymbol" matInput />
<span matTextPrefix>{{ ghostfolioPrefix }}</span>
</mat-form-field>
</div>
} @else if (mode === 'currency') {
@ -53,7 +54,13 @@
}
</div>
<div class="d-flex justify-content-end" mat-dialog-actions>
<button i18n mat-button type="button" (click)="onCancel()">Cancel</button>
<button mat-button type="button" (click)="onCancel()">
@if (createAssetProfileForm.dirty) {
<ng-container i18n>Cancel</ng-container>
} @else {
<ng-container i18n>Close</ng-container>
}
</button>
<button
color="primary"
mat-flat-button

2
apps/client/src/app/components/home-market/home-market.component.ts

@ -35,7 +35,7 @@ import { takeUntil } from 'rxjs/operators';
styleUrls: ['./home-market.scss'],
templateUrl: './home-market.html'
})
export class HomeMarketComponent implements OnDestroy, OnInit {
export class GfHomeMarketComponent implements OnDestroy, OnInit {
public benchmarks: Benchmark[];
public deviceType: string;
public fearAndGreedIndex: number;

4
apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.component.ts

@ -36,13 +36,13 @@ import { Subject } from 'rxjs';
styleUrls: ['./create-watchlist-item-dialog.component.scss'],
templateUrl: 'create-watchlist-item-dialog.html'
})
export class CreateWatchlistItemDialogComponent implements OnInit, OnDestroy {
export class GfCreateWatchlistItemDialogComponent implements OnInit, OnDestroy {
public createWatchlistItemForm: FormGroup;
private unsubscribeSubject = new Subject<void>();
public constructor(
public readonly dialogRef: MatDialogRef<CreateWatchlistItemDialogComponent>,
public readonly dialogRef: MatDialogRef<GfCreateWatchlistItemDialogComponent>,
public readonly formBuilder: FormBuilder
) {}

8
apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html

@ -12,7 +12,13 @@
</mat-form-field>
</div>
<div class="d-flex justify-content-end" mat-dialog-actions>
<button i18n mat-button type="button" (click)="onCancel()">Cancel</button>
<button mat-button type="button" (click)="onCancel()">
@if (createWatchlistItemForm.dirty) {
<ng-container i18n>Cancel</ng-container>
} @else {
<ng-container i18n>Close</ng-container>
}
</button>
<button
color="primary"
mat-flat-button

23
apps/client/src/app/components/home-watchlist/home-watchlist.component.ts

@ -28,7 +28,7 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { CreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component';
import { GfCreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component';
import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/interfaces/interfaces';
@Component({
@ -45,7 +45,7 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/
styleUrls: ['./home-watchlist.scss'],
templateUrl: './home-watchlist.html'
})
export class HomeWatchlistComponent implements OnDestroy, OnInit {
export class GfHomeWatchlistComponent implements OnDestroy, OnInit {
public deviceType: string;
public hasImpersonationId: boolean;
public hasPermissionToCreateWatchlistItem: boolean;
@ -149,14 +149,17 @@ export class HomeWatchlistComponent implements OnDestroy, OnInit {
.subscribe((user) => {
this.user = user;
const dialogRef = this.dialog.open(CreateWatchlistItemDialogComponent, {
autoFocus: false,
data: {
deviceType: this.deviceType,
locale: this.user?.settings?.locale
} as CreateWatchlistItemDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
const dialogRef = this.dialog.open(
GfCreateWatchlistItemDialogComponent,
{
autoFocus: false,
data: {
deviceType: this.deviceType,
locale: this.user?.settings?.locale
} as CreateWatchlistItemDialogParams,
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
dialogRef
.afterClosed()

1
apps/client/src/app/components/rule/rule-settings-dialog/interfaces/interfaces.ts

@ -5,6 +5,7 @@ import {
export interface IRuleSettingsDialogParams {
categoryName: string;
locale: string;
rule: PortfolioReportRule;
settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment'];
}

2
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts

@ -1,4 +1,5 @@
import { XRayRulesSettings } from '@ghostfolio/common/interfaces';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { Component, Inject } from '@angular/core';
@ -17,6 +18,7 @@ import { IRuleSettingsDialogParams } from './interfaces/interfaces';
imports: [
CommonModule,
FormsModule,
GfValueComponent,
MatButtonModule,
MatDialogModule,
MatSliderModule

133
apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html

@ -5,28 +5,30 @@
data.rule.configuration.thresholdMin && data.rule.configuration.thresholdMax
) {
<div class="w-100">
<h6 class="mb-0">
<h6 class="d-flex mb-0">
<ng-container i18n>Threshold range</ng-container>:
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMin | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMin }}
}
-
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMax | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMax }}
}
<gf-value
class="ml-1"
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMin"
/>
<span class="mx-1">-</span>
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMax"
/>
</h6>
<div class="align-items-center d-flex w-100">
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.min | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.min }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.min"
/>
<mat-slider
class="flex-grow-1"
[max]="data.rule.configuration.threshold.max"
@ -36,13 +38,12 @@
<input matSliderStartThumb [(ngModel)]="data.settings.thresholdMin" />
<input matSliderEndThumb [(ngModel)]="data.settings.thresholdMax" />
</mat-slider>
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.max | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.max }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.max"
/>
</div>
</div>
} @else {
@ -50,22 +51,23 @@
class="w-100"
[ngClass]="{ 'd-none': !data.rule.configuration.thresholdMin }"
>
<h6 class="mb-0">
<h6 class="d-flex mb-0">
<ng-container i18n>Threshold Min</ng-container>:
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMin | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMin }}
}
<gf-value
class="ml-1"
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMin"
/>
</h6>
<div class="align-items-center d-flex w-100">
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.min | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.min }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.min"
/>
<mat-slider
class="flex-grow-1"
name="thresholdMin"
@ -75,35 +77,35 @@
>
<input matSliderThumb [(ngModel)]="data.settings.thresholdMin" />
</mat-slider>
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.max | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.max }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.max"
/>
</div>
</div>
<div
class="w-100"
[ngClass]="{ 'd-none': !data.rule.configuration.thresholdMax }"
>
<h6 class="mb-0">
<h6 class="d-flex mb-0">
<ng-container i18n>Threshold Max</ng-container>:
@if (data.rule.configuration.threshold.unit === '%') {
{{ data.settings.thresholdMax | percent: '1.2-2' }}
} @else {
{{ data.settings.thresholdMax }}
}
<gf-value
class="ml-1"
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.settings.thresholdMax"
/>
</h6>
<div class="align-items-center d-flex w-100">
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.min | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.min }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.min"
/>
<mat-slider
class="flex-grow-1"
name="thresholdMax"
@ -113,13 +115,12 @@
>
<input matSliderThumb [(ngModel)]="data.settings.thresholdMax" />
</mat-slider>
@if (data.rule.configuration.threshold.unit === '%') {
<label>{{
data.rule.configuration.threshold.max | percent: '1.2-2'
}}</label>
} @else {
<label>{{ data.rule.configuration.threshold.max }}</label>
}
<gf-value
[isPercent]="data.rule.configuration.threshold.unit === '%'"
[locale]="data.locale"
[precision]="2"
[value]="data.rule.configuration.threshold.max"
/>
</div>
</div>
}

4
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

@ -47,7 +47,7 @@ import { CreateOrUpdateAccessDialogParams } from './interfaces/interfaces';
styleUrls: ['./create-or-update-access-dialog.scss'],
templateUrl: 'create-or-update-access-dialog.html'
})
export class GfCreateOrUpdateAccessDialog implements OnDestroy {
export class GfCreateOrUpdateAccessDialogComponent implements OnDestroy {
public accessForm: FormGroup;
private unsubscribeSubject = new Subject<void>();
@ -55,7 +55,7 @@ export class GfCreateOrUpdateAccessDialog implements OnDestroy {
public constructor(
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) private data: CreateOrUpdateAccessDialogParams,
public dialogRef: MatDialogRef<GfCreateOrUpdateAccessDialog>,
public dialogRef: MatDialogRef<GfCreateOrUpdateAccessDialogComponent>,
private dataService: DataService,
private formBuilder: FormBuilder,
private notificationService: NotificationService

4
apps/client/src/app/components/user-account-access/user-account-access.component.ts

@ -30,7 +30,7 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
import { GfCreateOrUpdateAccessDialog } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
import { GfCreateOrUpdateAccessDialogComponent } from './create-or-update-access-dialog/create-or-update-access-dialog.component';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@ -179,7 +179,7 @@ export class GfUserAccountAccessComponent implements OnDestroy, OnInit {
}
private openCreateAccessDialog() {
const dialogRef = this.dialog.open(GfCreateOrUpdateAccessDialog, {
const dialogRef = this.dialog.open(GfCreateOrUpdateAccessDialogComponent, {
data: {
access: {
alias: '',

5
apps/client/src/app/directives/file-drop/file-drop.directive.ts

@ -1,10 +1,9 @@
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
@Directive({
selector: '[gfFileDrop]',
standalone: false
selector: '[gfFileDrop]'
})
export class FileDropDirective {
export class GfFileDropDirective {
@Output() filesDropped = new EventEmitter<FileList>();
@HostListener('dragenter', ['$event']) onDragEnter(event: DragEvent) {

9
apps/client/src/app/directives/file-drop/file-drop.module.ts

@ -1,9 +0,0 @@
import { NgModule } from '@angular/core';
import { FileDropDirective } from './file-drop.directive';
@NgModule({
declarations: [FileDropDirective],
exports: [FileDropDirective]
})
export class GfFileDropModule {}

17
apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.component.ts

@ -0,0 +1,17 @@
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
@Component({
host: { class: 'page' },
imports: [MatButtonModule, RouterModule],
selector: 'gf-hacktoberfest-2025-page',
templateUrl: './hacktoberfest-2025-page.html'
})
export class Hacktoberfest2025PageComponent {
public routerLinkAbout = publicRoutes.about.routerLink;
public routerLinkBlog = publicRoutes.blog.routerLink;
public routerLinkOpenStartup = publicRoutes.openStartup.routerLink;
}

201
apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html

@ -0,0 +1,201 @@
<div class="blog container">
<div class="row">
<div class="col-md-8 offset-md-2">
<article>
<div class="mb-4 text-center">
<h1 class="mb-1">Hacktoberfest 2025</h1>
<div class="mb-3 text-muted"><small>2025-09-27</small></div>
<img
alt="Hacktoberfest 2025 with Ghostfolio Teaser"
class="rounded w-100"
src="../assets/images/blog/hacktoberfest-2025.png"
title="Hacktoberfest 2025 with Ghostfolio"
/>
</div>
<section class="mb-4">
<p>
Ghostfolio is joining
<a href="https://hacktoberfest.com">Hacktoberfest</a> for the fourth
time and <a [routerLink]="routerLinkAbout">we</a> are looking
forward to meeting new open-source contributors along the way. Every
year in October, Hacktoberfest celebrates open source by
highlighting projects, maintainers, and contributors from around the
globe. Open source maintainers dedicate extra time to support new
contributors while guiding them through their first pull requests on
<a href="https://github.com/ghostfolio/ghostfolio">GitHub</a>.
</p>
</section>
<section class="mb-4">
<h2 class="h4">
Meet Ghostfolio: a modern Dashboard for Personal Finance
</h2>
<p>
<a href="https://ghostfol.io">Ghostfolio</a> is a web application
that makes it easy to manage your personal finances. It aggregates
your assets and helps you make informed decisions to balance your
portfolio or plan future investments.
</p>
<p>
The software is fully written in
<a href="https://www.typescriptlang.org">TypeScript</a> and
organized as an <a href="https://nx.dev">Nx</a> workspace, utilizing
the latest framework releases. The backend is based on
<a href="https://nestjs.com">NestJS</a> in combination with
<a href="https://www.postgresql.org">PostgreSQL</a> as a database
together with <a href="https://www.prisma.io">Prisma</a> and
<a href="https://redis.io">Redis</a> for caching. The frontend is
developed with <a href="https://angular.dev">Angular</a>.
</p>
<p>
With over 200 contributors, the OSS project is used daily by a
growing global community. Ghostfolio counts more than
<a [routerLink]="routerLinkOpenStartup">6’500 stars on GitHub</a>
and
<a [routerLink]="routerLinkOpenStartup"
>1’600’000+ pulls on Docker Hub</a
>, standing out for its simple and user-friendly experience.
</p>
</section>
<section class="mb-4">
<h2 class="h4">How you can make an impact</h2>
<p>
Every contribution makes a difference. Whether it is implementing
new features, resolving bugs, refactoring code, enhancing
documentation, adding unit tests, or translating content into
another language, you can actively shape our project.
</p>
<p>
New to our codebase? No worries! We have labeled a few
<a
href="https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3Ahacktoberfest"
>issues</a
>
with <code>hacktoberfest</code> that are ideal for newcomers.
</p>
<p>
The official Hacktoberfest website provides some valuable
<a
href="https://hacktoberfest.com/participation/#beginner-resources"
>resources for beginners</a
>
to start contributing in open source.
</p>
</section>
<section class="mb-4">
<h2 class="h4">Connect with us</h2>
<p>
If you have further questions or ideas, please join our
<a
href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"
>Slack</a
>
community or get in touch on X
<a href="https://x.com/ghostfolio_">&#64;ghostfolio_</a>.
</p>
<p>
We look forward to collaborating.<br />
Thomas from Ghostfolio
</p>
</section>
<section class="mb-4">
<ul class="list-inline">
<li class="list-inline-item">
<span class="badge badge-light">Angular</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Community</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Dashboard</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Docker</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Fintech</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Ghostfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">GitHub</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Hacktoberfest</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Hacktoberfest 2025</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Investment</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">NestJS</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Nx</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">October</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Open Source</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">OSS</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Personal Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Portfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Portfolio Tracker</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Prisma</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Redis</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Software</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">TypeScript</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">UX</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Wealth</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Wealth Management</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Web Application</span>
</li>
</ul>
</section>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="routerLinkBlog">Blog</a>
</li>
<li
aria-current="page"
class="active breadcrumb-item text-truncate"
>
Hacktoberfest 2025
</li>
</ol>
</nav>
</article>
</div>
</div>
</div>

9
apps/client/src/app/pages/blog/blog-page-routing.module.ts

@ -201,6 +201,15 @@ const routes: Routes = [
(c) => c.BlackWeeks2024PageComponent
),
title: 'Black Weeks 2024'
},
{
canActivate: [AuthGuard],
path: '2025/09/hacktoberfest-2025',
loadComponent: () =>
import(
'./2025/09/hacktoberfest-2025/hacktoberfest-2025-page.component'
).then((c) => c.Hacktoberfest2025PageComponent),
title: 'Hacktoberfest 2025'
}
];

24
apps/client/src/app/pages/blog/blog-page.html

@ -8,6 +8,30 @@
finance</small
>
</h1>
<mat-card appearance="outlined" class="mb-3">
<mat-card-content class="p-0">
<div class="container p-0">
<div class="flex-nowrap no-gutters row">
<a
class="d-flex overflow-hidden p-3 w-100"
href="../en/blog/2025/09/hacktoberfest-2025"
>
<div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate">Hacktoberfest 2025</div>
<div class="d-flex text-muted">2025-09-27</div>
</div>
<div class="align-items-center d-flex">
<ion-icon
class="chevron text-muted"
name="chevron-forward-outline"
size="small"
/>
</div>
</a>
</div>
</div>
</mat-card-content>
</mat-card>
@if (hasPermissionForSubscription) {
<mat-card appearance="outlined" class="mb-3">
<mat-card-content class="p-0">

8
apps/client/src/app/pages/home/home-page.routes.ts

@ -1,8 +1,8 @@
import { GfHomeHoldingsComponent } from '@ghostfolio/client/components/home-holdings/home-holdings.component';
import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component';
import { GfHomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component';
import { GfHomeOverviewComponent } from '@ghostfolio/client/components/home-overview/home-overview.component';
import { GfHomeSummaryComponent } from '@ghostfolio/client/components/home-summary/home-summary.component';
import { HomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component';
import { GfHomeWatchlistComponent } from '@ghostfolio/client/components/home-watchlist/home-watchlist.component';
import { MarketsComponent } from '@ghostfolio/client/components/markets/markets.component';
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
@ -31,7 +31,7 @@ export const routes: Routes = [
},
{
path: internalRoutes.home.subRoutes.markets.path,
component: HomeMarketComponent,
component: GfHomeMarketComponent,
title: internalRoutes.home.subRoutes.markets.title
},
{
@ -41,7 +41,7 @@ export const routes: Routes = [
},
{
path: internalRoutes.home.subRoutes.watchlist.path,
component: HomeWatchlistComponent,
component: GfHomeWatchlistComponent,
title: internalRoutes.home.subRoutes.watchlist.title
}
],

4
apps/client/src/app/pages/markets/markets-page.component.ts

@ -1,4 +1,4 @@
import { HomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component';
import { GfHomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component';
import { CommonModule } from '@angular/common';
import { Component, OnDestroy } from '@angular/core';
@ -6,7 +6,7 @@ import { Subject } from 'rxjs';
@Component({
host: { class: 'page' },
imports: [CommonModule, HomeMarketComponent],
imports: [CommonModule, GfHomeMarketComponent],
selector: 'gf-markets-page',
styleUrls: ['./markets-page.scss'],
templateUrl: './markets-page.html'

22
apps/client/src/app/pages/open/open-page-routing.module.ts

@ -1,22 +0,0 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { OpenPageComponent } from './open-page.component';
const routes: Routes = [
{
canActivate: [AuthGuard],
component: OpenPageComponent,
path: '',
title: publicRoutes.openStartup.title
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule]
})
export class OpenPageRoutingModule {}

20
apps/client/src/app/pages/open/open-page.component.ts

@ -1,18 +1,28 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { Statistics, User } from '@ghostfolio/common/interfaces';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import {
ChangeDetectorRef,
Component,
CUSTOM_ELEMENTS_SCHEMA,
OnDestroy,
OnInit
} from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { Subject, takeUntil } from 'rxjs';
@Component({
host: { class: 'page' },
imports: [CommonModule, GfValueComponent, MatCardModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-open-page',
styleUrls: ['./open-page.scss'],
templateUrl: './open-page.html',
standalone: false
templateUrl: './open-page.html'
})
export class OpenPageComponent implements OnDestroy, OnInit {
export class GfOpenPageComponent implements OnDestroy, OnInit {
public statistics: Statistics;
public user: User;

20
apps/client/src/app/pages/open/open-page.module.ts

@ -1,20 +0,0 @@
import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { OpenPageRoutingModule } from './open-page-routing.module';
import { OpenPageComponent } from './open-page.component';
@NgModule({
declarations: [OpenPageComponent],
imports: [
CommonModule,
GfValueComponent,
MatCardModule,
OpenPageRoutingModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class OpenPageModule {}

15
apps/client/src/app/pages/open/open-page.routes.ts

@ -0,0 +1,15 @@
import { AuthGuard } from '@ghostfolio/client/core/auth.guard';
import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { Routes } from '@angular/router';
import { GfOpenPageComponent } from './open-page.component';
export const routes: Routes = [
{
canActivate: [AuthGuard],
component: GfOpenPageComponent,
path: '',
title: publicRoutes.openStartup.title
}
];

72
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -27,8 +27,8 @@ import { DeviceDetectorService } from 'ngx-device-detector';
import { Subject, Subscription } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { GfCreateOrUpdateActivityDialog } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
import { GfImportActivitiesDialog } from './import-activities-dialog/import-activities-dialog.component';
import { GfCreateOrUpdateActivityDialogComponent } from './create-or-update-activity-dialog/create-or-update-activity-dialog.component';
import { GfImportActivitiesDialogComponent } from './import-activities-dialog/import-activities-dialog.component';
import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces';
@Component({
@ -245,7 +245,7 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
}
public onImport() {
const dialogRef = this.dialog.open(GfImportActivitiesDialog, {
const dialogRef = this.dialog.open(GfImportActivitiesDialogComponent, {
data: {
deviceType: this.deviceType,
user: this.user
@ -268,7 +268,7 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
}
public onImportDividends() {
const dialogRef = this.dialog.open(GfImportActivitiesDialog, {
const dialogRef = this.dialog.open(GfImportActivitiesDialogComponent, {
data: {
activityTypes: ['DIVIDEND'],
deviceType: this.deviceType,
@ -305,24 +305,27 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
});
}
public openUpdateActivityDialog(activity: Activity) {
const dialogRef = this.dialog.open(GfCreateOrUpdateActivityDialog, {
data: {
activity,
accounts: this.user?.accounts,
user: this.user
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
});
public openUpdateActivityDialog(aActivity: Activity) {
const dialogRef = this.dialog.open(
GfCreateOrUpdateActivityDialogComponent,
{
data: {
activity: aActivity,
accounts: this.user?.accounts,
user: this.user
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
}
);
dialogRef
.afterClosed()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe((transaction: UpdateOrderDto | null) => {
if (transaction) {
.subscribe((activity: UpdateOrderDto) => {
if (activity) {
this.dataService
.putOrder(transaction)
.putOrder(activity)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe({
next: () => {
@ -347,23 +350,26 @@ export class GfActivitiesPageComponent implements OnDestroy, OnInit {
.subscribe((user) => {
this.updateUser(user);
const dialogRef = this.dialog.open(GfCreateOrUpdateActivityDialog, {
data: {
accounts: this.user?.accounts,
activity: {
...aActivity,
accountId: aActivity?.accountId,
date: new Date(),
id: null,
fee: 0,
type: aActivity?.type ?? 'BUY',
unitPrice: null
const dialogRef = this.dialog.open(
GfCreateOrUpdateActivityDialogComponent,
{
data: {
accounts: this.user?.accounts,
activity: {
...aActivity,
accountId: aActivity?.accountId,
date: new Date(),
id: null,
fee: 0,
type: aActivity?.type ?? 'BUY',
unitPrice: null
},
user: this.user
},
user: this.user
},
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
.afterClosed()

4
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts

@ -76,7 +76,7 @@ import { ActivityType } from './types/activity-type.type';
styleUrls: ['./create-or-update-activity-dialog.scss'],
templateUrl: 'create-or-update-activity-dialog.html'
})
export class GfCreateOrUpdateActivityDialog implements OnDestroy {
export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy {
public activityForm: FormGroup;
public assetClassOptions: AssetClassSelectorOption[] = Object.keys(AssetClass)
@ -110,7 +110,7 @@ export class GfCreateOrUpdateActivityDialog implements OnDestroy {
@Inject(MAT_DIALOG_DATA) public data: CreateOrUpdateActivityDialogParams,
private dataService: DataService,
private dateAdapter: DateAdapter<any>,
public dialogRef: MatDialogRef<GfCreateOrUpdateActivityDialog>,
public dialogRef: MatDialogRef<GfCreateOrUpdateActivityDialogComponent>,
private formBuilder: FormBuilder,
@Inject(MAT_DATE_LOCALE) private locale: string,
private userService: UserService

14
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -4,8 +4,8 @@ import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { GfFileDropModule } from '@ghostfolio/client/directives/file-drop/file-drop.module';
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service';
import { PortfolioPosition } from '@ghostfolio/common/interfaces';
@ -15,6 +15,7 @@ import {
StepperOrientation,
StepperSelectionEvent
} from '@angular/cdk/stepper';
import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
@ -59,11 +60,12 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'd-flex flex-column h-100' },
imports: [
CommonModule,
GfActivitiesTableComponent,
GfDialogFooterComponent,
GfDialogHeaderComponent,
GfFileDropModule,
GfSymbolModule,
GfFileDropDirective,
GfSymbolPipe,
IonIcon,
MatButtonModule,
MatDialogModule,
@ -78,7 +80,7 @@ import { ImportActivitiesDialogParams } from './interfaces/interfaces';
styleUrls: ['./import-activities-dialog.scss'],
templateUrl: 'import-activities-dialog.html'
})
export class GfImportActivitiesDialog implements OnDestroy {
export class GfImportActivitiesDialogComponent implements OnDestroy {
public accounts: CreateAccountWithBalancesDto[] = [];
public activities: Activity[] = [];
public assetProfileForm: FormGroup;
@ -109,7 +111,7 @@ export class GfImportActivitiesDialog implements OnDestroy {
private dataService: DataService,
private deviceService: DeviceDetectorService,
private formBuilder: FormBuilder,
public dialogRef: MatDialogRef<GfImportActivitiesDialog>,
public dialogRef: MatDialogRef<GfImportActivitiesDialogComponent>,
private importActivitiesService: ImportActivitiesService,
private snackBar: MatSnackBar
) {

26
apps/client/src/app/pages/portfolio/fire/fire-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces';
import { FireWealth, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
@ -29,7 +29,7 @@ import { takeUntil } from 'rxjs/operators';
})
export class GfFirePageComponent implements OnDestroy, OnInit {
public deviceType: string;
public fireWealth: Big;
public fireWealth: FireWealth;
public hasImpersonationId: boolean;
public hasPermissionToUpdateUserSettings: boolean;
public isLoading = false;
@ -55,15 +55,25 @@ export class GfFirePageComponent implements OnDestroy, OnInit {
.fetchPortfolioDetails()
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(({ summary }) => {
this.fireWealth = summary.fireWealth
? new Big(summary.fireWealth)
: new Big(0);
this.fireWealth = {
today: {
valueInBaseCurrency: summary.fireWealth
? summary.fireWealth.today.valueInBaseCurrency
: 0
}
};
if (this.user.subscription?.type === 'Basic') {
this.fireWealth = new Big(10000);
this.fireWealth = {
today: {
valueInBaseCurrency: 10000
}
};
}
this.withdrawalRatePerYear = this.fireWealth.mul(4).div(100);
this.withdrawalRatePerYear = Big(
this.fireWealth.today.valueInBaseCurrency
).mul(this.user.settings.safeWithdrawalRate);
this.withdrawalRatePerMonth = this.withdrawalRatePerYear.div(12);
this.isLoading = false;

43
apps/client/src/app/pages/portfolio/fire/fire-page.html

@ -14,7 +14,7 @@
[colorScheme]="user?.settings?.colorScheme"
[currency]="user?.settings?.baseCurrency"
[deviceType]="deviceType"
[fireWealth]="fireWealth?.toNumber()"
[fireWealth]="fireWealth?.today.valueInBaseCurrency"
[hasPermissionToUpdateUserSettings]="
!hasImpersonationId && hasPermissionToUpdateUserSettings
"
@ -37,7 +37,7 @@
</div>
<div>
<h4 class="align-items-center d-flex">
<span i18n>4% Rule</span>
<span i18n>Sustainable retirement income</span>
@if (user?.subscription?.type === 'Basic') {
<gf-premium-indicator class="ml-1" />
}
@ -61,11 +61,11 @@
/>
</div>
} @else {
<div
i18n
[ngClass]="{ 'text-muted': user?.subscription?.type === 'Basic' }"
>
If you retire today, you would be able to withdraw
<div [ngClass]="{ 'text-muted': user?.subscription?.type === 'Basic' }">
<ng-container i18n
>If you retire today, you would be able to withdraw</ng-container
>
<ng-container>&nbsp;</ng-container>
<span class="font-weight-bold"
><gf-value
class="d-inline-block"
@ -74,9 +74,12 @@
[unit]="user?.settings?.baseCurrency"
[value]="withdrawalRatePerYear?.toNumber()"
/>
per year</span
<ng-container>&nbsp;</ng-container>
<ng-container i18n>per year</ng-container></span
>
or
<ng-container>&nbsp;</ng-container>
<ng-container i18n>or</ng-container>
<ng-container>&nbsp;</ng-container>
<span class="font-weight-bold"
><gf-value
class="d-inline-block"
@ -85,18 +88,32 @@
[unit]="user?.settings?.baseCurrency"
[value]="withdrawalRatePerMonth?.toNumber()"
/>
per month</span
>, based on your total assets of
<ng-container>&nbsp;</ng-container>
<ng-container i18n>per month</ng-container></span
><ng-container i18n>,</ng-container>
<ng-container>&nbsp;</ng-container>
<ng-container i18n>based on your total assets of</ng-container>
<ng-container>&nbsp;</ng-container>
<span class="font-weight-bold"
><gf-value
class="d-inline-block"
[isCurrency]="true"
[locale]="user?.settings?.locale"
[unit]="user?.settings?.baseCurrency"
[value]="fireWealth?.toNumber()"
[value]="fireWealth?.today.valueInBaseCurrency"
/>
</span>
and a withdrawal rate of 4%.
<ng-container>&nbsp;</ng-container>
<ng-container i18n>and a safe withdrawal rate (SWR) of</ng-container>
<ng-container>&nbsp;</ng-container>
<span class="font-weight-bold"
><gf-value
class="d-inline-block"
[isPercent]="true"
[locale]="user?.settings?.locale"
[precision]="1"
[value]="user?.settings?.safeWithdrawalRate" /></span
>.
</div>
}
</div>

9
apps/client/src/app/pipes/symbol/symbol.module.ts

@ -1,9 +0,0 @@
import { NgModule } from '@angular/core';
import { SymbolPipe } from './symbol.pipe';
@NgModule({
declarations: [SymbolPipe],
exports: [SymbolPipe]
})
export class GfSymbolModule {}

5
apps/client/src/app/pipes/symbol/symbol.pipe.ts

@ -3,10 +3,9 @@ import { prettifySymbol } from '@ghostfolio/common/helper';
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'gfSymbol',
standalone: false
name: 'gfSymbol'
})
export class SymbolPipe implements PipeTransform {
export class GfSymbolPipe implements PipeTransform {
public transform(aSymbol: string) {
return prettifySymbol(aSymbol);
}

84
apps/client/src/app/services/data.service.ts

@ -512,48 +512,6 @@ export class DataService {
);
}
public fetchSymbolItem({
dataSource,
includeHistoricalData,
symbol
}: {
dataSource: DataSource | string;
includeHistoricalData?: number;
symbol: string;
}) {
let params = new HttpParams();
if (includeHistoricalData) {
params = params.append('includeHistoricalData', includeHistoricalData);
}
return this.http.get<SymbolItem>(`/api/v1/symbol/${dataSource}/${symbol}`, {
params
});
}
public fetchSymbols({
includeIndices = false,
query
}: {
includeIndices?: boolean;
query: string;
}) {
let params = new HttpParams().set('query', query);
if (includeIndices) {
params = params.append('includeIndices', includeIndices);
}
return this.http
.get<LookupResponse>('/api/v1/symbol/lookup', { params })
.pipe(
map(({ items }) => {
return items;
})
);
}
public fetchPortfolioDetails({
filters,
withMarkets = false
@ -725,6 +683,48 @@ export class DataService {
);
}
public fetchSymbolItem({
dataSource,
includeHistoricalData,
symbol
}: {
dataSource: DataSource | string;
includeHistoricalData?: number;
symbol: string;
}) {
let params = new HttpParams();
if (includeHistoricalData) {
params = params.append('includeHistoricalData', includeHistoricalData);
}
return this.http.get<SymbolItem>(`/api/v1/symbol/${dataSource}/${symbol}`, {
params
});
}
public fetchSymbols({
includeIndices = false,
query
}: {
includeIndices?: boolean;
query: string;
}) {
let params = new HttpParams().set('query', query);
if (includeIndices) {
params = params.append('includeIndices', includeIndices);
}
return this.http
.get<LookupResponse>('/api/v1/symbol/lookup', { params })
.pipe(
map(({ items }) => {
return items;
})
);
}
public fetchTags() {
return this.http.get<Tag[]>('/api/v1/tags');
}

BIN
apps/client/src/assets/images/blog/hacktoberfest-2025.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

122
apps/client/src/locales/messages.ca.xlf

@ -647,7 +647,7 @@
<target state="translated">Tipus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -667,7 +667,7 @@
<target state="translated">Perfil d’Actiu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="8530249987193962636" datatype="html">
@ -675,7 +675,7 @@
<target state="translated">Dades Històriques de Mercat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -687,7 +687,7 @@
<target state="translated">Origen de les Dades</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -711,7 +711,7 @@
<target state="translated">Prioritat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="4467730511941715714" datatype="html">
@ -719,7 +719,7 @@
<target state="translated">Intents</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -727,7 +727,7 @@
<target state="translated">Creat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -735,7 +735,7 @@
<target state="translated">Finalitzat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -743,7 +743,7 @@
<target state="translated">Estat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -763,7 +763,7 @@
<target state="translated">Aturar Processos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -771,7 +771,7 @@
<target state="translated">Veure les Dades</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -779,7 +779,7 @@
<target state="translated">Veure Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8871342657187208008" datatype="html">
@ -787,7 +787,7 @@
<target state="translated">Executar Procés</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -795,7 +795,7 @@
<target state="translated">Suprimir Procés</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -1965,6 +1965,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -2405,6 +2409,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -3065,6 +3073,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -3755,6 +3767,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6099700884541852399" datatype="html">
<source>New Users</source>
<target state="translated">Usuaris nous</target>
@ -3776,7 +3796,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -4463,22 +4483,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">4% Regla</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="new">If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="5080775557941296581" datatype="html">
<source>Pricing</source>
<target state="translated">Preus</target>
@ -4711,6 +4715,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio us permet fer un seguiment de la vostra riquesa.</target>
@ -4868,6 +4880,14 @@
<context context-type="linenumber">44</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Taula comparativa Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/></target>
@ -5328,6 +5348,14 @@
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Darrer tot el temps</target>
@ -5697,7 +5725,7 @@
<target state="translated">Símbol</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -5781,7 +5809,7 @@
<target state="translated">Valuós</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5789,7 +5817,7 @@
<target state="translated">Passiu</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="4881880242577556" datatype="html">
@ -5801,7 +5829,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="787798817533231355" datatype="html">
@ -5948,6 +5976,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Oceania</target>
@ -6380,6 +6416,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="new">Inactive</target>
@ -6429,7 +6473,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6473,7 +6517,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6509,7 +6553,7 @@
<target state="new">Portfolio Snapshot</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6979,7 +7023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.de.xlf

@ -42,7 +42,7 @@
<target state="translated">Typ</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -286,7 +286,7 @@
<target state="translated">Jobs löschen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -294,7 +294,7 @@
<target state="translated">Datenquelle</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -318,7 +318,7 @@
<target state="translated">Versuche</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -326,7 +326,7 @@
<target state="translated">Erstellt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -334,7 +334,7 @@
<target state="translated">Abgeschlossen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -342,7 +342,7 @@
<target state="translated">Status</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -370,7 +370,7 @@
<target state="translated">Historische Marktdaten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -382,7 +382,7 @@
<target state="translated">Daten anzeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -390,7 +390,7 @@
<target state="translated">Stacktrace anzeigen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -398,7 +398,7 @@
<target state="translated">Job löschen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -800,6 +800,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1152,6 +1156,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -1492,6 +1500,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1761,14 +1773,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">4% Regel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Positionen</target>
@ -1830,7 +1834,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="2691619717359603230" datatype="html">
@ -2033,6 +2037,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="translated">Nachhaltiges Einkommen im Ruhestand</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio verschafft dir den Überblick über dein Vermögen.</target>
@ -2670,7 +2682,7 @@
<target state="translated">Symbol</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -2897,6 +2909,14 @@
<context context-type="linenumber">71</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="translated">Wenn du heute in den Ruhestand gehen würdest, könntest du</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Ozeanien</target>
@ -4038,7 +4058,7 @@
<target state="translated">Verbindlichkeit</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="577204259483334667" datatype="html">
@ -4282,7 +4302,7 @@
<target state="translated">Wertsache</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
@ -4470,7 +4490,7 @@
<target state="translated">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -5163,6 +5183,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="translated">und einer sicheren Entnahmerate (SWR) von</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Letzte 90 Tage)</target>
@ -5328,7 +5356,7 @@
<target state="translated">Anlageprofil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5363,6 +5391,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="translated"> entnehmen,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Letztes Allzeithoch</target>
@ -5379,6 +5415,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="translated">pro Monat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> Vergleichstabelle</target>
@ -5723,14 +5767,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Wenn du heute in den Ruhestand gehen würdest, könnest du <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> pro Jahr<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> oder <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> pro Monat<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> entnehmen, bezogen auf dein Gesamtanlagevermögen von <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> und einer Entnahmerate von 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Filter zurücksetzen</target>
@ -5889,7 +5925,7 @@
<target state="translated">Job ausführen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5897,7 +5933,7 @@
<target state="translated">Priorität</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6404,6 +6440,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="translated">bezogen auf dein Gesamtanlagevermögen von</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Inaktiv</target>
@ -6453,7 +6497,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6497,7 +6541,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6533,7 +6577,7 @@
<target state="translated">Portfolio Snapshot</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -7003,7 +7047,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.es.xlf

@ -43,7 +43,7 @@
<target state="translated">Tipo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -287,7 +287,7 @@
<target state="translated">Elimina los trabajos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -295,7 +295,7 @@
<target state="translated">Fuente de datos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -319,7 +319,7 @@
<target state="translated">Intentos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -327,7 +327,7 @@
<target state="translated">Creado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -335,7 +335,7 @@
<target state="translated">Finalizado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -343,7 +343,7 @@
<target state="translated">Estado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -371,7 +371,7 @@
<target state="translated">Datos históricos del mercado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -383,7 +383,7 @@
<target state="translated">Visualiza los datos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -391,7 +391,7 @@
<target state="translated">Visualiza Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -399,7 +399,7 @@
<target state="translated">Elimina el trabajo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -785,6 +785,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1137,6 +1141,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -1477,6 +1485,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1746,14 +1758,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">Regla del 4%</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Participaciones</target>
@ -1815,7 +1819,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="2691619717359603230" datatype="html">
@ -2018,6 +2022,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio te permite hacer un seguimiento de tu riqueza.</target>
@ -2655,7 +2667,7 @@
<target state="translated">Símbolo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -2882,6 +2894,14 @@
<context context-type="linenumber">71</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Oceanía</target>
@ -4015,7 +4035,7 @@
<target state="translated">Responsabilidad</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="577204259483334667" datatype="html">
@ -4259,7 +4279,7 @@
<target state="translated">Valioso</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
@ -4447,7 +4467,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -5140,6 +5160,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Últimos 90 días)</target>
@ -5305,7 +5333,7 @@
<target state="translated">Perfil de activo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5340,6 +5368,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Último máximo histórico</target>
@ -5356,6 +5392,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tabla comparativa</target>
@ -5700,14 +5744,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Si te jubilaras hoy, podrías retirar <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> por año<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> o <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> por mes<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, basado en tus activos totales de <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> y una tasa de retiro del 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Reiniciar filtros</target>
@ -5866,7 +5902,7 @@
<target state="translated">Ejecutar Tarea</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5874,7 +5910,7 @@
<target state="translated">Prioridad</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6381,6 +6417,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Inactiva</target>
@ -6430,7 +6474,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6474,7 +6518,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6510,7 +6554,7 @@
<target state="translated">Instantánea de la cartera</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6980,7 +7024,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.fr.xlf

@ -34,7 +34,7 @@
<target state="translated">Type</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -342,7 +342,7 @@
<target state="translated">Source Données</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -366,7 +366,7 @@
<target state="translated">Tentatives</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -374,7 +374,7 @@
<target state="translated">Créé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -382,7 +382,7 @@
<target state="translated">Terminé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -390,7 +390,7 @@
<target state="translated">Statut</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -410,7 +410,7 @@
<target state="translated">Supprimer Tâches</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3060494754215793943" datatype="html">
@ -426,7 +426,7 @@
<target state="translated">Données historiques du marché</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -438,7 +438,7 @@
<target state="translated">Voir Données</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -446,7 +446,7 @@
<target state="translated">Voir la Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -454,7 +454,7 @@
<target state="translated">Supprimer Tâche</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -1080,6 +1080,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1444,6 +1448,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -1780,6 +1788,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1990,7 +2002,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="2691619717359603230" datatype="html">
@ -2357,14 +2369,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">Règle des 4%</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="8057462855421378241" datatype="html">
<source>Holdings</source>
<target state="translated">Positions</target>
@ -2421,6 +2425,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio vous aide à garder un aperçu de votre patrimoine.</target>
@ -2850,7 +2862,7 @@
<target state="translated">Symbole</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -3021,6 +3033,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Océanie</target>
@ -4014,7 +4034,7 @@
<target state="translated">Dette</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="577204259483334667" datatype="html">
@ -4258,7 +4278,7 @@
<target state="translated">Actifs</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
@ -4446,7 +4466,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -5139,6 +5159,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Derniers 90 jours)</target>
@ -5304,7 +5332,7 @@
<target state="translated">Profil d’Actif</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5339,6 +5367,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Dernier All Time High</target>
@ -5355,6 +5391,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tableau comparatif</target>
@ -5699,14 +5743,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Si vous prenez votre retraite aujourd’hui, vous pourrez retirer <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> par an<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> ou <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> par mois<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, sur la base de vos actifs totaux de <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> et un taux de retrait de 4 %.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Réinitialiser les Filtres</target>
@ -5865,7 +5901,7 @@
<target state="translated">Execute la tâche</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5873,7 +5909,7 @@
<target state="translated">Priorité</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6380,6 +6416,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Inactif</target>
@ -6429,7 +6473,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6473,7 +6517,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6509,7 +6553,7 @@
<target state="translated">Résumé du portefeuille</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6979,7 +7023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.it.xlf

@ -43,7 +43,7 @@
<target state="translated">Tipo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -287,7 +287,7 @@
<target state="translated">Elimina i lavori</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -295,7 +295,7 @@
<target state="translated">Sorgente dei dati</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -319,7 +319,7 @@
<target state="translated">Tentativi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -327,7 +327,7 @@
<target state="translated">Creato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -335,7 +335,7 @@
<target state="translated">Finito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -343,7 +343,7 @@
<target state="translated">Stato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -371,7 +371,7 @@
<target state="translated">Dati storici del mercato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -383,7 +383,7 @@
<target state="translated">Visualizza i dati</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -391,7 +391,7 @@
<target state="translated">Visualizza Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -399,7 +399,7 @@
<target state="translated">Elimina il lavoro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -785,6 +785,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1137,6 +1141,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -1477,6 +1485,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1746,14 +1758,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">Regola del 4%</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Partecipazioni</target>
@ -1815,7 +1819,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="2691619717359603230" datatype="html">
@ -2018,6 +2022,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio ti permette di tenere traccia della tua ricchezza.</target>
@ -2655,7 +2667,7 @@
<target state="translated">Simbolo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -2882,6 +2894,14 @@
<context context-type="linenumber">71</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Oceania</target>
@ -4015,7 +4035,7 @@
<target state="translated">Passività</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="577204259483334667" datatype="html">
@ -4259,7 +4279,7 @@
<target state="translated">Prezioso</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
@ -4447,7 +4467,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -5140,6 +5160,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Ultimi 90 giorni)</target>
@ -5305,7 +5333,7 @@
<target state="translated">Profilo dell’asset</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5340,6 +5368,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Ultimo massimo storico</target>
@ -5356,6 +5392,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tabella di comparazione</target>
@ -5700,14 +5744,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Se andassi in pensione oggi, saresti in grado di prelevare <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> all’anno<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> o <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> al mese<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, calcolato sul valore totale dei tuoi asset di <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> e un prelievo costante del 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Reset Filtri</target>
@ -5866,7 +5902,7 @@
<target state="translated">Esegui il lavoro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5874,7 +5910,7 @@
<target state="translated">Priorità</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6381,6 +6417,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Inattivo</target>
@ -6430,7 +6474,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6474,7 +6518,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6510,7 +6554,7 @@
<target state="translated">Stato del Portfolio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6980,7 +7024,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.nl.xlf

@ -42,7 +42,7 @@
<target state="translated">Type</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -286,7 +286,7 @@
<target state="translated">Taken verwijderen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -294,7 +294,7 @@
<target state="translated">Gegevensbron</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -318,7 +318,7 @@
<target state="translated">Pogingen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -326,7 +326,7 @@
<target state="translated">Aangemaakt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -334,7 +334,7 @@
<target state="translated">Voltooid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -342,7 +342,7 @@
<target state="translated">Status</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -370,7 +370,7 @@
<target state="translated">Historische marktgegevens</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -382,7 +382,7 @@
<target state="translated">Bekijk gegevens</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -390,7 +390,7 @@
<target state="translated">Bekijk Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -398,7 +398,7 @@
<target state="translated">Taak verwijderen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -784,6 +784,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1136,6 +1140,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -1476,6 +1484,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1745,14 +1757,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">4% regel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Posities</target>
@ -1814,7 +1818,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="2691619717359603230" datatype="html">
@ -2017,6 +2021,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio stelt je in staat om je vermogen bij te houden.</target>
@ -2654,7 +2666,7 @@
<target state="translated">Symbool</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -2881,6 +2893,14 @@
<context context-type="linenumber">71</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Oceanië</target>
@ -4014,7 +4034,7 @@
<target state="translated">Verplichtingen</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="577204259483334667" datatype="html">
@ -4258,7 +4278,7 @@
<target state="translated">Waardevol</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
@ -4446,7 +4466,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -5139,6 +5159,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Laatste 90 dagen)</target>
@ -5304,7 +5332,7 @@
<target state="translated">Bezittingen Profiel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5339,6 +5367,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Laatste Recordhoogte</target>
@ -5355,6 +5391,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> vergelijkingstabel</target>
@ -5699,14 +5743,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Als u vandaag met pensioen zou gaan, kunt u <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per jaar<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per maand<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> opnemen, gebaseerd op uw totale vermogen van <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> en een opnamepercentage van 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Filters Herstellen</target>
@ -5865,7 +5901,7 @@
<target state="translated">Opdracht Uitvoeren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5873,7 +5909,7 @@
<target state="translated">Prioriteit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6380,6 +6416,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Inactief</target>
@ -6429,7 +6473,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6473,7 +6517,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6509,7 +6553,7 @@
<target state="translated">Portfolio Momentopname</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6979,7 +7023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.pl.xlf

@ -243,7 +243,7 @@
<target state="translated">Typ</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -563,7 +563,7 @@
<target state="translated">Profil Aktywów</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="8530249987193962636" datatype="html">
@ -571,7 +571,7 @@
<target state="translated">Historyczne Dane Rynkowe</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -583,7 +583,7 @@
<target state="translated">Źródło Danych</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -607,7 +607,7 @@
<target state="translated">Próby</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -615,7 +615,7 @@
<target state="translated">Utworzono</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -623,7 +623,7 @@
<target state="translated">Zakończono</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -631,7 +631,7 @@
<target state="translated">Status</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -651,7 +651,7 @@
<target state="translated">Usuń Zadania</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -659,7 +659,7 @@
<target state="translated">Zobacz Dane</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -667,7 +667,7 @@
<target state="translated">Wyświetl Stos Wywołań</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -675,7 +675,7 @@
<target state="translated">Usuń Zadanie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -1653,6 +1653,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -2117,6 +2121,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -2725,6 +2733,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -3374,6 +3386,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6099700884541852399" datatype="html">
<source>New Users</source>
<target state="translated">Nowi Użytkownicy</target>
@ -3395,7 +3415,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -4010,14 +4030,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">Zasada 4%</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="8057462855421378241" datatype="html">
<source>Holdings</source>
<target state="translated">Inwestycje</target>
@ -4266,6 +4278,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio umożliwia śledzenie wartości swojego majątku.</target>
@ -4399,6 +4419,14 @@
<context context-type="linenumber">44</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> - tabela porównawcza</target>
@ -4743,6 +4771,14 @@
<context context-type="linenumber">106</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Ostatni Najwyższy Punkt w Historii</target>
@ -5096,7 +5132,7 @@
<target state="translated">Symbol</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -5180,7 +5216,7 @@
<target state="translated">Kosztowności</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5188,7 +5224,7 @@
<target state="translated">Zobowiązanie</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="4881880242577556" datatype="html">
@ -5200,7 +5236,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="787798817533231355" datatype="html">
@ -5339,6 +5375,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Oceania</target>
@ -5699,14 +5743,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Jeśli przejdziesz na emeryturę dzisiaj, będziesz mógł wypłacić <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> rocznie<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> lub <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> miesięcznie<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, w oparciu o Twój łączny majątek w wysokości <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> i stopę wypłaty w wysokości 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Resetuj Filtry</target>
@ -5865,7 +5901,7 @@
<target state="translated">Wykonaj Zadanie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5873,7 +5909,7 @@
<target state="translated">Priorytet</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6380,6 +6416,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Nieaktywny</target>
@ -6429,7 +6473,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6473,7 +6517,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6509,7 +6553,7 @@
<target state="translated">Przegląd portfela</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6979,7 +7023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.pt.xlf

@ -34,7 +34,7 @@
<target state="translated">Tipo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -342,7 +342,7 @@
<target state="translated">Fonte de dados</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -366,7 +366,7 @@
<target state="translated">Tentativas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -374,7 +374,7 @@
<target state="translated">Criado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -382,7 +382,7 @@
<target state="translated">Terminado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -390,7 +390,7 @@
<target state="translated">Estado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -410,7 +410,7 @@
<target state="translated">Eliminar Tarefas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3060494754215793943" datatype="html">
@ -426,7 +426,7 @@
<target state="translated">Histórico de Dados de Mercado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -438,7 +438,7 @@
<target state="translated">Visualizar dados</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -446,7 +446,7 @@
<target state="translated">Ver Stacktrace</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -454,7 +454,7 @@
<target state="translated">Apagar Tarefa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -960,6 +960,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1432,6 +1436,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -1756,6 +1764,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -1962,7 +1974,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="2691619717359603230" datatype="html">
@ -2273,14 +2285,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">Regra dos 4%</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Posições</target>
@ -2361,6 +2365,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">O Ghostfolio permite-lhe estar a par e gerir a sua riqueza.</target>
@ -2702,7 +2714,7 @@
<target state="translated">Símbolo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -2873,6 +2885,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Oceânia</target>
@ -4014,7 +4034,7 @@
<target state="translated">Responsabilidade</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="577204259483334667" datatype="html">
@ -4258,7 +4278,7 @@
<target state="translated">De valor</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
@ -4446,7 +4466,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -5139,6 +5159,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Últimos 90 dias)</target>
@ -5304,7 +5332,7 @@
<target state="translated">Perfil de ativos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5339,6 +5367,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Última alta de todos os tempos</target>
@ -5355,6 +5391,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tabela de comparação</target>
@ -5699,14 +5743,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Se você se aposentar hoje, poderá sacar <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Redefinir filtros</target>
@ -5865,7 +5901,7 @@
<target state="translated">Executar trabalho</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5873,7 +5909,7 @@
<target state="translated">Prioridade</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6380,6 +6416,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Inativo</target>
@ -6429,7 +6473,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6473,7 +6517,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6509,7 +6553,7 @@
<target state="translated">Visão geral do portfólio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6979,7 +7023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.tr.xlf

@ -215,7 +215,7 @@
<target state="translated">Tip</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -523,7 +523,7 @@
<target state="translated">Veri Kaynağı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -547,7 +547,7 @@
<target state="translated">Deneme</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -555,7 +555,7 @@
<target state="translated">Oluşturuldu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -563,7 +563,7 @@
<target state="translated">Tamamlandı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -571,7 +571,7 @@
<target state="translated">Durum</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -591,7 +591,7 @@
<target state="translated">İşleri Sil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3060494754215793943" datatype="html">
@ -607,7 +607,7 @@
<target state="translated">Tarihsel Piyasa Verisi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -619,7 +619,7 @@
<target state="translated">Veri Gör</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -627,7 +627,7 @@
<target state="translated">Hata İzini Görüntüle</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -635,7 +635,7 @@
<target state="translated">İşleri Sil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -1509,6 +1509,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -2297,6 +2301,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -2927,7 +2935,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -3518,14 +3526,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">%4 Kuralı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="8057462855421378241" datatype="html">
<source>Holdings</source>
<target state="translated">Varlıklar</target>
@ -3774,6 +3774,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio, varlıklarınızı takip etmenizi sağlar.</target>
@ -4242,6 +4250,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -4832,7 +4844,7 @@
<target state="translated">Sembol</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -4900,7 +4912,7 @@
<target state="translated">Kıymet</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -4908,7 +4920,7 @@
<target state="translated">Yükümlülük</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="4881880242577556" datatype="html">
@ -4920,7 +4932,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="787798817533231355" datatype="html">
@ -5059,6 +5071,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Okyanusya</target>
@ -5147,6 +5167,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6081912257037692210" datatype="html">
<source>(Last 90 days)</source>
<target state="translated">(Son 90 gün)</target>
@ -5304,7 +5332,7 @@
<target state="translated">Varlık Profili</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="6786981261778452561" datatype="html">
@ -5339,6 +5367,14 @@
<context context-type="linenumber">5</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Son, ATH</target>
@ -5355,6 +5391,14 @@
<context context-type="linenumber">13</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> karşılatırma tablosu</target>
@ -5699,14 +5743,6 @@
<context context-type="linenumber">8</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Eğer bugün emekli olursanız, paranızı çekebilirsiniz <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> yıllık<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> veya <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> aylık<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, toplam varlıklarınıza göre <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> ve %4’lük bir çekilme oranı.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6978234364807213493" datatype="html">
<source>Reset Filters</source>
<target state="translated">Filtreleri Sıfırla</target>
@ -5865,7 +5901,7 @@
<target state="translated">İşlemi Yürüt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5873,7 +5909,7 @@
<target state="translated">Öncelik</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6380,6 +6416,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Pasif</target>
@ -6429,7 +6473,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6473,7 +6517,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6509,7 +6553,7 @@
<target state="translated">Portföy Anlık Görüntüsü</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6979,7 +7023,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.uk.xlf

@ -671,7 +671,7 @@
<target state="translated">Тип</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -691,7 +691,7 @@
<target state="translated">Профіль активу</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="8530249987193962636" datatype="html">
@ -699,7 +699,7 @@
<target state="translated">Історичні ринкові дані</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -711,7 +711,7 @@
<target state="translated">Знімок портфеля</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -719,7 +719,7 @@
<target state="translated">Джерело даних</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -743,7 +743,7 @@
<target state="translated">Пріоритет</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="4467730511941715714" datatype="html">
@ -751,7 +751,7 @@
<target state="translated">Спроби</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -759,7 +759,7 @@
<target state="translated">Створено</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -767,7 +767,7 @@
<target state="translated">Завершено</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -775,7 +775,7 @@
<target state="translated">Статус</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -795,7 +795,7 @@
<target state="translated">Видалити завдання</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -803,7 +803,7 @@
<target state="translated">Переглянути дані</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -811,7 +811,7 @@
<target state="translated">Переглянути трасування</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8871342657187208008" datatype="html">
@ -819,7 +819,7 @@
<target state="translated">Виконати завдання</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -827,7 +827,7 @@
<target state="translated">Видалити завдання</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="829826868886560502" datatype="html">
@ -1497,6 +1497,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -2243,7 +2247,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>
@ -2681,6 +2685,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -3341,6 +3349,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -4031,6 +4043,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6099700884541852399" datatype="html">
<source>New Users</source>
<target state="translated">Нові користувачі</target>
@ -4052,7 +4072,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -4775,22 +4795,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">Правило 4%</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">Якщо ви вийдете на пенсію сьогодні, ви зможете знімати <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> на рік<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> або <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> на місяць<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, виходячи з вашого загального капіталу в <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> та ставкою виведення у 4%.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="5806117524908922510" datatype="html">
<source>Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy.</source>
<target state="translated">Ghostfolio X-ray використовує статичний аналіз для виявлення потенційних проблем та ризиків у вашому портфелі. Налаштуйте правила нижче та встановіть індивідуальні пороги, щоб узгодити їх з вашою особистою інвестиційною стратегією.</target>
@ -4815,6 +4819,14 @@
<context context-type="linenumber">58</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">Неактивний</target>
@ -5071,6 +5083,14 @@
<context context-type="linenumber">234</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio надає можливість вам стежити за вашим багатством.</target>
@ -5462,6 +5482,14 @@
<context context-type="linenumber">44</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Порівняльна таблиця Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/></target>
@ -6026,6 +6054,14 @@
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">Останній рекордний максимум</target>
@ -6307,7 +6343,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6359,7 +6395,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6503,7 +6539,7 @@
<target state="translated">Символ</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -6595,7 +6631,7 @@
<target state="translated">Цінний</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -6603,7 +6639,7 @@
<target state="translated">Зобов’язання</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="4881880242577556" datatype="html">
@ -6615,7 +6651,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="787798817533231355" datatype="html">
@ -6762,6 +6798,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">Океанія</target>

114
apps/client/src/locales/messages.xlf

@ -228,7 +228,7 @@
<source>Type</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -540,14 +540,14 @@
<source>Asset Profile</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="8530249987193962636" datatype="html">
<source>Historical Market Data</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -558,7 +558,7 @@
<source>Data Source</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -581,28 +581,28 @@
<source>Attempts</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
<source>Created</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
<source>Status</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -620,28 +620,28 @@
<source>Delete Jobs</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
<source>View Data</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
<source>View Stacktrace</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
<source>Delete Job</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -1548,6 +1548,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -1968,6 +1972,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -2529,6 +2537,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -3112,6 +3124,13 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6099700884541852399" datatype="html">
<source>New Users</source>
<context-group purpose="location">
@ -3130,7 +3149,7 @@
<source>Job ID</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -3684,13 +3703,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="8057462855421378241" datatype="html">
<source>Holdings</source>
<context-group purpose="location">
@ -3917,6 +3929,13 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<context-group purpose="location">
@ -4035,6 +4054,13 @@
<context context-type="linenumber">44</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<context-group purpose="location">
@ -4380,6 +4406,13 @@
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<context-group purpose="location">
@ -4700,7 +4733,7 @@
<source>Symbol</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -4778,14 +4811,14 @@
<source>Valuable</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
<source>Liability</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="4881880242577556" datatype="html">
@ -4796,7 +4829,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="787798817533231355" datatype="html">
@ -4919,6 +4952,13 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<context-group purpose="location">
@ -5209,13 +5249,6 @@
<context context-type="linenumber">266</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6479044529603381727" datatype="html">
<source>year</source>
<context-group purpose="location">
@ -5350,7 +5383,7 @@
<source>Execute Job</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -5364,7 +5397,7 @@
<source>Priority</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="67933701892581429" datatype="html">
@ -5834,7 +5867,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -5856,6 +5889,13 @@
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<context-group purpose="location">
@ -5891,7 +5931,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5937,7 +5977,7 @@
<source>Portfolio Snapshot</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="5924984423053010080" datatype="html">
@ -6353,7 +6393,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

122
apps/client/src/locales/messages.zh.xlf

@ -244,7 +244,7 @@
<target state="translated">类型</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">48</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
@ -572,7 +572,7 @@
<target state="translated">资产概况</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">35</context>
<context context-type="linenumber">52</context>
</context-group>
</trans-unit>
<trans-unit id="8530249987193962636" datatype="html">
@ -580,7 +580,7 @@
<target state="translated">历史市场数据</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">37</context>
<context context-type="linenumber">54</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -592,7 +592,7 @@
<target state="translated">数据源</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">55</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -616,7 +616,7 @@
<target state="translated">尝试次数</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">83</context>
<context context-type="linenumber">120</context>
</context-group>
</trans-unit>
<trans-unit id="4207916966377787111" datatype="html">
@ -624,7 +624,7 @@
<target state="translated">创建</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">134</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
@ -632,7 +632,7 @@
<target state="translated">完成</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">143</context>
</context-group>
</trans-unit>
<trans-unit id="5611592591303869712" datatype="html">
@ -640,7 +640,7 @@
<target state="translated">状态</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">110</context>
<context context-type="linenumber">152</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-settings/admin-settings.component.html</context>
@ -660,7 +660,7 @@
<target state="translated">删除任务</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">151</context>
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -668,7 +668,7 @@
<target state="translated">查看数据</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="267346373699222750" datatype="html">
@ -676,7 +676,7 @@
<target state="translated">查看堆栈跟踪</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="8746056757774292739" datatype="html">
@ -684,7 +684,7 @@
<target state="translated">删除任务</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">180</context>
<context context-type="linenumber">222</context>
</context-group>
</trans-unit>
<trans-unit id="6293078117617468574" datatype="html">
@ -1662,6 +1662,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html</context>
<context context-type="linenumber">97</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">81</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
<context context-type="linenumber">31</context>
@ -2126,6 +2130,10 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">32</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">78</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">283</context>
@ -2734,6 +2742,10 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html</context>
<context context-type="linenumber">168</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html</context>
<context context-type="linenumber">189</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/blog/blog-page.html</context>
<context context-type="linenumber">5</context>
@ -3383,6 +3395,14 @@
<context context-type="linenumber">59</context>
</context-group>
</trans-unit>
<trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="6099700884541852399" datatype="html">
<source>New Users</source>
<target state="translated">新用户</target>
@ -3404,7 +3424,7 @@
<target state="new">Job ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">22</context>
<context context-type="linenumber">34</context>
</context-group>
</trans-unit>
<trans-unit id="364346912677324803" datatype="html">
@ -4019,14 +4039,6 @@
<context context-type="linenumber">7</context>
</context-group>
</trans-unit>
<trans-unit id="194226838811208599" datatype="html">
<source>4% Rule</source>
<target state="translated">4%规则</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="8057462855421378241" datatype="html">
<source>Holdings</source>
<target state="translated">持仓</target>
@ -4275,6 +4287,14 @@
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context>
</context-group>
</trans-unit>
<trans-unit id="201073452973037511" datatype="html">
<source>Ghostfolio empowers you to keep track of your wealth.</source>
<target state="translated">Ghostfolio 使您能够跟踪您的财富。</target>
@ -4408,6 +4428,14 @@
<context context-type="linenumber">44</context>
</context-group>
</trans-unit>
<trans-unit id="4905798562247431262" datatype="html">
<source>per month</source>
<target state="new">per month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context>
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>比较表</target>
@ -4788,6 +4816,14 @@
<context context-type="linenumber">61</context>
</context-group>
</trans-unit>
<trans-unit id="3302046820145091217" datatype="html">
<source>,</source>
<target state="new">,</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="3305717385545135104" datatype="html">
<source>Last All Time High</source>
<target state="translated">上次历史最高纪录</target>
@ -5141,7 +5177,7 @@
<target state="translated">代码</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">46</context>
<context context-type="linenumber">68</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
@ -5225,7 +5261,7 @@
<target state="translated">贵重物品</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">41</context>
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5233,7 +5269,7 @@
<target state="translated">负债</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">42</context>
<context context-type="linenumber">41</context>
</context-group>
</trans-unit>
<trans-unit id="4881880242577556" datatype="html">
@ -5245,7 +5281,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">43</context>
<context context-type="linenumber">42</context>
</context-group>
</trans-unit>
<trans-unit id="787798817533231355" datatype="html">
@ -5384,6 +5420,14 @@
<context context-type="linenumber">72</context>
</context-group>
</trans-unit>
<trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="3228811828827738441" datatype="html">
<source>Oceania</source>
<target state="translated">大洋洲</target>
@ -5708,14 +5752,6 @@
<context context-type="linenumber">266</context>
</context-group>
</trans-unit>
<trans-unit id="637740912956205466" datatype="html">
<source>If you retire today, you would be able to withdraw <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per year<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> or <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/> per month<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>, based on your total assets of <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/> and a withdrawal rate of 4%.</source>
<target state="translated">如果你今天退休,你可以领取<x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerYear?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/>每年<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>或者<x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_1" ctype="x-gf_value_1" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;withdrawalRatePerMonth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/>每月<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>,根据您的总资产<x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span class=&quot;font-weight-bold&quot; &gt;"/><x id="START_TAG_GF_VALUE_2" ctype="x-gf_value_2" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_GF_VALUE" ctype="x-gf_value" equiv-text="&lt;gf-value class=&quot;d-inline-block&quot; [isCurrency]=&quot;true&quot; [locale]=&quot;user?.settings?.locale&quot; [unit]=&quot;user?.settings?.baseCurrency&quot; [value]=&quot;fireWealth?.toNumber()&quot; /&gt;"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>提款率为4%。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">68</context>
</context-group>
</trans-unit>
<trans-unit id="6479044529603381727" datatype="html">
<source>year</source>
<target state="translated">年</target>
@ -5866,7 +5902,7 @@
<target state="translated">执行作业</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">176</context>
<context context-type="linenumber">218</context>
</context-group>
</trans-unit>
<trans-unit id="2734022681675842051" datatype="html">
@ -5874,7 +5910,7 @@
<target state="translated">优先级</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">64</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="8236987838684066590" datatype="html">
@ -6381,6 +6417,14 @@
<context context-type="linenumber">83</context>
</context-group>
</trans-unit>
<trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source>
<target state="new">based on your total assets of</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="1859131936150262113" datatype="html">
<source>Inactive</source>
<target state="translated">非活跃</target>
@ -6430,7 +6474,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">346</context>
<context context-type="linenumber">345</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html</context>
@ -6474,7 +6518,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">348</context>
<context context-type="linenumber">347</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -6510,7 +6554,7 @@
<target state="translated">投资组合快照</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">39</context>
<context context-type="linenumber">56</context>
</context-group>
</trans-unit>
<trans-unit id="8375528527939577247" datatype="html">
@ -6980,7 +7024,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html</context>
<context context-type="linenumber">357</context>
<context context-type="linenumber">356</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html</context>

6
apps/client/src/styles/table.scss

@ -1,6 +1,12 @@
@mixin gf-table($darkTheme: false) {
--mat-table-background-color: var(--light-background);
th {
.mat-sort-header-container {
justify-content: inherit;
}
}
.mat-footer-row,
.mat-row {
.mat-cell,

6
libs/common/src/lib/chart-helper.ts

@ -132,8 +132,10 @@ export function getVerticalHoverLinePlugin(
}
export function transformTickToAbbreviation(value: number) {
if (value >= -999 && value <= 999) {
return value.toString();
if (value === 0) {
return '0';
} else if (value >= -999 && value <= 999) {
return value.toFixed(2);
} else if (value >= -999999 && value <= 999999) {
return `${value / 1000}K`;
} else {

3
libs/common/src/lib/interfaces/fire-wealth.interface.ts

@ -0,0 +1,3 @@
export interface FireWealth {
today: { valueInBaseCurrency: number };
}

2
libs/common/src/lib/interfaces/index.ts

@ -19,6 +19,7 @@ import type { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'
import type { Export } from './export.interface';
import type { FilterGroup } from './filter-group.interface';
import type { Filter } from './filter.interface';
import type { FireWealth } from './fire-wealth.interface';
import type { HistoricalDataItem } from './historical-data-item.interface';
import type { HoldingWithParents } from './holding-with-parents.interface';
import type { Holding } from './holding.interface';
@ -104,6 +105,7 @@ export {
Export,
Filter,
FilterGroup,
FireWealth,
HistoricalDataItem,
HistoricalResponse,
Holding,

3
libs/common/src/lib/interfaces/portfolio-summary.interface.ts

@ -1,3 +1,4 @@
import { FireWealth } from './fire-wealth.interface';
import { PortfolioPerformance } from './portfolio-performance.interface';
export interface PortfolioSummary extends PortfolioPerformance {
@ -16,7 +17,7 @@ export interface PortfolioSummary extends PortfolioPerformance {
fees: number;
filteredValueInBaseCurrency?: number;
filteredValueInPercentage?: number;
fireWealth: number;
fireWealth: FireWealth;
grossPerformance: number;
grossPerformanceWithCurrencyEffect: number;
interest: number;

1
libs/common/src/lib/interfaces/user-settings.interface.ts

@ -29,6 +29,7 @@ export interface UserSettings {
performanceCalculationType?: PerformanceCalculationType;
projectedTotalAmount?: number;
retirementDate?: string;
safeWithdrawalRate?: number;
savingsRate?: number;
viewMode?: ViewMode;
xRayRules?: XRayRulesSettings;

10
libs/ui/src/lib/accounts-table/accounts-table.component.scss

@ -1,13 +1,3 @@
:host {
display: block;
.gf-table {
th {
::ng-deep {
.mat-sort-header-container {
justify-content: inherit;
}
}
}
}
}

4
libs/ui/src/lib/activities-filter/activities-filter.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { Filter, FilterGroup } from '@ghostfolio/common/interfaces';
import { COMMA, ENTER } from '@angular/cdk/keycodes';
@ -39,7 +39,7 @@ import { translate } from '../i18n';
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
CommonModule,
GfSymbolModule,
GfSymbolPipe,
IonIcon,
MatAutocompleteModule,
MatButtonModule,

4
libs/ui/src/lib/activities-table/activities-table.component.html

@ -255,7 +255,7 @@
<ng-container matColumnDef="value">
<th
*matHeaderCellDef
class="d-none d-lg-table-cell justify-content-end px-1"
class="d-none d-lg-table-cell px-1 text-right"
mat-header-cell
>
<ng-container i18n>Value</ng-container>
@ -291,7 +291,7 @@
<ng-container matColumnDef="valueInBaseCurrency">
<th
*matHeaderCellDef
class="d-lg-none d-xl-none justify-content-end px-1"
class="d-lg-none d-xl-none px-1 text-right"
mat-header-cell
>
<ng-container i18n>Value</ng-container>

471
libs/ui/src/lib/activities-table/activities-table.component.stories.ts

@ -0,0 +1,471 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { CommonModule } from '@angular/common';
import { MatButtonModule } from '@angular/material/button';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatMenuModule } from '@angular/material/menu';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { MatTooltipModule } from '@angular/material/tooltip';
import { RouterModule } from '@angular/router';
import { IonIcon } from '@ionic/angular/standalone';
import { moduleMetadata } from '@storybook/angular';
import type { Meta, StoryObj } from '@storybook/angular';
import { NotificationService } from 'apps/client/src/app/core/notification/notification.service';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfActivityTypeComponent } from '../activity-type/activity-type.component';
import { GfEntityLogoComponent } from '../entity-logo';
import { GfNoTransactionsInfoComponent } from '../no-transactions-info/no-transactions-info.component';
import { GfValueComponent } from '../value';
import { GfActivitiesTableComponent } from './activities-table.component';
const activities: Activity[] = [
{
accountId: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
accountUserId: '081aa387-487d-4438-83a4-3060eb2a016e',
comment: null,
createdAt: new Date('2025-04-09T13:47:33.133Z'),
currency: 'USD',
date: new Date('2025-04-09T13:45:45.504Z'),
fee: 1,
id: 'a76968ff-80a4-4453-81ed-c3627dea3919',
isDraft: false,
quantity: 115,
symbolProfileId: '21746431-d612-4298-911c-3099b2a43003',
type: 'BUY',
unitPrice: 103.543,
updatedAt: new Date('2025-05-31T18:43:01.840Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
account: {
balance: 150.2,
comment: null,
createdAt: new Date('2025-05-31T13:00:13.940Z'),
currency: 'USD',
id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
isExcluded: false,
name: 'Trading Account',
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
updatedAt: new Date('2025-06-01T06:53:10.569Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
platform: {
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
name: 'Interactive Brokers',
url: 'https://interactivebrokers.com'
}
},
SymbolProfile: {
assetClass: 'EQUITY',
assetSubClass: 'ETF',
comment: null,
countries: [],
createdAt: new Date('2021-06-06T16:12:20.982Z'),
currency: 'USD',
cusip: '922042742',
dataSource: 'YAHOO',
figi: 'BBG000GM5FZ6',
figiComposite: 'BBG000GM5FZ6',
figiShareClass: 'BBG001T2YZG9',
holdings: [],
id: '21746431-d612-4298-911c-3099b2a43003',
isActive: true,
isin: 'US9220427424',
name: 'Vanguard Total World Stock Index Fund ETF Shares',
updatedAt: new Date('2025-10-01T20:09:39.500Z'),
scraperConfiguration: null,
sectors: [],
symbol: 'VT',
symbolMapping: {},
url: 'https://www.vanguard.com',
userId: null,
activitiesCount: 267,
dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z')
},
tags: [],
feeInAssetProfileCurrency: 1,
feeInBaseCurrency: 1,
unitPriceInAssetProfileCurrency: 103.543,
value: 11907.445,
valueInBaseCurrency: 11907.445
},
{
accountId: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
accountUserId: '081aa387-487d-4438-83a4-3060eb2a016e',
comment: null,
createdAt: new Date('2024-08-07T13:40:39.103Z'),
currency: 'USD',
date: new Date('2024-08-07T13:38:06.289Z'),
fee: 2.97,
id: '0c2f4fbf-6edc-4adc-8f83-abf8148500ec',
isDraft: false,
quantity: 105,
symbolProfileId: '21746431-d612-4298-911c-3099b2a43003',
type: 'BUY',
unitPrice: 110.24,
updatedAt: new Date('2025-05-31T18:46:14.175Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
account: {
balance: 150.2,
comment: null,
createdAt: new Date('2025-05-31T13:00:13.940Z'),
currency: 'USD',
id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
isExcluded: false,
name: 'Trading Account',
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
updatedAt: new Date('2025-06-01T06:53:10.569Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
platform: {
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
name: 'Interactive Brokers',
url: 'https://interactivebrokers.com'
}
},
SymbolProfile: {
assetClass: 'EQUITY',
assetSubClass: 'ETF',
comment: null,
countries: [],
createdAt: new Date('2021-06-06T16:12:20.982Z'),
currency: 'USD',
cusip: '922042742',
dataSource: 'YAHOO',
figi: 'BBG000GM5FZ6',
figiComposite: 'BBG000GM5FZ6',
figiShareClass: 'BBG001T2YZG9',
holdings: [],
id: '21746431-d612-4298-911c-3099b2a43003',
isActive: true,
isin: 'US9220427424',
name: 'Vanguard Total World Stock Index Fund ETF Shares',
updatedAt: new Date('2025-10-01T20:09:39.500Z'),
scraperConfiguration: null,
sectors: [],
symbol: 'VT',
symbolMapping: {},
url: 'https://www.vanguard.com',
userId: null,
activitiesCount: 267,
dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z')
},
tags: [],
feeInAssetProfileCurrency: 2.97,
feeInBaseCurrency: 2.97,
unitPriceInAssetProfileCurrency: 110.24,
value: 11575.2,
valueInBaseCurrency: 11575.2
},
{
accountId: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
accountUserId: '081aa387-487d-4438-83a4-3060eb2a016e',
comment: null,
createdAt: new Date('2024-03-12T15:15:21.217Z'),
currency: 'USD',
date: new Date('2024-03-12T15:14:38.597Z'),
fee: 45.29,
id: 'bfc92677-faf4-4d4f-9762-e0ec056525c2',
isDraft: false,
quantity: 167,
symbolProfileId: '888d4123-db9a-42f3-9775-01b1ae6f9092',
type: 'BUY',
unitPrice: 41.0596,
updatedAt: new Date('2025-05-31T18:49:54.064Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
account: {
balance: 150.2,
comment: null,
createdAt: new Date('2025-05-31T13:00:13.940Z'),
currency: 'USD',
id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
isExcluded: false,
name: 'Trading Account',
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
updatedAt: new Date('2025-06-01T06:53:10.569Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
platform: {
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
name: 'Interactive Brokers',
url: 'https://interactivebrokers.com'
}
},
SymbolProfile: {
assetClass: 'LIQUIDITY',
assetSubClass: 'CRYPTOCURRENCY',
comment: null,
countries: [],
createdAt: new Date('2024-03-12T15:15:21.217Z'),
currency: 'USD',
cusip: '463918102',
dataSource: 'YAHOO',
figi: 'BBG01KYQ6PV3',
figiComposite: 'BBG01KYQ6PV3',
figiShareClass: 'BBG01KYQ6QS5',
holdings: [],
id: '888d4123-db9a-42f3-9775-01b1ae6f9092',
isActive: true,
isin: 'CA4639181029',
name: 'iShares Bitcoin Trust',
updatedAt: new Date('2025-09-29T03:14:07.742Z'),
scraperConfiguration: null,
sectors: [],
symbol: 'IBIT',
symbolMapping: {},
url: 'https://www.ishares.com',
userId: null,
activitiesCount: 6,
dateOfFirstActivity: new Date('2024-01-01T08:00:00.000Z')
},
tags: [],
feeInAssetProfileCurrency: 45.29,
feeInBaseCurrency: 45.29,
unitPriceInAssetProfileCurrency: 41.0596,
value: 6856.9532,
valueInBaseCurrency: 6856.9532
},
{
accountId: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
accountUserId: '081aa387-487d-4438-83a4-3060eb2a016e',
comment: null,
createdAt: new Date('2024-02-23T15:53:46.907Z'),
currency: 'USD',
date: new Date('2024-02-23T15:53:15.745Z'),
fee: 3,
id: '7c9ceb54-acb1-4850-bfb1-adb41c29fd6a',
isDraft: false,
quantity: 81,
symbolProfileId: '36effe43-7cb4-4e8b-b7ac-03ff65702cb9',
type: 'BUY',
unitPrice: 67.995,
updatedAt: new Date('2025-05-31T18:48:48.209Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
account: {
balance: 150.2,
comment: null,
createdAt: new Date('2025-05-31T13:00:13.940Z'),
currency: 'USD',
id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
isExcluded: false,
name: 'Trading Account',
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
updatedAt: new Date('2025-06-01T06:53:10.569Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
platform: {
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
name: 'Interactive Brokers',
url: 'https://interactivebrokers.com'
}
},
SymbolProfile: {
assetClass: 'FIXED_INCOME',
assetSubClass: 'BOND',
comment: 'No data',
countries: [],
createdAt: new Date('2022-04-13T20:05:47.301Z'),
currency: 'USD',
cusip: '92206C565',
dataSource: 'YAHOO',
figi: 'BBG00LWSF7T3',
figiComposite: 'BBG00LWSF7T3',
figiShareClass: 'BBG00LWSF8K0',
holdings: [],
id: '36effe43-7cb4-4e8b-b7ac-03ff65702cb9',
isActive: true,
isin: 'US92206C5655',
name: 'Vanguard Total World Bond ETF',
updatedAt: new Date('2025-10-02T06:02:56.314Z'),
sectors: [],
symbol: 'BNDW',
symbolMapping: {},
url: 'https://vanguard.com',
userId: null,
activitiesCount: 38,
dateOfFirstActivity: new Date('2022-04-13T20:05:48.742Z')
},
tags: [],
feeInAssetProfileCurrency: 3,
feeInBaseCurrency: 3,
unitPriceInAssetProfileCurrency: 67.995,
value: 5507.595,
valueInBaseCurrency: 5507.595
},
{
accountId: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
accountUserId: '081aa387-487d-4438-83a4-3060eb2a016e',
comment: null,
createdAt: new Date('2023-01-11T14:35:22.325Z'),
currency: 'USD',
date: new Date('2023-01-11T14:34:55.174Z'),
fee: 7.38,
id: '3fe87b3f-78de-407a-bc02-4189b221051f',
isDraft: false,
quantity: 55,
symbolProfileId: '21746431-d612-4298-911c-3099b2a43003',
type: 'BUY',
unitPrice: 89.48,
updatedAt: new Date('2025-05-31T18:46:44.616Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
account: {
balance: 150.2,
comment: null,
createdAt: new Date('2025-05-31T13:00:13.940Z'),
currency: 'USD',
id: '776bd1e9-b2f6-4f7e-933d-18756c2f0625',
isExcluded: false,
name: 'Trading Account',
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
updatedAt: new Date('2025-06-01T06:53:10.569Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
platform: {
id: '9da3a8a7-4795-43e3-a6db-ccb914189737',
name: 'Interactive Brokers',
url: 'https://interactivebrokers.com'
}
},
SymbolProfile: {
assetClass: 'EQUITY',
assetSubClass: 'ETF',
comment: null,
countries: [],
createdAt: new Date('2021-06-06T16:12:20.982Z'),
currency: 'USD',
cusip: '922042742',
dataSource: 'YAHOO',
figi: 'BBG000GM5FZ6',
figiComposite: 'BBG000GM5FZ6',
figiShareClass: 'BBG001T2YZG9',
holdings: [],
id: '21746431-d612-4298-911c-3099b2a43003',
isActive: true,
isin: 'US9220427424',
name: 'Vanguard Total World Stock Index Fund ETF Shares',
updatedAt: new Date('2025-10-01T20:09:39.500Z'),
scraperConfiguration: null,
sectors: [],
symbol: 'VT',
symbolMapping: {},
url: 'https://www.vanguard.com',
userId: null,
activitiesCount: 267,
dateOfFirstActivity: new Date('2018-05-31T16:00:00.000Z')
},
tags: [],
feeInAssetProfileCurrency: 7.38,
feeInBaseCurrency: 7.38,
unitPriceInAssetProfileCurrency: 89.48,
value: 4921.4,
valueInBaseCurrency: 4921.4
}
];
const dataSource = new MatTableDataSource<Activity>(activities);
export default {
title: 'Activities Table',
component: GfActivitiesTableComponent,
decorators: [
moduleMetadata({
imports: [
CommonModule,
GfActivityTypeComponent,
GfEntityLogoComponent,
GfNoTransactionsInfoComponent,
GfSymbolPipe,
GfValueComponent,
IonIcon,
MatButtonModule,
MatCheckboxModule,
MatMenuModule,
MatPaginatorModule,
MatSortModule,
MatTableModule,
MatTooltipModule,
NgxSkeletonLoaderModule,
RouterModule.forChild([])
],
providers: [NotificationService]
})
]
} as Meta<GfActivitiesTableComponent>;
type Story = StoryObj<GfActivitiesTableComponent>;
export const Loading: Story = {
args: {
baseCurrency: 'USD',
dataSource: undefined,
deviceType: 'desktop',
hasActivities: true,
hasPermissionToCreateActivity: false,
hasPermissionToDeleteActivity: false,
hasPermissionToExportActivities: false,
hasPermissionToOpenDetails: false,
locale: 'en-US',
pageIndex: 0,
pageSize: 10,
showAccountColumn: true,
showActions: false,
showCheckbox: false,
showNameColumn: true,
sortColumn: 'date',
sortDirection: 'desc',
sortDisabled: false,
totalItems: 0
}
};
export const Default: Story = {
args: {
baseCurrency: 'USD',
dataSource,
deviceType: 'desktop',
hasActivities: true,
hasPermissionToCreateActivity: false,
hasPermissionToDeleteActivity: false,
hasPermissionToExportActivities: false,
hasPermissionToOpenDetails: false,
locale: 'en-US',
pageIndex: 0,
pageSize: 10,
showAccountColumn: true,
showActions: false,
showCheckbox: false,
showNameColumn: true,
sortColumn: 'date',
sortDirection: 'desc',
sortDisabled: false,
totalItems: activities.length
}
};
export const Pagination: Story = {
args: {
baseCurrency: 'USD',
dataSource: new MatTableDataSource<Activity>(
Array.from({ length: 50 }).map((_, i) => ({
...(activities[i % activities.length] as Activity),
date: new Date(2025, 5, (i % 28) + 1),
id: `${i}`
}))
),
deviceType: 'desktop',
hasActivities: true,
hasPermissionToCreateActivity: false,
hasPermissionToDeleteActivity: false,
hasPermissionToExportActivities: false,
hasPermissionToOpenDetails: false,
locale: 'en-US',
pageIndex: 0,
pageSize: 10,
showAccountColumn: true,
showActions: false,
showCheckbox: false,
showNameColumn: true,
sortColumn: 'date',
sortDirection: 'desc',
sortDisabled: false,
totalItems: 50
}
};

4
libs/ui/src/lib/activities-table/activities-table.component.ts

@ -1,7 +1,7 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import {
DEFAULT_PAGE_SIZE,
TAG_ID_EXCLUDE_FROM_ANALYSIS
@ -73,7 +73,7 @@ import { GfValueComponent } from '../value/value.component';
GfActivityTypeComponent,
GfEntityLogoComponent,
GfNoTransactionsInfoComponent,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
IonIcon,
MatButtonModule,

4
libs/ui/src/lib/assistant/assistant-list-item/assistant-list-item.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { FocusableOption } from '@angular/cdk/a11y';
@ -24,7 +24,7 @@ import {
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [GfSymbolModule, RouterModule],
imports: [GfSymbolPipe, RouterModule],
selector: 'gf-assistant-list-item',
styleUrls: ['./assistant-list-item.scss'],
templateUrl: './assistant-list-item.html'

67
libs/ui/src/lib/assistant/assistant.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
@ -76,7 +76,7 @@ import {
FormsModule,
GfAssistantListItemComponent,
GfEntityLogoComponent,
GfSymbolModule,
GfSymbolPipe,
IonIcon,
MatButtonModule,
MatFormFieldModule,
@ -169,6 +169,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
};
public tags: Filter[] = [];
private readonly PRESELECTION_DELAY = 100;
private filterTypes: Filter['type'][] = [
'ACCOUNT',
'ASSET_CLASS',
@ -176,7 +178,9 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
'SYMBOL',
'TAG'
];
private keyManager: FocusKeyManager<GfAssistantListItemComponent>;
private preselectionTimeout: ReturnType<typeof setTimeout>;
private unsubscribeSubject = new Subject<void>();
public constructor(
@ -344,6 +348,9 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
.subscribe({
next: (searchResults) => {
this.searchResults = searchResults;
this.preselectFirstItem();
this.changeDetectorRef.markForCheck();
},
error: (error) => {
@ -585,6 +592,10 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
}
public ngOnDestroy() {
if (this.preselectionTimeout) {
clearTimeout(this.preselectionTimeout);
}
this.unsubscribeSubject.next();
this.unsubscribeSubject.complete();
}
@ -595,6 +606,58 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit {
});
}
private getFirstSearchResultItem() {
if (this.searchResults.quickLinks?.length > 0) {
return this.searchResults.quickLinks[0];
}
if (this.searchResults.accounts?.length > 0) {
return this.searchResults.accounts[0];
}
if (this.searchResults.holdings?.length > 0) {
return this.searchResults.holdings[0];
}
if (this.searchResults.assetProfiles?.length > 0) {
return this.searchResults.assetProfiles[0];
}
return null;
}
private preselectFirstItem() {
if (this.preselectionTimeout) {
clearTimeout(this.preselectionTimeout);
}
this.preselectionTimeout = setTimeout(() => {
if (!this.isOpen || !this.searchFormControl.value) {
return;
}
const firstItem = this.getFirstSearchResultItem();
if (!firstItem) {
return;
}
for (const item of this.assistantListItems) {
item.removeFocus();
}
this.keyManager.setFirstItemActive();
const currentFocusedItem = this.getCurrentAssistantListItem();
if (currentFocusedItem) {
currentFocusedItem.focus();
}
this.changeDetectorRef.markForCheck();
}, this.PRESELECTION_DELAY);
}
private searchAccounts(aSearchTerm: string): Observable<ISearchResultItem[]> {
return this.dataService
.fetchAccounts({

10
libs/ui/src/lib/benchmark/benchmark.component.scss

@ -1,13 +1,3 @@
:host {
display: block;
.gf-table {
th {
::ng-deep {
.mat-sort-header-container {
justify-content: inherit;
}
}
}
}
}

1
libs/ui/src/lib/fire-calculator/fire-calculator.component.html

@ -40,6 +40,7 @@
formControlName="retirementDate"
matInput
[matDatepicker]="datepicker"
[min]="minDate"
/>
<mat-datepicker-toggle
matIconSuffix

2
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -44,6 +44,7 @@ import 'chartjs-adapter-date-fns';
import Color from 'color';
import {
add,
addDays,
addYears,
getMonth,
setMonth,
@ -102,6 +103,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
});
public chart: Chart<'bar'>;
public isLoading = true;
public minDate = addDays(new Date(), 1);
public periodsToRetire = 0;
private readonly CONTRIBUTION_PERIOD = 12;

10
libs/ui/src/lib/holdings-table/holdings-table.component.scss

@ -1,13 +1,3 @@
:host {
display: block;
.gf-table {
th {
::ng-deep {
.mat-sort-header-container {
justify-content: inherit;
}
}
}
}
}

2
libs/ui/src/lib/holdings-table/holdings-table.component.ts

@ -1,4 +1,3 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { getLocale } from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
@ -34,7 +33,6 @@ import { GfValueComponent } from '../value/value.component';
imports: [
CommonModule,
GfEntityLogoComponent,
GfSymbolModule,
GfValueComponent,
MatButtonModule,
MatDialogModule,

5
libs/ui/src/lib/line-chart/line-chart.component.ts

@ -261,7 +261,10 @@ export class GfLineChartComponent
}
if (typeof tickValue === 'number') {
return tickValue.toFixed(2);
return tickValue.toLocaleString(this.locale, {
maximumFractionDigits: 2,
minimumFractionDigits: 2
});
}
return tickValue;

4
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { DataService } from '@ghostfolio/client/services/data.service';
import { LookupItem } from '@ghostfolio/common/interfaces';
@ -57,7 +57,7 @@ import { AbstractMatFormField } from '../shared/abstract-mat-form-field';
imports: [
FormsModule,
GfPremiumIndicatorComponent,
GfSymbolModule,
GfSymbolPipe,
MatAutocompleteModule,
MatFormFieldModule,
MatInputModule,

4
libs/ui/src/lib/top-holdings/top-holdings.component.ts

@ -1,4 +1,4 @@
import { GfSymbolModule } from '@ghostfolio/client/pipes/symbol/symbol.module';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { getLocale } from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
@ -46,7 +46,7 @@ import { GfValueComponent } from '../value/value.component';
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
CommonModule,
GfSymbolModule,
GfSymbolPipe,
GfValueComponent,
MatButtonModule,
MatPaginatorModule,

104
package-lock.json

@ -1,12 +1,12 @@
{
"name": "ghostfolio",
"version": "2.202.0",
"version": "2.206.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
"version": "2.202.0",
"version": "2.206.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@ -44,7 +44,7 @@
"@nestjs/schedule": "6.0.0",
"@nestjs/serve-static": "5.0.3",
"@openrouter/ai-sdk-provider": "0.7.2",
"@prisma/client": "6.16.1",
"@prisma/client": "6.16.3",
"@simplewebauthn/browser": "13.1.0",
"@simplewebauthn/server": "13.1.1",
"@stripe/stripe-js": "7.9.0",
@ -130,7 +130,7 @@
"@types/big.js": "6.2.2",
"@types/google-spreadsheet": "3.1.5",
"@types/jest": "29.5.13",
"@types/lodash": "4.17.17",
"@types/lodash": "4.17.20",
"@types/node": "22.15.17",
"@types/papaparse": "5.3.7",
"@types/passport-google-oauth20": "2.0.16",
@ -149,7 +149,7 @@
"nx": "21.5.1",
"prettier": "3.6.2",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.16.1",
"prisma": "6.16.3",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "8.3.0",
@ -11960,9 +11960,9 @@
"license": "MIT"
},
"node_modules/@prisma/client": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.16.1.tgz",
"integrity": "sha512-QaBCOY29lLAxEFFJgBPyW3WInCW52fJeQTmWx/h6YsP5u0bwuqP51aP0uhqFvhK9DaZPwvai/M4tSDYLVE9vRg==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.16.3.tgz",
"integrity": "sha512-JfNfAtXG+/lIopsvoZlZiH2k5yNx87mcTS4t9/S5oufM1nKdXYxOvpDC1XoTCFBa5cQh7uXnbMPsmZrwZY80xw==",
"hasInstallScript": true,
"license": "Apache-2.0",
"engines": {
@ -11982,9 +11982,9 @@
}
},
"node_modules/@prisma/config": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.16.1.tgz",
"integrity": "sha512-sz3uxRPNL62QrJ0EYiujCFkIGZ3hg+9hgC1Ae1HjoYuj0BxCqHua4JNijYvYCrh9LlofZDZcRBX3tHBfLvAngA==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.16.3.tgz",
"integrity": "sha512-VlsLnG4oOuKGGMToEeVaRhoTBZu5H3q51jTQXb/diRags3WV0+BQK5MolJTtP6G7COlzoXmWeS11rNBtvg+qFQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@ -11995,53 +11995,53 @@
}
},
"node_modules/@prisma/debug": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.16.1.tgz",
"integrity": "sha512-RWv/VisW5vJE4cDRTuAHeVedtGoItXTnhuLHsSlJ9202QKz60uiXWywBlVcqXVq8bFeIZoCoWH+R1duZJPwqLw==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.16.3.tgz",
"integrity": "sha512-89DdqWtdKd7qoc9/qJCKLTazj3W3zPEiz0hc7HfZdpjzm21c7orOUB5oHWJsG+4KbV4cWU5pefq3CuDVYF9vgA==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.16.1.tgz",
"integrity": "sha512-EOnEM5HlosPudBqbI+jipmaW/vQEaF0bKBo4gVkGabasINHR6RpC6h44fKZEqx4GD8CvH+einD2+b49DQrwrAg==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.16.3.tgz",
"integrity": "sha512-b+Rl4nzQDcoqe6RIpSHv8f5lLnwdDGvXhHjGDiokObguAAv/O1KaX1Oc69mBW/GFWKQpCkOraobLjU6s1h8HGg==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.16.1",
"@prisma/engines-version": "6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43",
"@prisma/fetch-engine": "6.16.1",
"@prisma/get-platform": "6.16.1"
"@prisma/debug": "6.16.3",
"@prisma/engines-version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a",
"@prisma/fetch-engine": "6.16.3",
"@prisma/get-platform": "6.16.3"
}
},
"node_modules/@prisma/engines-version": {
"version": "6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43.tgz",
"integrity": "sha512-ThvlDaKIVrnrv97ujNFDYiQbeMQpLa0O86HFA2mNoip4mtFqM7U5GSz2ie1i2xByZtvPztJlNRgPsXGeM/kqAA==",
"version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a.tgz",
"integrity": "sha512-fftRmosBex48Ph1v2ll1FrPpirwtPZpNkE5CDCY1Lw2SD2ctyrLlVlHiuxDAAlALwWBOkPbAll4+EaqdGuMhJw==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/fetch-engine": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.16.1.tgz",
"integrity": "sha512-fl/PKQ8da5YTayw86WD3O9OmKJEM43gD3vANy2hS5S1CnfW2oPXk+Q03+gUWqcKK306QqhjjIHRFuTZ31WaosQ==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.16.3.tgz",
"integrity": "sha512-bUoRIkVaI+CCaVGrSfcKev0/Mk4ateubqWqGZvQ9uCqFv2ENwWIR3OeNuGin96nZn5+SkebcD7RGgKr/+mJelw==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.16.1",
"@prisma/engines-version": "6.16.0-7.1c57fdcd7e44b29b9313256c76699e91c3ac3c43",
"@prisma/get-platform": "6.16.1"
"@prisma/debug": "6.16.3",
"@prisma/engines-version": "6.16.1-1.bb420e667c1820a8c05a38023385f6cc7ef8e83a",
"@prisma/get-platform": "6.16.3"
}
},
"node_modules/@prisma/get-platform": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.16.1.tgz",
"integrity": "sha512-kUfg4vagBG7dnaGRcGd1c0ytQFcDj2SUABiuveIpL3bthFdTLI6PJeLEia6Q8Dgh+WhPdo0N2q0Fzjk63XTyaA==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.16.3.tgz",
"integrity": "sha512-X1LxiFXinJ4iQehrodGp0f66Dv6cDL0GbRlcCoLtSu6f4Wi+hgo7eND/afIs5029GQLgNWKZ46vn8hjyXTsHLA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.16.1"
"@prisma/debug": "6.16.3"
}
},
"node_modules/@redis/client": {
@ -14435,9 +14435,9 @@
}
},
"node_modules/@types/lodash": {
"version": "4.17.17",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.17.tgz",
"integrity": "sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==",
"version": "4.17.20",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==",
"dev": true,
"license": "MIT"
},
@ -17285,9 +17285,9 @@
}
},
"node_modules/c12/node_modules/jiti": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz",
"integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==",
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
"integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
"devOptional": true,
"license": "MIT",
"bin": {
@ -33713,16 +33713,16 @@
}
},
"node_modules/nypm": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.1.tgz",
"integrity": "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w==",
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz",
"integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"citty": "^0.1.6",
"consola": "^3.4.2",
"pathe": "^2.0.3",
"pkg-types": "^2.2.0",
"pkg-types": "^2.3.0",
"tinyexec": "^1.0.1"
},
"bin": {
@ -34903,9 +34903,9 @@
}
},
"node_modules/pkg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz",
"integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
"integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@ -35747,15 +35747,15 @@
}
},
"node_modules/prisma": {
"version": "6.16.1",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.16.1.tgz",
"integrity": "sha512-MFkMU0eaDDKAT4R/By2IA9oQmwLTxokqv2wegAErr9Rf+oIe7W2sYpE/Uxq0H2DliIR7vnV63PkC1bEwUtl98w==",
"version": "6.16.3",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.16.3.tgz",
"integrity": "sha512-4tJq3KB9WRshH5+QmzOLV54YMkNlKOtLKaSdvraI5kC/axF47HuOw6zDM8xrxJ6s9o2WodY654On4XKkrobQdQ==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/config": "6.16.1",
"@prisma/engines": "6.16.1"
"@prisma/config": "6.16.3",
"@prisma/engines": "6.16.3"
},
"bin": {
"prisma": "build/index.js"

8
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "2.202.0",
"version": "2.206.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -90,7 +90,7 @@
"@nestjs/schedule": "6.0.0",
"@nestjs/serve-static": "5.0.3",
"@openrouter/ai-sdk-provider": "0.7.2",
"@prisma/client": "6.16.1",
"@prisma/client": "6.16.3",
"@simplewebauthn/browser": "13.1.0",
"@simplewebauthn/server": "13.1.1",
"@stripe/stripe-js": "7.9.0",
@ -176,7 +176,7 @@
"@types/big.js": "6.2.2",
"@types/google-spreadsheet": "3.1.5",
"@types/jest": "29.5.13",
"@types/lodash": "4.17.17",
"@types/lodash": "4.17.20",
"@types/node": "22.15.17",
"@types/papaparse": "5.3.7",
"@types/passport-google-oauth20": "2.0.16",
@ -195,7 +195,7 @@
"nx": "21.5.1",
"prettier": "3.6.2",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.16.1",
"prisma": "6.16.3",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "8.3.0",

Loading…
Cancel
Save