Browse Source

Merge remote-tracking branch 'origin/main' into bugfix/incorrect-performance-calculation

pull/4650/head
KenTandrian 4 months ago
parent
commit
d77c61750d
  1. 14
      CHANGELOG.md
  2. 10
      apps/api/src/app/import/import.service.ts
  3. 2
      apps/api/src/app/order/interfaces/activities.interface.ts
  4. 59
      apps/api/src/app/order/order.service.ts
  5. 4
      apps/api/src/app/platform/platform.service.ts
  6. 1
      apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts
  7. 52
      apps/api/src/app/portfolio/portfolio.service.ts
  8. 12
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  9. 12
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  10. 3
      apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts
  11. 24
      apps/client/src/app/pages/faq/overview/faq-overview-page.html
  12. 9
      apps/client/src/app/pages/faq/overview/faq-overview-page.module.ts
  13. 4
      apps/client/src/app/pages/faq/saas/saas-page.component.ts
  14. 59
      apps/client/src/app/pages/faq/saas/saas-page.html
  15. 9
      apps/client/src/app/pages/faq/saas/saas-page.module.ts
  16. 4
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts
  17. 19
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html
  18. 9
      apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts
  19. 45
      apps/client/src/app/pages/features/features-page.html
  20. 12
      apps/client/src/app/pages/home/home-page.component.ts
  21. 4
      apps/client/src/app/services/data.service.ts
  22. 40
      apps/client/src/locales/messages.ca.xlf
  23. 40
      apps/client/src/locales/messages.de.xlf
  24. 40
      apps/client/src/locales/messages.es.xlf
  25. 40
      apps/client/src/locales/messages.fr.xlf
  26. 40
      apps/client/src/locales/messages.it.xlf
  27. 40
      apps/client/src/locales/messages.nl.xlf
  28. 40
      apps/client/src/locales/messages.pl.xlf
  29. 40
      apps/client/src/locales/messages.pt.xlf
  30. 40
      apps/client/src/locales/messages.tr.xlf
  31. 40
      apps/client/src/locales/messages.uk.xlf
  32. 40
      apps/client/src/locales/messages.xlf
  33. 40
      apps/client/src/locales/messages.zh.xlf
  34. 6
      libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts
  35. 76
      package-lock.json
  36. 6
      package.json
  37. 8
      prisma/schema.prisma

14
CHANGELOG.md

@ -5,12 +5,24 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
## 2.160.0 - 2025-05-04
### Added
- Added the watchlist to the features page
- Extended the content of the Frequently Asked Questions (FAQ) pages
### Changed
- Moved the watchlist from experimental to general availability
- Deprecated the endpoint to get a portfolio position in favor of get a holding
- Deprecated the endpoint to update portfolio position tags in favor of update holding tags
- Renamed `Account` to `accounts` in the `Platform` database schema
- Upgraded `prisma` from version `6.6.0` to `6.7.0`
### Fixed
- Fixed an issue with the fee calculations related to activities in a custom currency
## 2.159.0 - 2025-05-02

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

@ -49,7 +49,7 @@ export class ImportService {
symbol
}: AssetProfileIdentifier): Promise<Activity[]> {
try {
const { firstBuyDate, historicalData, orders } =
const { activities, firstBuyDate, historicalData } =
await this.portfolioService.getHolding(dataSource, undefined, symbol);
const [[assetProfile], dividends] = await Promise.all([
@ -68,7 +68,7 @@ export class ImportService {
})
]);
const accounts = orders
const accounts = activities
.filter(({ Account }) => {
return !!Account;
})
@ -88,7 +88,7 @@ export class ImportService {
const value = new Big(quantity).mul(marketPrice).toNumber();
const date = parseDate(dateString);
const isDuplicate = orders.some((activity) => {
const isDuplicate = activities.some((activity) => {
return (
activity.accountId === Account?.id &&
activity.SymbolProfile.currency === assetProfile.currency &&
@ -118,6 +118,7 @@ export class ImportService {
createdAt: undefined,
fee: 0,
feeInAssetProfileCurrency: 0,
feeInBaseCurrency: 0,
id: assetProfile.id,
isDraft: false,
SymbolProfile: assetProfile,
@ -126,7 +127,8 @@ export class ImportService {
unitPrice: marketPrice,
unitPriceInAssetProfileCurrency: marketPrice,
updatedAt: undefined,
userId: Account?.userId
userId: Account?.userId,
valueInBaseCurrency: value
};
})
);

2
apps/api/src/app/order/interfaces/activities.interface.ts

@ -12,11 +12,13 @@ export interface Activity extends Order {
Account?: AccountWithPlatform;
error?: ActivityError;
feeInAssetProfileCurrency: number;
feeInBaseCurrency: number;
SymbolProfile?: EnhancedSymbolProfile;
tags?: Tag[];
unitPriceInAssetProfileCurrency: number;
updateAccountBalance?: boolean;
value: number;
valueInBaseCurrency: number;
}
export interface ActivityError {

59
apps/api/src/app/order/order.service.ts

@ -531,31 +531,46 @@ export class OrderService {
const value = new Big(order.quantity).mul(order.unitPrice).toNumber();
const [
feeInAssetProfileCurrency,
feeInBaseCurrency,
unitPriceInAssetProfileCurrency,
valueInBaseCurrency
] = await Promise.all([
this.exchangeRateDataService.toCurrencyAtDate(
order.fee,
order.currency ?? order.SymbolProfile.currency,
order.SymbolProfile.currency,
order.date
),
this.exchangeRateDataService.toCurrencyAtDate(
order.fee,
order.currency ?? order.SymbolProfile.currency,
userCurrency,
order.date
),
this.exchangeRateDataService.toCurrencyAtDate(
order.unitPrice,
order.currency ?? order.SymbolProfile.currency,
order.SymbolProfile.currency,
order.date
),
this.exchangeRateDataService.toCurrencyAtDate(
value,
order.currency ?? order.SymbolProfile.currency,
userCurrency,
order.date
)
]);
return {
...order,
feeInAssetProfileCurrency,
feeInBaseCurrency,
unitPriceInAssetProfileCurrency,
value,
feeInAssetProfileCurrency:
await this.exchangeRateDataService.toCurrencyAtDate(
order.fee,
order.currency ?? order.SymbolProfile.currency,
order.SymbolProfile.currency,
order.date
),
SymbolProfile: assetProfile,
unitPriceInAssetProfileCurrency:
await this.exchangeRateDataService.toCurrencyAtDate(
order.unitPrice,
order.currency ?? order.SymbolProfile.currency,
order.SymbolProfile.currency,
order.date
),
valueInBaseCurrency:
await this.exchangeRateDataService.toCurrencyAtDate(
value,
order.currency ?? order.SymbolProfile.currency,
userCurrency,
order.date
)
valueInBaseCurrency,
SymbolProfile: assetProfile
};
})
);

4
apps/api/src/app/platform/platform.service.ts

@ -54,7 +54,7 @@ export class PlatformService {
await this.prismaService.platform.findMany({
include: {
_count: {
select: { Account: true }
select: { accounts: true }
}
}
});
@ -64,7 +64,7 @@ export class PlatformService {
id,
name,
url,
accountCount: _count.Account
accountCount: _count.accounts
};
});
}

1
apps/api/src/app/portfolio/calculator/portfolio-calculator-test-utils.ts

@ -8,6 +8,7 @@ export const activityDummyData = {
currency: undefined,
fee: undefined,
feeInAssetProfileCurrency: undefined,
feeInBaseCurrency: undefined,
id: undefined,
isDraft: false,
symbolProfileId: undefined,

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

@ -648,6 +648,7 @@ export class PortfolioService {
if (activities.length === 0) {
return {
activities: [],
averagePrice: undefined,
dataProviderInfo: undefined,
dividendInBaseCurrency: undefined,
@ -662,13 +663,12 @@ export class PortfolioService {
historicalData: [],
investment: undefined,
marketPrice: undefined,
maxPrice: undefined,
minPrice: undefined,
marketPriceMax: undefined,
marketPriceMin: undefined,
netPerformance: undefined,
netPerformancePercent: undefined,
netPerformancePercentWithCurrencyEffect: undefined,
netPerformanceWithCurrencyEffect: undefined,
orders: [],
quantity: undefined,
SymbolProfile: undefined,
tags: [],
@ -714,7 +714,7 @@ export class PortfolioService {
transactionCount
} = position;
const activitiesOfPosition = activities.filter(({ SymbolProfile }) => {
const activitiesOfHolding = activities.filter(({ SymbolProfile }) => {
return (
SymbolProfile.dataSource === dataSource &&
SymbolProfile.symbol === symbol
@ -748,12 +748,12 @@ export class PortfolioService {
);
const historicalDataArray: HistoricalDataItem[] = [];
let maxPrice = Math.max(
activitiesOfPosition[0].unitPriceInAssetProfileCurrency,
let marketPriceMax = Math.max(
activitiesOfHolding[0].unitPriceInAssetProfileCurrency,
marketPrice
);
let minPrice = Math.min(
activitiesOfPosition[0].unitPriceInAssetProfileCurrency,
let marketPriceMin = Math.min(
activitiesOfHolding[0].unitPriceInAssetProfileCurrency,
marketPrice
);
@ -793,27 +793,31 @@ export class PortfolioService {
quantity: currentQuantity
});
maxPrice = Math.max(marketPrice ?? 0, maxPrice);
minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice);
marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax);
marketPriceMin = Math.min(
marketPrice ?? Number.MAX_SAFE_INTEGER,
marketPriceMin
);
}
} else {
// Add historical entry for buy date, if no historical data available
historicalDataArray.push({
averagePrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency,
averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency,
date: firstBuyDate,
marketPrice: activitiesOfPosition[0].unitPriceInAssetProfileCurrency,
quantity: activitiesOfPosition[0].quantity
marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency,
quantity: activitiesOfHolding[0].quantity
});
}
return {
firstBuyDate,
marketPrice,
maxPrice,
minPrice,
marketPriceMax,
marketPriceMin,
SymbolProfile,
tags,
transactionCount,
activities: activitiesOfHolding,
averagePrice: averagePrice.toNumber(),
dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0],
dividendInBaseCurrency: dividendInBaseCurrency.toNumber(),
@ -842,7 +846,6 @@ export class PortfolioService {
]?.toNumber(),
netPerformanceWithCurrencyEffect:
position.netPerformanceWithCurrencyEffectMap?.['max']?.toNumber(),
orders: activitiesOfPosition,
quantity: quantity.toNumber(),
value: this.exchangeRateDataService.toCurrency(
quantity.mul(marketPrice ?? 0).toNumber(),
@ -881,8 +884,8 @@ export class PortfolioService {
}
const historicalDataArray: HistoricalDataItem[] = [];
let maxPrice = marketPrice;
let minPrice = marketPrice;
let marketPriceMax = marketPrice;
let marketPriceMin = marketPrice;
for (const [date, { marketPrice }] of Object.entries(
historicalData[aSymbol]
@ -892,15 +895,19 @@ export class PortfolioService {
value: marketPrice
});
maxPrice = Math.max(marketPrice ?? 0, maxPrice);
minPrice = Math.min(marketPrice ?? Number.MAX_SAFE_INTEGER, minPrice);
marketPriceMax = Math.max(marketPrice ?? 0, marketPriceMax);
marketPriceMin = Math.min(
marketPrice ?? Number.MAX_SAFE_INTEGER,
marketPriceMin
);
}
return {
marketPrice,
maxPrice,
minPrice,
marketPriceMax,
marketPriceMin,
SymbolProfile,
activities: [],
averagePrice: 0,
dataProviderInfo: undefined,
dividendInBaseCurrency: 0,
@ -918,7 +925,6 @@ export class PortfolioService {
netPerformancePercent: undefined,
netPerformancePercentWithCurrencyEffect: undefined,
netPerformanceWithCurrencyEffect: undefined,
orders: [],
quantity: 0,
tags: [],
transactionCount: undefined,

12
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts

@ -105,8 +105,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
public investmentPrecision = 2;
public marketDataItems: MarketData[] = [];
public marketPrice: number;
public maxPrice: number;
public minPrice: number;
public marketPriceMax: number;
public marketPriceMin: number;
public netPerformance: number;
public netPerformancePrecision = 2;
public netPerformancePercent: number;
@ -234,8 +234,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
historicalData,
investment,
marketPrice,
maxPrice,
minPrice,
marketPriceMax,
marketPriceMin,
netPerformance,
netPerformancePercent,
netPerformancePercentWithCurrencyEffect,
@ -297,8 +297,8 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit {
}
this.marketPrice = marketPrice;
this.maxPrice = maxPrice;
this.minPrice = minPrice;
this.marketPriceMax = marketPriceMax;
this.marketPriceMin = marketPriceMin;
this.netPerformance = netPerformance;
if (

12
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html

@ -106,11 +106,11 @@
[locale]="data.locale"
[ngClass]="{
'text-danger':
minPrice?.toFixed(2) === marketPrice?.toFixed(2) &&
maxPrice?.toFixed(2) !== minPrice?.toFixed(2)
marketPriceMin?.toFixed(2) === marketPrice?.toFixed(2) &&
marketPriceMax?.toFixed(2) !== marketPriceMin?.toFixed(2)
}"
[unit]="SymbolProfile?.currency"
[value]="minPrice"
[value]="marketPriceMin"
>Minimum Price</gf-value
>
</div>
@ -122,11 +122,11 @@
[locale]="data.locale"
[ngClass]="{
'text-success':
maxPrice?.toFixed(2) === marketPrice?.toFixed(2) &&
maxPrice?.toFixed(2) !== minPrice?.toFixed(2)
marketPriceMax?.toFixed(2) === marketPrice?.toFixed(2) &&
marketPriceMax?.toFixed(2) !== marketPriceMin?.toFixed(2)
}"
[unit]="SymbolProfile?.currency"
[value]="maxPrice"
[value]="marketPriceMax"
>Maximum Price</gf-value
>
</div>

3
apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts

@ -12,6 +12,9 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false
})
export class FaqOverviewPageComponent implements OnDestroy {
public pricingUrl =
`https://ghostfol.io/${document.documentElement.lang}/` +
$localize`:snake-case:pricing`;
public routerLinkFeatures = ['/' + $localize`:snake-case:features`];
public user: User;

24
apps/client/src/app/pages/faq/overview/faq-overview-page.html

@ -59,9 +59,14 @@
world. The
<a href="https://github.com/ghostfolio/ghostfolio">source code</a> is
fully available as open source software (OSS). Thanks to our generous
<a href="https://ghostfol.io/en/pricing">Ghostfolio Premium</a> users
and <a href="https://www.buymeacoffee.com/ghostfolio">sponsors</a> we
have the ability to run a free, limited plan for novice
<a class="align-items-center d-inline-flex" [href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
users and
<a href="https://www.buymeacoffee.com/ghostfolio">sponsors</a> we have
the ability to run a free, limited plan for novice
investors.</mat-card-content
>
</mat-card>
@ -82,8 +87,11 @@
</mat-card-header>
<mat-card-content
>By offering
<a href="https://ghostfol.io/en/pricing">Ghostfolio Premium</a>, a
subscription plan with a managed hosting service and enhanced
<a class="align-items-center d-inline-flex" [href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false" /></a
>, a subscription plan with a managed hosting service and enhanced
features, we fund our business while providing added value to our
users.</mat-card-content
>
@ -105,7 +113,11 @@
</mat-card-header>
<mat-card-content
>Any support for Ghostfolio is welcome. Be it with a
<a href="https://ghostfol.io/en/pricing">Ghostfolio Premium</a>
<a class="align-items-center d-inline-flex" [href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
subscription to finance the hosting infrastructure, a positive rating
in the
<a

9
apps/client/src/app/pages/faq/overview/faq-overview-page.module.ts

@ -1,3 +1,5 @@
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
@ -7,7 +9,12 @@ import { FaqOverviewPageComponent } from './faq-overview-page.component';
@NgModule({
declarations: [FaqOverviewPageComponent],
imports: [CommonModule, FaqOverviewPageRoutingModule, MatCardModule],
imports: [
CommonModule,
FaqOverviewPageRoutingModule,
GfPremiumIndicatorComponent,
MatCardModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class FaqOverviewPageModule {}

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

@ -12,8 +12,10 @@ import { Subject, takeUntil } from 'rxjs';
standalone: false
})
export class SaasPageComponent implements OnDestroy {
public pricingUrl =
`https://ghostfol.io/${document.documentElement.lang}/` +
$localize`:snake-case:pricing`;
public routerLinkMarkets = ['/' + $localize`:snake-case:markets`];
public routerLinkPricing = ['/' + $localize`:snake-case:pricing`];
public routerLinkRegister = ['/' + $localize`:snake-case:register`];
public user: User;

59
apps/client/src/app/pages/faq/saas/saas-page.html

@ -14,11 +14,11 @@
<mat-card-title>How do I start?</mat-card-title>
</mat-card-header>
<mat-card-content>
You can sign up via the<a [routerLink]="routerLinkRegister"
>Get Started</a
>” button at the top of the page. You have multiple options to join
Ghostfolio: Create an account with a security token or
<i>Google Sign</i>. We will guide you to set up your portfolio.
You can sign up via the
<a [routerLink]="routerLinkRegister">Get Started</a> button at the top
of the page. You have multiple options to join Ghostfolio: Create an
account with a security token or <i>Google Sign</i>. We will guide you
to set up your portfolio.
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
@ -38,8 +38,8 @@
>
<mat-card-content
>Yes, it is! Our
<a [routerLink]="routerLinkPricing">pricing page</a> details
everything you get for free.</mat-card-content
<a target="_blank" [href]="pricingUrl">pricing page</a>
details everything you get for free.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
@ -49,12 +49,20 @@
></mat-card-header
>
<mat-card-content
><a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> is a fully
managed Ghostfolio cloud offering for ambitious investors. Revenue is
used to cover the costs of the hosting infrastructure and to fund
ongoing development. It is the Open Source code base with some extras
like the <a [routerLink]="routerLinkMarkets">markets overview</a> and
a professional data provider.</mat-card-content
><a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
is a fully managed Ghostfolio cloud offering for ambitious investors.
Revenue is used to cover the costs of the hosting infrastructure and
to fund ongoing development. It is the Open Source code base with some
extras like the
<a [routerLink]="routerLinkMarkets">markets overview</a> and a
professional data provider.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
@ -65,8 +73,15 @@
>
<mat-card-content
>Yes, you can try
<a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> by signing
up for Ghostfolio and applying for a trial (see
<a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
by signing up for Ghostfolio and applying for a trial (see
<a [routerLink]="['/account', 'membership']">Membership</a>). It is
easy, free and there is no commitment. You can stop using it at any
time.</mat-card-content
@ -93,9 +108,17 @@
>
</mat-card-header>
<mat-card-content
>No, <a [routerLink]="routerLinkPricing">Ghostfolio Premium</a> does
not include auto-renewal. Upon expiration, you can choose whether to
start a new subscription.</mat-card-content
>No,
<a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
does not include auto-renewal. Upon expiration, you can choose whether
to start a new subscription.</mat-card-content
>
</mat-card>
@if (user?.subscription?.type === 'Premium') {

9
apps/client/src/app/pages/faq/saas/saas-page.module.ts

@ -1,3 +1,5 @@
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
@ -7,7 +9,12 @@ import { SaasPageComponent } from './saas-page.component';
@NgModule({
declarations: [SaasPageComponent],
imports: [CommonModule, MatCardModule, SaasPageRoutingModule],
imports: [
CommonModule,
GfPremiumIndicatorComponent,
MatCardModule,
SaasPageRoutingModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class SaasPageModule {}

4
apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts

@ -9,6 +9,10 @@ import { Subject } from 'rxjs';
standalone: false
})
export class SelfHostingPageComponent implements OnDestroy {
public pricingUrl =
`https://ghostfol.io/${document.documentElement.lang}/` +
$localize`:snake-case:pricing`;
private unsubscribeSubject = new Subject<void>();
public ngOnDestroy() {

19
apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html

@ -140,6 +140,25 @@
providers are considered experimental.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
<mat-card-header>
<mat-card-title
>Can I get access to a professional data provider?</mat-card-title
>
</mat-card-header>
<mat-card-content
>Yes, access to a professional data provider is included with a
<a
class="align-items-center d-inline-flex"
target="_blank"
[href]="pricingUrl"
>Ghostfolio Premium<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
/></a>
subscription via an API key.</mat-card-content
>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
<mat-card-header>
<mat-card-title>How do I set up a benchmark?</mat-card-title>

9
apps/client/src/app/pages/faq/self-hosting/self-hosting-page.module.ts

@ -1,3 +1,5 @@
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { CommonModule } from '@angular/common';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
@ -7,7 +9,12 @@ import { SelfHostingPageComponent } from './self-hosting-page.component';
@NgModule({
declarations: [SelfHostingPageComponent],
imports: [CommonModule, MatCardModule, SelfHostingPageRoutingModule],
imports: [
CommonModule,
GfPremiumIndicatorComponent,
MatCardModule,
SelfHostingPageRoutingModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class SelfHostingPageModule {}

45
apps/client/src/app/pages/features/features-page.html

@ -175,10 +175,15 @@
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex" i18n>Dark Mode</h4>
<h4 class="align-items-center d-flex">
<span i18n>Static Analysis</span>
@if (hasPermissionForSubscription) {
<gf-premium-indicator class="ml-1" />
}
</h4>
<p class="m-0">
Ghostfolio automatically switches to a dark color theme based
on your operating system's preferences.
Identify potential risks in your portfolio with Ghostfolio
X-ray, the static portfolio analysis.
</p>
</div>
</mat-card-content>
@ -188,10 +193,14 @@
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex" i18n>Zen Mode</h4>
<h4 class="align-items-center d-flex">
<span i18n>Watchlist</span>
@if (hasPermissionForSubscription) {
<gf-premium-indicator class="ml-1" />
}
</h4>
<p class="m-0">
Keep calm and activate Zen Mode if the markets are going
crazy.
Follow assets you are interested in closely on your watchlist.
</p>
</div>
</mat-card-content>
@ -221,15 +230,23 @@
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex">
<span i18n>Static Analysis</span>
@if (hasPermissionForSubscription) {
<gf-premium-indicator class="ml-1" />
}
</h4>
<h4 class="align-items-center d-flex" i18n>Dark Mode</h4>
<p class="m-0">
Identify potential risks in your portfolio with Ghostfolio
X-ray, the static portfolio analysis.
Ghostfolio automatically switches to a dark color theme based
on your operating system's preferences.
</p>
</div>
</mat-card-content>
</mat-card>
</div>
<div class="col-xs-12 col-md-4 mb-3">
<mat-card appearance="outlined" class="d-flex flex-column h-100">
<mat-card-content>
<div class="flex-grow-1">
<h4 class="align-items-center d-flex" i18n>Zen Mode</h4>
<p class="m-0">
Keep calm and activate Zen Mode if the markets are going
crazy.
</p>
</div>
</mat-card-content>

12
apps/client/src/app/pages/home/home-page.component.ts

@ -48,18 +48,18 @@ export class HomePageComponent implements OnDestroy, OnInit {
label: $localize`Summary`,
path: ['/home', 'summary']
},
{
iconName: 'bookmark-outline',
label: $localize`Watchlist`,
path: ['/home', 'watchlist']
},
{
iconName: 'newspaper-outline',
label: $localize`Markets`,
path: ['/home', 'market']
},
{
iconName: 'bookmark-outline',
label: $localize`Watchlist`,
path: ['/home', 'watchlist'],
showCondition: this.user?.settings?.isExperimentalFeatures
}
];
this.user = state.user;
this.changeDetectorRef.markForCheck();

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

@ -411,8 +411,8 @@ export class DataService {
)
.pipe(
map((data) => {
if (data.orders) {
for (const order of data.orders) {
if (data.activities) {
for (const order of data.activities) {
order.createdAt = parseISO(order.createdAt as unknown as string);
order.date = parseISO(order.date as unknown as string);
}

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

@ -354,7 +354,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -591,7 +591,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -632,7 +632,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -711,9 +711,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -746,7 +754,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -3491,7 +3499,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -4035,7 +4043,7 @@
<target state="new">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4043,7 +4051,7 @@
<target state="new">Market Mood</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4051,7 +4059,7 @@
<target state="new">Static Analysis</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4059,7 +4067,7 @@
<target state="new">Multi-Language</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4067,7 +4075,7 @@
<target state="new">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -4075,7 +4083,7 @@
<target state="new">Get Started</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4123,7 +4131,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -1002,7 +1002,7 @@
<target state="translated">Registrieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1766,7 +1766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1994,7 +1994,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3238,7 +3238,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Marktstimmung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4294,7 +4294,7 @@
<target state="translated">Statische Analyse</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4302,7 +4302,7 @@
<target state="translated">Mehrsprachigkeit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4310,7 +4310,7 @@
<target state="translated">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5256,7 +5256,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5432,7 +5432,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5511,9 +5511,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5546,7 +5554,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -987,7 +987,7 @@
<target state="translated">Empezar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1751,7 +1751,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1979,7 +1979,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3223,7 +3223,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4255,7 +4255,7 @@
<target state="new">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4263,7 +4263,7 @@
<target state="new">Market Mood</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4271,7 +4271,7 @@
<target state="new">Static Analysis</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4279,7 +4279,7 @@
<target state="new">Multi-Language</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4287,7 +4287,7 @@
<target state="new">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5233,7 +5233,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5409,7 +5409,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5488,9 +5488,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5523,7 +5531,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7945,6 +7953,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7955,7 +7967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -2034,7 +2034,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="6b939b00e8481ed8aa8a24d8add7a209d7116759" datatype="html">
@ -2098,7 +2098,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -2398,7 +2398,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -2866,7 +2866,7 @@
<target state="translated">Démarrer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4254,7 +4254,7 @@
<target state="translated">Mode Sombre</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4262,7 +4262,7 @@
<target state="translated">Sentiment du Marché</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4270,7 +4270,7 @@
<target state="translated">Analyse statique</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Multi-Langue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Logiciel Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5232,7 +5232,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5408,7 +5408,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5487,9 +5487,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5522,7 +5530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -987,7 +987,7 @@
<target state="translated">Inizia</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1751,7 +1751,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1979,7 +1979,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3223,7 +3223,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4255,7 +4255,7 @@
<target state="translated">Modalità scura</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4263,7 +4263,7 @@
<target state="translated">Umore del mercato</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4271,7 +4271,7 @@
<target state="translated">Analisi statica</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4279,7 +4279,7 @@
<target state="translated">Multilingue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4287,7 +4287,7 @@
<target state="translated">Software open source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5233,7 +5233,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5409,7 +5409,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5488,9 +5488,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5523,7 +5531,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7945,6 +7953,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7955,7 +7967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -986,7 +986,7 @@
<target state="translated">Aan de slag</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1750,7 +1750,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -1978,7 +1978,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -3222,7 +3222,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -4254,7 +4254,7 @@
<target state="new">Dark Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4262,7 +4262,7 @@
<target state="translated">Marktsentiment</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4270,7 +4270,7 @@
<target state="translated">Statische Analyse</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Meerdere talen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5232,7 +5232,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5408,7 +5408,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5487,9 +5487,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5522,7 +5530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -193,7 +193,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -251,7 +251,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -330,9 +330,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -382,7 +390,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -787,7 +795,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -3195,7 +3203,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -3663,7 +3671,7 @@
<target state="translated">Ciemny motyw</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -3671,7 +3679,7 @@
<target state="translated">Nastrój rynku</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -3679,7 +3687,7 @@
<target state="translated">Analiza statyczna</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -3687,7 +3695,7 @@
<target state="translated">Wielo-językowość</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -3695,7 +3703,7 @@
<target state="translated">Oprogramowanie Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3703,7 +3711,7 @@
<target state="translated">Rozpocznij</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3751,7 +3759,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -2010,7 +2010,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html">
@ -2310,7 +2310,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -2762,7 +2762,7 @@
<target state="translated">Começar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3266,7 +3266,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="4798457301875181136" datatype="html">
@ -4254,7 +4254,7 @@
<target state="translated">Modo escuro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4262,7 +4262,7 @@
<target state="translated">Humor do mercado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4270,7 +4270,7 @@
<target state="translated">Análise estática</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4278,7 +4278,7 @@
<target state="translated">Multilíngua</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4286,7 +4286,7 @@
<target state="translated">Software de código aberto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -5232,7 +5232,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -5408,7 +5408,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -5487,9 +5487,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -5522,7 +5530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -193,7 +193,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -251,7 +251,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -330,9 +330,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -382,7 +390,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -759,7 +767,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -3207,7 +3215,7 @@
<target state="translated">Karanlık Mod</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -3219,7 +3227,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -3227,7 +3235,7 @@
<target state="translated">Piyasa Modu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -3235,7 +3243,7 @@
<target state="translated">Statik Analiz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -3243,7 +3251,7 @@
<target state="translated">Çoklu Dil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -3251,7 +3259,7 @@
<target state="translated">Açık Kaynak Yazılım</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3259,7 +3267,7 @@
<target state="translated">Başla</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3307,7 +3315,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -354,7 +354,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -591,7 +591,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -632,7 +632,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -711,9 +711,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -746,7 +754,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -3715,7 +3723,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -4251,7 +4259,7 @@
<target state="translated">Темний режим</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -4259,7 +4267,7 @@
<target state="translated">Ринковий настрій</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -4267,7 +4275,7 @@
<target state="translated">Статичний аналіз</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -4275,7 +4283,7 @@
<target state="translated">Багатомовність</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -4283,7 +4291,7 @@
<target state="translated">Програмне забезпечення з відкритим кодом</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -4291,7 +4299,7 @@
<target state="translated">Почати</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4339,7 +4347,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7944,6 +7952,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7954,7 +7966,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

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

@ -191,7 +191,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -247,7 +247,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -325,9 +325,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -375,7 +383,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -765,7 +773,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -2995,7 +3003,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -3416,42 +3424,42 @@
<source>Dark Mode</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
<source>Market Mood</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
<source>Static Analysis</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
<source>Multi-Language</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
<source>Open Source Software</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
<source>Get Started</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3496,7 +3504,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7186,7 +7194,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="7a6d28bd1c36c8298c95b7965abf226b218be50d" datatype="html">
@ -7195,6 +7203,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">
<source>Get Early Access</source>

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

@ -194,7 +194,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.component.ts</context>
@ -252,7 +252,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">18</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/overview/resources-overview.component.ts</context>
@ -331,9 +331,17 @@
<context context-type="sourcefile">apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.component.ts</context>
<context context-type="linenumber">15</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/overview/faq-overview-page.component.ts</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">16</context>
<context context-type="linenumber">17</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/self-hosting/self-hosting-page.component.ts</context>
<context context-type="linenumber">14</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/membership-card/membership-card.component.ts</context>
@ -383,7 +391,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/faq/saas/saas-page.component.ts</context>
<context context-type="linenumber">17</context>
<context context-type="linenumber">19</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.component.ts</context>
@ -788,7 +796,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">260</context>
<context context-type="linenumber">277</context>
</context-group>
</trans-unit>
<trans-unit id="0275b6f6c30c7b70cff02cb06c355ebd10724f86" datatype="html">
@ -3204,7 +3212,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">191</context>
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -3672,7 +3680,7 @@
<target state="translated">深色模式</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">178</context>
<context context-type="linenumber">233</context>
</context-group>
</trans-unit>
<trans-unit id="dbf8136366f55644df4ce493c233c74c12d79257" datatype="html">
@ -3680,7 +3688,7 @@
<target state="translated">市场情绪</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">206</context>
<context context-type="linenumber">215</context>
</context-group>
</trans-unit>
<trans-unit id="122bc975c17dc774c324f7d3ea82517ff3ac7c10" datatype="html">
@ -3688,7 +3696,7 @@
<target state="translated">静态分析</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">225</context>
<context context-type="linenumber">179</context>
</context-group>
</trans-unit>
<trans-unit id="e03687e1445b182f0d6bb3b9f0a94a21428cf18d" datatype="html">
@ -3696,7 +3704,7 @@
<target state="translated">多语言</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">242</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="b1153caa5b48efa22a2d312e07b8e28cf3e0e1ea" datatype="html">
@ -3704,7 +3712,7 @@
<target state="translated">开源软件</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">279</context>
<context context-type="linenumber">296</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3712,7 +3720,7 @@
<target state="translated">立即开始</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">304</context>
<context context-type="linenumber">321</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3760,7 +3768,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">53</context>
<context context-type="linenumber">58</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/markets/markets-page-routing.module.ts</context>
@ -7945,6 +7953,10 @@
<context context-type="sourcefile">apps/client/src/app/components/home-watchlist/home-watchlist.html</context>
<context context-type="linenumber">4</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
<context context-type="linenumber">197</context>
</context-group>
</trans-unit>
<trans-unit id="4558213855845176930" datatype="html">
<source>Watchlist</source>
@ -7955,7 +7967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/home/home-page.component.ts</context>
<context context-type="linenumber">58</context>
<context context-type="linenumber">53</context>
</context-group>
</trans-unit>
<trans-unit id="e9d59bb8bf6c08243d5411c55ddbdf925c7c799c" datatype="html">

6
libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts

@ -8,6 +8,7 @@ import {
import { Tag } from '@prisma/client';
export interface PortfolioHoldingResponse {
activities: Activity[];
averagePrice: number;
dataProviderInfo: DataProviderInfo;
dividendInBaseCurrency: number;
@ -22,13 +23,12 @@ export interface PortfolioHoldingResponse {
historicalData: HistoricalDataItem[];
investment: number;
marketPrice: number;
maxPrice: number;
minPrice: number;
marketPriceMax: number;
marketPriceMin: number;
netPerformance: number;
netPerformancePercent: number;
netPerformancePercentWithCurrencyEffect: number;
netPerformanceWithCurrencyEffect: number;
orders: Activity[];
quantity: number;
SymbolProfile: EnhancedSymbolProfile;
tags: Tag[];

76
package-lock.json

@ -1,12 +1,12 @@
{
"name": "ghostfolio",
"version": "2.159.0",
"version": "2.160.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ghostfolio",
"version": "2.159.0",
"version": "2.160.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@ -41,7 +41,7 @@
"@nestjs/platform-express": "10.4.15",
"@nestjs/schedule": "4.1.2",
"@nestjs/serve-static": "4.0.2",
"@prisma/client": "6.6.0",
"@prisma/client": "6.7.0",
"@simplewebauthn/browser": "13.1.0",
"@simplewebauthn/server": "13.1.1",
"@stripe/stripe-js": "5.4.0",
@ -150,7 +150,7 @@
"nx": "20.8.1",
"prettier": "3.5.3",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.6.0",
"prisma": "6.7.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "8.3.0",
@ -9631,9 +9631,9 @@
"license": "MIT"
},
"node_modules/@prisma/client": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.6.0.tgz",
"integrity": "sha512-vfp73YT/BHsWWOAuthKQ/1lBgESSqYqAWZEYyTdGXyFAHpmewwWL2Iz6ErIzkj4aHbuc6/cGSsE6ZY+pBO04Cg==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.7.0.tgz",
"integrity": "sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==",
"hasInstallScript": true,
"license": "Apache-2.0",
"engines": {
@ -9653,9 +9653,9 @@
}
},
"node_modules/@prisma/config": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.6.0.tgz",
"integrity": "sha512-d8FlXRHsx72RbN8nA2QCRORNv5AcUnPXgtPvwhXmYkQSMF/j9cKaJg+9VcUzBRXGy9QBckNzEQDEJZdEOZ+ubA==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.7.0.tgz",
"integrity": "sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@ -9664,53 +9664,53 @@
}
},
"node_modules/@prisma/debug": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.6.0.tgz",
"integrity": "sha512-DL6n4IKlW5k2LEXzpN60SQ1kP/F6fqaCgU/McgaYsxSf43GZ8lwtmXLke9efS+L1uGmrhtBUP4npV/QKF8s2ZQ==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.7.0.tgz",
"integrity": "sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.6.0.tgz",
"integrity": "sha512-nC0IV4NHh7500cozD1fBoTwTD1ydJERndreIjpZr/S3mno3P6tm8qnXmIND5SwUkibNeSJMpgl4gAnlqJ/gVlg==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.7.0.tgz",
"integrity": "sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.6.0",
"@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
"@prisma/fetch-engine": "6.6.0",
"@prisma/get-platform": "6.6.0"
"@prisma/debug": "6.7.0",
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"@prisma/fetch-engine": "6.7.0",
"@prisma/get-platform": "6.7.0"
}
},
"node_modules/@prisma/engines-version": {
"version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a.tgz",
"integrity": "sha512-JzRaQ5Em1fuEcbR3nUsMNYaIYrOT1iMheenjCvzZblJcjv/3JIuxXN7RCNT5i6lRkLodW5ojCGhR7n5yvnNKrw==",
"version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz",
"integrity": "sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/fetch-engine": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.6.0.tgz",
"integrity": "sha512-Ohfo8gKp05LFLZaBlPUApM0M7k43a0jmo86YY35u1/4t+vuQH9mRGU7jGwVzGFY3v+9edeb/cowb1oG4buM1yw==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz",
"integrity": "sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.6.0",
"@prisma/engines-version": "6.6.0-53.f676762280b54cd07c770017ed3711ddde35f37a",
"@prisma/get-platform": "6.6.0"
"@prisma/debug": "6.7.0",
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"@prisma/get-platform": "6.7.0"
}
},
"node_modules/@prisma/get-platform": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.6.0.tgz",
"integrity": "sha512-3qCwmnT4Jh5WCGUrkWcc6VZaw0JY7eWN175/pcb5Z6FiLZZ3ygY93UX0WuV41bG51a6JN/oBH0uywJ90Y+V5eA==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.7.0.tgz",
"integrity": "sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.6.0"
"@prisma/debug": "6.7.0"
}
},
"node_modules/@redis/bloom": {
@ -28457,15 +28457,15 @@
}
},
"node_modules/prisma": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.6.0.tgz",
"integrity": "sha512-SYCUykz+1cnl6Ugd8VUvtTQq5+j1Q7C0CtzKPjQ8JyA2ALh0EEJkMCS+KgdnvKW1lrxjtjCyJSHOOT236mENYg==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.7.0.tgz",
"integrity": "sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/config": "6.6.0",
"@prisma/engines": "6.6.0"
"@prisma/config": "6.7.0",
"@prisma/engines": "6.7.0"
},
"bin": {
"prisma": "build/index.js"

6
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "2.159.0",
"version": "2.160.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -87,7 +87,7 @@
"@nestjs/platform-express": "10.4.15",
"@nestjs/schedule": "4.1.2",
"@nestjs/serve-static": "4.0.2",
"@prisma/client": "6.6.0",
"@prisma/client": "6.7.0",
"@simplewebauthn/browser": "13.1.0",
"@simplewebauthn/server": "13.1.1",
"@stripe/stripe-js": "5.4.0",
@ -196,7 +196,7 @@
"nx": "20.8.1",
"prettier": "3.5.3",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.6.0",
"prisma": "6.7.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"replace-in-file": "8.3.0",

8
prisma/schema.prisma

@ -147,10 +147,10 @@ model Order {
}
model Platform {
id String @id @default(uuid())
name String?
url String @unique
Account Account[]
accounts Account[]
id String @id @default(uuid())
name String?
url String @unique
@@index([name])
}

Loading…
Cancel
Save