Browse Source

Merge pull request #44 from dandevaud/main

Main
pull/5027/head
dandevaud 2 years ago
committed by GitHub
parent
commit
00688958e6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 37
      CHANGELOG.md
  2. 83
      apps/api/src/app/benchmark/benchmark.service.ts
  3. 8
      apps/api/src/app/import/import.service.ts
  4. 2
      apps/api/src/app/portfolio/portfolio.service.ts
  5. 8
      apps/api/src/assets/sitemap.xml
  6. 4
      apps/api/src/middlewares/html-template.middleware.ts
  7. 41
      apps/api/src/services/market-data/market-data.service.ts
  8. 31
      apps/api/src/services/twitter-bot/twitter-bot.service.ts
  9. 12
      apps/client/project.json
  10. 12
      apps/client/src/app/app.component.html
  11. 1
      apps/client/src/app/components/home-market/home-market.html
  12. 1
      apps/client/src/app/components/position/position.component.html
  13. 1
      apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
  14. 4
      apps/client/src/app/components/user-account-settings/user-account-settings.html
  15. 10
      apps/client/src/app/pages/about/overview/about-overview-page.html
  16. 6
      apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html
  17. 16
      apps/client/src/app/pages/blog/2023/11/black-friday-2023/black-friday-2023-page.component.ts
  18. 158
      apps/client/src/app/pages/blog/2023/11/black-friday-2023/black-friday-2023-page.html
  19. 0
      apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts
  20. 0
      apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.html
  21. 11
      apps/client/src/app/pages/blog/blog-page-routing.module.ts
  22. 30
      apps/client/src/app/pages/blog/blog-page.html
  23. 6
      apps/client/src/app/pages/faq/faq-page.html
  24. 5
      apps/client/src/app/pages/features/features-page.html
  25. BIN
      apps/client/src/assets/images/blog/black-friday-2023.jpg
  26. 12
      apps/client/src/assets/oss-friends.json
  27. 64
      apps/client/src/locales/messages.de.xlf
  28. 64
      apps/client/src/locales/messages.es.xlf
  29. 64
      apps/client/src/locales/messages.fr.xlf
  30. 64
      apps/client/src/locales/messages.it.xlf
  31. 64
      apps/client/src/locales/messages.nl.xlf
  32. 12860
      apps/client/src/locales/messages.pl.xlf
  33. 64
      apps/client/src/locales/messages.pt.xlf
  34. 64
      apps/client/src/locales/messages.tr.xlf
  35. 62
      apps/client/src/locales/messages.xlf
  36. 1
      libs/common/src/lib/config.ts
  37. 61
      libs/common/src/lib/helper.ts
  38. 1
      libs/common/src/lib/interfaces/benchmark-property.interface.ts
  39. 4
      libs/common/src/lib/interfaces/benchmark.interface.ts
  40. 1
      libs/common/src/lib/types/benchmark-trend.type.ts
  41. 2
      libs/common/src/lib/types/index.ts
  42. 53
      libs/ui/src/lib/benchmark/benchmark.component.html
  43. 15
      libs/ui/src/lib/benchmark/benchmark.component.ts
  44. 2
      libs/ui/src/lib/benchmark/benchmark.module.ts
  45. 10
      libs/ui/src/lib/trend-indicator/trend-indicator.component.html
  46. 1
      libs/ui/src/lib/trend-indicator/trend-indicator.component.ts
  47. 8
      package.json
  48. 2
      test/import/invalid-currency.csv
  49. 24
      yarn.lock

37
CHANGELOG.md

@ -7,10 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Added
- Added a blog post: _Black Friday 2023_
### Changed
- Upgraded `http-status-codes` from version `2.2.0` to `2.3.0`
### Fixed
- Handled reading items from missing transaction point while getting the position (`getPosition()`) in portfolio service
## 2.24.0 - 2023-11-16
### Changed
- Improved the language localization for German (`de`)
### Fixed
- Fixed the "too many bind variables in prepared statement" issue of the data range functionality (`getRange()`) in the market data service
## 2.23.0 - 2023-11-15
### Added
- Extended the benchmarks in the markets overview by 50-Day and 200-Day trends (experimental)
- Set up the language localization for Polski (`pl`)
### Changed
- Improved the data source validation in the activities import
- Changed _Twitter_ to _𝕏_
- Improved the selection in the twitter bot service
- Improved the language localization for German (`de`)
- Upgraded `ng-extract-i18n-merge` from version `2.7.0` to `2.8.3`
- Upgraded `prettier` from version `3.0.3` to `3.1.0`
## 2.22.0 - 2023-11-11
@ -191,7 +224,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Added support to transfer a part of the cash balance from one to another account
- Extended the markets overview by benchmarks (date of last all time high)
- Extended the benchmarks in the markets overview by the date of the last all time high
- Added support to import historical market data in the admin control panel
### Changed
@ -2431,7 +2464,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Added the _Ghostfolio_ trailer to the landing page
- Extended the markets overview by benchmarks (current change to the all time high)
- Extended the benchmarks in the markets overview by the current change to the all time high
## 1.151.0 - 24.05.2022

83
apps/api/src/app/benchmark/benchmark.service.ts

@ -9,17 +9,21 @@ import {
MAX_CHART_ITEMS,
PROPERTY_BENCHMARKS
} from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import {
DATE_FORMAT,
calculateBenchmarkTrend
} from '@ghostfolio/common/helper';
import {
BenchmarkMarketDataDetails,
BenchmarkProperty,
BenchmarkResponse,
UniqueAsset
} from '@ghostfolio/common/interfaces';
import { BenchmarkTrend } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common';
import { SymbolProfile } from '@prisma/client';
import Big from 'big.js';
import { format } from 'date-fns';
import { format, subDays } from 'date-fns';
import { uniqBy } from 'lodash';
import ms from 'ms';
@ -45,9 +49,34 @@ export class BenchmarkService {
return 0;
}
public async getBenchmarks({ useCache = true } = {}): Promise<
BenchmarkResponse['benchmarks']
> {
public async getBenchmarkTrends({ dataSource, symbol }: UniqueAsset) {
const historicalData = await this.marketDataService.marketDataItems({
orderBy: {
date: 'desc'
},
where: {
dataSource,
symbol,
date: { gte: subDays(new Date(), 400) }
}
});
const fiftyDayAverage = calculateBenchmarkTrend({
historicalData,
days: 50
});
const twoHundredDayAverage = calculateBenchmarkTrend({
historicalData,
days: 200
});
return { trend50d: fiftyDayAverage, trend200d: twoHundredDayAverage };
}
public async getBenchmarks({
enableSharing = false,
useCache = true
} = {}): Promise<BenchmarkResponse['benchmarks']> {
let benchmarks: BenchmarkResponse['benchmarks'];
if (useCache) {
@ -62,9 +91,16 @@ export class BenchmarkService {
} catch {}
}
const benchmarkAssetProfiles = await this.getBenchmarkAssetProfiles();
const benchmarkAssetProfiles = await this.getBenchmarkAssetProfiles({
enableSharing
});
const promises: Promise<{ date: Date; marketPrice: number }>[] = [];
const promisesAllTimeHighs: Promise<{ date: Date; marketPrice: number }>[] =
[];
const promisesBenchmarkTrends: Promise<{
trend50d: BenchmarkTrend;
trend200d: BenchmarkTrend;
}>[] = [];
const quotes = await this.dataProviderService.getQuotes({
items: benchmarkAssetProfiles.map(({ dataSource, symbol }) => {
@ -73,10 +109,18 @@ export class BenchmarkService {
});
for (const { dataSource, symbol } of benchmarkAssetProfiles) {
promises.push(this.marketDataService.getMax({ dataSource, symbol }));
promisesAllTimeHighs.push(
this.marketDataService.getMax({ dataSource, symbol })
);
promisesBenchmarkTrends.push(
this.getBenchmarkTrends({ dataSource, symbol })
);
}
const allTimeHighs = await Promise.all(promises);
const [allTimeHighs, benchmarkTrends] = await Promise.all([
Promise.all(promisesAllTimeHighs),
Promise.all(promisesBenchmarkTrends)
]);
let storeInCache = true;
benchmarks = allTimeHighs.map((allTimeHigh, index) => {
@ -93,6 +137,7 @@ export class BenchmarkService {
} else {
storeInCache = false;
}
return {
marketCondition: this.getMarketCondition(
performancePercentFromAllTimeHigh
@ -100,10 +145,12 @@ export class BenchmarkService {
name: benchmarkAssetProfiles[index].name,
performances: {
allTimeHigh: {
date: allTimeHigh.date,
date: allTimeHigh?.date,
performancePercent: performancePercentFromAllTimeHigh
}
}
},
trend50d: benchmarkTrends[index].trend50d,
trend200d: benchmarkTrends[index].trend200d
};
});
@ -118,12 +165,22 @@ export class BenchmarkService {
return benchmarks;
}
public async getBenchmarkAssetProfiles(): Promise<Partial<SymbolProfile>[]> {
public async getBenchmarkAssetProfiles({
enableSharing = false
} = {}): Promise<Partial<SymbolProfile>[]> {
const symbolProfileIds: string[] = (
((await this.propertyService.getByKey(
PROPERTY_BENCHMARKS
)) as BenchmarkProperty[]) ?? []
).map(({ symbolProfileId }) => {
)
.filter((benchmark) => {
if (enableSharing) {
return benchmark.enableSharing;
}
return true;
})
.map(({ symbolProfileId }) => {
return symbolProfileId;
});

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

@ -8,6 +8,7 @@ import {
import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataGatheringService } from '@ghostfolio/api/services/data-gathering/data-gathering.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
@ -33,6 +34,7 @@ import { v4 as uuidv4 } from 'uuid';
export class ImportService {
public constructor(
private readonly accountService: AccountService,
private readonly configurationService: ConfigurationService,
private readonly dataGatheringService: DataGatheringService,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
@ -570,6 +572,12 @@ export class ImportService {
index,
{ currency, dataSource, symbol }
] of uniqueActivitiesDto.entries()) {
if (!this.configurationService.get('DATA_SOURCES').includes(dataSource)) {
throw new Error(
`activities.${index}.dataSource ("${dataSource}") is not valid`
);
}
if (dataSource !== 'MANUAL') {
const assetProfile = (
await this.dataProviderService.getAssetProfiles([

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

@ -967,7 +967,7 @@ export class PortfolioService {
let currentAveragePrice = 0;
let currentQuantity = 0;
const currentSymbol = transactionPoints[j].items.find(
const currentSymbol = transactionPoints[j]?.items.find(
({ symbol }) => {
return symbol === aSymbol;
}

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

@ -326,6 +326,10 @@
<loc>https://ghostfol.io/en/blog/2023/09/hacktoberfest-2023</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/en/blog/2023/11/black-friday-2023</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/en/blog/2023/11/hacktoberfest-2023-debriefing</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
@ -1092,6 +1096,10 @@
<loc>https://ghostfol.io/nl/veelgestelde-vragen</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/pl</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/pt</loc>
<lastmod>${currentDate}T00:00:00+00:00</lastmod>

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

@ -76,6 +76,10 @@ const locales = {
featureGraphicPath: 'assets/images/blog/hacktoberfest-2023.png',
title: `Hacktoberfest 2023 - ${title}`
},
'/en/blog/2023/11/black-friday-2023': {
featureGraphicPath: 'assets/images/blog/black-friday-2023.png',
title: `Black Friday 2023 - ${title}`
},
'/en/blog/2023/11/hacktoberfest-2023-debriefing': {
featureGraphicPath: 'assets/images/blog/hacktoberfest-2023.png',
title: `Hacktoberfest 2023 Debriefing - ${title}`

41
apps/api/src/services/market-data/market-data.service.ts

@ -71,12 +71,7 @@ export class MarketDataService {
dateQuery: DateQuery;
uniqueAssets: UniqueAsset[];
}): Promise<MarketData[]> {
const batch = new BatchPrismaClient(this.prismaService);
let { query, dates } = this.dateQueryHelper.handleDateQueryIn(dateQuery);
let marketData = await batch
.over(uniqueAssets)
.with((prisma, _assets) =>
prisma.marketData.findMany({
return this.prismaService.marketData.findMany({
orderBy: [
{
date: 'asc'
@ -86,37 +81,33 @@ export class MarketDataService {
}
],
where: {
OR: _assets.map(({ dataSource, symbol }) => {
return {
AND: [
{
dataSource,
symbol,
date: query
}
]
};
dataSource: {
in: uniqueAssets.map(({ dataSource }) => {
return dataSource;
})
}
},
date: dateQuery,
symbol: {
in: uniqueAssets.map(({ symbol }) => {
return symbol;
})
)
.then((data) => data.flat());
return marketData.filter(
(m) =>
dates?.length === 0 ||
dates.some((d) => m.date.getTime() === d.getTime())
);
}
}
});
}
public async marketDataItems(params: {
select?: Prisma.MarketDataSelectScalar;
skip?: number;
take?: number;
cursor?: Prisma.MarketDataWhereUniqueInput;
where?: Prisma.MarketDataWhereInput;
orderBy?: Prisma.MarketDataOrderByWithRelationInput;
}): Promise<MarketData[]> {
const { skip, take, cursor, where, orderBy } = params;
const { select, skip, take, cursor, where, orderBy } = params;
return this.prismaService.marketData.findMany({
select,
cursor,
orderBy,
skip,

31
apps/api/src/services/twitter-bot/twitter-bot.service.ts

@ -57,7 +57,7 @@ export class TwitterBotService {
symbolItem.marketPrice
}/100)`;
const benchmarkListing = await this.getBenchmarkListing(3);
const benchmarkListing = await this.getBenchmarkListing();
if (benchmarkListing?.length > 1) {
status += '\n\n';
@ -78,29 +78,22 @@ export class TwitterBotService {
}
}
private async getBenchmarkListing(aMax: number) {
private async getBenchmarkListing() {
const benchmarks = await this.benchmarkService.getBenchmarks({
enableSharing: true,
useCache: false
});
const benchmarkListing: string[] = [];
for (const [index, benchmark] of benchmarks.entries()) {
if (index > aMax - 1) {
break;
}
benchmarkListing.push(
`${benchmark.name} ${(
benchmark.performances.allTimeHigh.performancePercent * 100
return benchmarks
.map(({ marketCondition, name, performances }) => {
return `${name} ${(
performances.allTimeHigh.performancePercent * 100
).toFixed(1)}%${
benchmark.marketCondition !== 'NEUTRAL_MARKET'
? ' ' + resolveMarketCondition(benchmark.marketCondition).emoji
marketCondition !== 'NEUTRAL_MARKET'
? ' ' + resolveMarketCondition(marketCondition).emoji
: ''
}`
);
}
return benchmarkListing.join('\n');
}`;
})
.join('\n');
}
}

12
apps/client/project.json

@ -60,6 +60,10 @@
"baseHref": "/nl/",
"localize": ["nl"]
},
"development-pl": {
"baseHref": "/pl/",
"localize": ["pl"]
},
"development-pt": {
"baseHref": "/pt/",
"localize": ["pt"]
@ -170,6 +174,9 @@
"development-nl": {
"browserTarget": "client:build:development-nl"
},
"development-pl": {
"browserTarget": "client:build:development-pl"
},
"development-pt": {
"browserTarget": "client:build:development-pt"
},
@ -193,6 +200,7 @@
"messages.fr.xlf",
"messages.it.xlf",
"messages.nl.xlf",
"messages.pl.xlf",
"messages.pt.xlf",
"messages.tr.xlf"
]
@ -235,6 +243,10 @@
"baseHref": "/nl/",
"translation": "apps/client/src/locales/messages.nl.xlf"
},
"pl": {
"baseHref": "/pl/",
"translation": "apps/client/src/locales/messages.pl.xlf"
},
"pt": {
"baseHref": "/pt/",
"translation": "apps/client/src/locales/messages.pt.xlf"

12
apps/client/src/app/app.component.html

@ -127,8 +127,11 @@
class="align-items-baseline d-flex"
href="https://twitter.com/ghostfolio_"
target="_blank"
title="Follow Ghostfolio on Twitter"
>Twitter<ion-icon class="ml-1" name="open-outline"></ion-icon
title="Follow Ghostfolio on X (formerly Twitter)"
>X (formerly Twitter)<ion-icon
class="ml-1"
name="open-outline"
></ion-icon
></a>
</li>
<li>&nbsp;</li>
@ -150,6 +153,11 @@
<li>
<a href="../nl" title="Ghostfolio in Nederlands">Nederlands</a>
</li>
<!--
<li>
<a href="../pl" title="Ghostfolio in Polski">Polski</a>
</li>
-->
<li>
<a href="../pt" title="Ghostfolio in Português">Português</a>
</li>

1
apps/client/src/app/components/home-market/home-market.html

@ -31,6 +31,7 @@
<gf-benchmark
[benchmarks]="benchmarks"
[locale]="user?.settings?.locale"
[user]="user"
></gf-benchmark>
<ngx-skeleton-loader
*ngIf="isLoading"

1
apps/client/src/app/components/position/position.component.html

@ -13,6 +13,7 @@
<div class="d-flex mr-2">
<gf-trend-indicator
class="d-flex"
size="large"
[isLoading]="isLoading"
[marketState]="position?.marketState"
[range]="range"

1
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts

@ -44,6 +44,7 @@ export class UserAccountSettingsComponent implements OnDestroy, OnInit {
'fr',
'it',
'nl',
'pl',
'pt',
'tr'
];

4
apps/client/src/app/components/user-account-settings/user-account-settings.html

@ -74,6 +74,10 @@
>Nederlands (<ng-container i18n>Community</ng-container
>)</mat-option
>
<mat-option value="pl"
>Polski (<ng-container i18n>Community</ng-container
>)</mat-option
>
<mat-option value="pt"
>Português (<ng-container i18n>Community</ng-container
>)</mat-option

10
apps/client/src/app/pages/about/overview/about-overview-page.html

@ -52,10 +52,10 @@
title="Join the Ghostfolio Slack community"
>Slack</a
>
community, tweet to
community, post to
<a
href="https://twitter.com/ghostfolio_"
title="Tweet to Ghostfolio on Twitter"
title="Post to Ghostfolio on X (formerly Twitter)"
>@ghostfolio_</a
><ng-container *ngIf="user?.subscription?.type === 'Premium'"
>, send an e-mail to
@ -70,14 +70,14 @@
>GitHub</a
>.
</p>
<p class="text-center">
<p class="align-items-center d-flex justify-content-center">
<a
class="mx-2"
href="https://twitter.com/ghostfolio_"
mat-icon-button
title="Follow Ghostfolio on Twitter"
title="Follow Ghostfolio on X (formerly Twitter)"
>
<ion-icon name="logo-twitter"></ion-icon>
<span class="line-height-1 text-center w-100">𝕏</span>
</a>
<a
*ngIf="user?.subscription?.type === 'Premium'"

6
apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html

@ -15,11 +15,13 @@
<section class="mb-4">
<p>
Get 75% off on our
<strong>Ghostfolio Premium</strong>
<span class="align-items-center d-inline-flex"
><strong>Ghostfolio Premium</strong>
<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
></gf-premium-indicator>
></gf-premium-indicator
></span>
annual plan for ambitious investors who need the full picture of
their financial assets.
</p>

16
apps/client/src/app/pages/blog/2023/11/black-friday-2023/black-friday-2023-page.component.ts

@ -0,0 +1,16 @@
import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { RouterModule } from '@angular/router';
import { GfPremiumIndicatorModule } from '@ghostfolio/ui/premium-indicator';
@Component({
host: { class: 'page' },
imports: [GfPremiumIndicatorModule, MatButtonModule, RouterModule],
selector: 'gf-black-friday-2023-page',
standalone: true,
templateUrl: './black-friday-2023-page.html'
})
export class BlackFriday2023PageComponent {
public routerLinkFeatures = ['/' + $localize`features`];
public routerLinkPricing = ['/' + $localize`pricing`];
}

158
apps/client/src/app/pages/blog/2023/11/black-friday-2023/black-friday-2023-page.html

@ -0,0 +1,158 @@
<div class="blog container">
<div class="row">
<div class="col-md-8 offset-md-2">
<article>
<div class="mb-4 text-center">
<h1 class="mb-1">Black Friday 2023</h1>
<div class="mb-3 text-muted"><small>2023-11-18</small></div>
<img
alt="Black Friday 2023 Teaser"
class="rounded w-100"
src="../assets/images/blog/black-friday-2023.jpg"
title="Black Friday 2023"
/>
</div>
<section class="mb-4">
<p>
Ambitious investors on a life-changing mission, this is your chance!
Get 33% off on our
<span class="align-items-center d-inline-flex"
><strong>Ghostfolio Premium</strong>
<gf-premium-indicator
class="d-inline-block ml-1"
[enableLink]="false"
></gf-premium-indicator
></span>
annual plan with our exclusive Black Friday deal. Elevate your
financial strategy with the power of Ghostfolio designed to give you
the full picture of your assets.
</p>
</section>
<section class="mb-4">
<p>
<a
href="https://ghostfol.io"
title="Open Source Wealth Management Software"
>Ghostfolio</a
>
is a modern web application to manage personal finances. This Open
Source Software (OSS) dynamically aggregates your diverse assets
including stocks, ETFs, cryptocurrencies, commodities, and more,
presenting a comprehensive overview of your portfolio in real-time.
Empower yourself to make informed, data-driven investment decisions
with the robust analytics at your fingertips. Explore the numerous
<a [routerLink]="routerLinkFeatures">features</a> to enhance your
wealth management experience.
</p>
</section>
<section class="mb-4">
<p>
Snap the limited Black Friday 2023 deal before it’s gone. For
detailed information on plans and pricing, please visit our
<a [routerLink]="routerLinkPricing">pricing page</a>.
</p>
<p class="text-center">
<a color="primary" mat-flat-button [routerLink]="routerLinkPricing"
>Get the Deal</a
>
</p>
</section>
<section class="mb-4">
<ul class="list-inline">
<li class="list-inline-item">
<span class="badge badge-light">2023</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Black Friday</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Cloud</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Cryptocurrency</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Deal</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">ETF</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Fintech</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Ghostfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Ghostfolio Premium</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Hosting</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Investment</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Open Source</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">OSS</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Personal Finance</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Portfolio</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Portfolio Tracker</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Pricing</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">SaaS</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Software</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Stock</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Subscription</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Wealth</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Wealth Management</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Web3</span>
</li>
<li class="list-inline-item">
<span class="badge badge-light">Web 3.0</span>
</li>
</ul>
</section>
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a i18n [routerLink]="['/blog']">Blog</a>
</li>
<li
aria-current="page"
class="active breadcrumb-item text-truncate"
>
Black Friday 2023
</li>
</ol>
</nav>
</article>
</div>
</div>
</div>

0
apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023/hacktoberfest-2023-debriefing-page.component.ts → apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component.ts

0
apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023/hacktoberfest-2023-debriefing-page.html → apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.html

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

@ -169,9 +169,18 @@ const routes: Routes = [
path: '2023/11/hacktoberfest-2023-debriefing',
loadComponent: () =>
import(
'./2023/11/hacktoberfest-2023/hacktoberfest-2023-debriefing-page.component'
'./2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.component'
).then((c) => c.Hacktoberfest2023DebriefingPageComponent),
title: 'Hacktoberfest 2023 Debriefing'
},
{
canActivate: [AuthGuard],
path: '2023/11/black-friday-2023',
loadComponent: () =>
import(
'./2023/11/black-friday-2023/black-friday-2023-page.component'
).then((c) => c.BlackFriday2023PageComponent),
title: 'Black Friday 2023'
}
];

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

@ -1,13 +1,41 @@
<div class="container">
<div class="mb-5 row">
<div class="col">
<h1 class="h3 mb-4 text-center">
<h1 class="h3 line-height-1 mb-4 text-center">
<span class="d-none d-sm-block" i18n>Blog</span>
<small class="text-muted" i18n
>Discover the latest Ghostfolio updates and insights on personal
finance</small
>
</h1>
<mat-card
*ngIf="hasPermissionForSubscription"
appearance="outlined"
class="mb-3"
>
<mat-card-content>
<div class="container p-0">
<div class="flex-nowrap no-gutters row">
<a
class="d-flex overflow-hidden w-100"
href="../en/blog/2023/11/black-friday-2023"
>
<div class="flex-grow-1 overflow-hidden">
<div class="h6 m-0 text-truncate">Black Friday 2023</div>
<div class="d-flex text-muted">2023-11-17</div>
</div>
<div class="align-items-center d-flex">
<ion-icon
class="chevron text-muted"
name="chevron-forward-outline"
size="small"
></ion-icon>
</div>
</a>
</div>
</div>
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mb-3">
<mat-card-content>
<div class="container p-0">

6
apps/client/src/app/pages/faq/faq-page.html

@ -233,7 +233,7 @@
community,
<a
href="https://twitter.com/ghostfolio_"
title="Tweet to Ghostfolio on Twitter"
title="Post to Ghostfolio on X (formerly Twitter)"
>@ghostfolio_</a
><ng-container *ngIf="user?.subscription?.type === 'Premium'"
>,
@ -259,10 +259,10 @@
href="https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg"
title="Join the Ghostfolio Slack community"
>Slack </a
>community, tweet to
>community, post to
<a
href="https://twitter.com/ghostfolio_"
title="Tweet to Ghostfolio on Twitter"
title="Post to Ghostfolio on X (formerly Twitter)"
>@ghostfolio_</a
><ng-container *ngIf="user?.subscription?.type === 'Premium'"
>, send an e-mail to

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

@ -1,7 +1,7 @@
<div class="container">
<div class="row">
<div class="col">
<h1 class="h3 mb-4 text-center">
<h1 class="h3 line-height-1 mb-4 text-center">
<span class="d-none d-sm-block" i18n>Features</span>
<small class="text-muted" i18n>
Check out the numerous features of Ghostfolio to manage your wealth
@ -245,7 +245,8 @@
<h4 i18n>Multi-Language</h4>
<p class="m-0">
Use Ghostfolio in multiple languages: English, Dutch, French,
German, Italian, Portuguese, Spanish and Turkish are currently
German, Italian,
<!-- Polish, -->Portuguese, Spanish and Turkish are currently
supported.
</p>
</div>

BIN
apps/client/src/assets/images/blog/black-friday-2023.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

12
apps/client/src/assets/oss-friends.json

@ -1,5 +1,5 @@
{
"createdAt": "2023-10-21T00:00:00.000Z",
"createdAt": "2023-11-17T00:00:00.000Z",
"data": [
{
"name": "BoxyHQ",
@ -96,6 +96,11 @@
"description": "Makes frontend development cycle 10x faster with API Client, Mock Server, Intercept & Modify HTTP Requests and Session Replays.",
"href": "https://requestly.io"
},
{
"name": "Revert",
"description": "The open-source unified API to build B2B integrations remarkably fast",
"href": "https://revert.dev"
},
{
"name": "Rivet",
"description": "Open-source solution to deploy, scale, and operate your multiplayer game.",
@ -136,6 +141,11 @@
"description": "Typebot gives you powerful blocks to create unique chat experiences. Embed them anywhere on your apps and start collecting results like magic.",
"href": "https://typebot.io"
},
{
"name": "Unkey",
"description": "An API authentication and authorization platform for scaling user facing APIs. Create, verify, and manage low latency API keys in seconds.",
"href": "https://unkey.dev"
},
{
"name": "Webiny",
"description": "Open-source enterprise-grade serverless CMS. Own your data. Scale effortlessly. Customize everything.",

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

@ -22,7 +22,7 @@
<target state="translated">Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="b6192ee60a5e0e40874f4d02fbaaa584a0f1541e" datatype="html">
@ -1130,7 +1130,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1788,7 +1788,7 @@
<target state="translated">Möchtest du diese Anmeldemethode wirklich löschen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
@ -1868,7 +1868,7 @@
<target state="translated">Lokalität</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -1876,7 +1876,7 @@
<target state="translated">Datums- und Zahlenformat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -1884,7 +1884,7 @@
<target state="translated">Zen Modus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -1896,7 +1896,7 @@
<target state="translated"> Einloggen mit Fingerabdruck </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -1904,7 +1904,7 @@
<target state="translated">Benutzer ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -2664,7 +2664,7 @@
<target state="translated">Änderung vom Allzeithoch</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -2672,7 +2672,7 @@
<target state="translated">vom AZH</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
@ -3012,7 +3012,7 @@
<target state="translated">Experimentelle Funktionen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="44fcf77e86dc038202ebad6b46d1d833d60d781b" datatype="html">
@ -3060,7 +3060,7 @@
<target state="translated">Aussehen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -3068,7 +3068,7 @@
<target state="translated">Automatisch</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -3076,7 +3076,7 @@
<target state="translated">Hell</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -3084,7 +3084,7 @@
<target state="translated">Dunkel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="112783260724635106" datatype="html">
@ -3370,9 +3370,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -3608,7 +3612,7 @@
<target state="translated"> Unbeschwertes Erlebnis für turbulente Zeiten </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -3616,7 +3620,7 @@
<target state="translated"> Vorschau auf kommende Funktionalität </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
@ -4448,7 +4452,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -9116,7 +9120,7 @@
<target state="translated">Biometrische Authentifizierung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="8d0f35e084b3902a5b04ee86cfde0d4b991a93af" datatype="html">
@ -9200,7 +9204,7 @@
<target state="translated">Daten exportieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8298612418414367990" datatype="html">
@ -12564,7 +12568,7 @@
<target state="translated">Letztes Allzeithoch</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12835,6 +12839,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="translated">50 Tage Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="translated">200 Tage Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -23,7 +23,7 @@
<target state="new">El riesgo de pérdida en trading puede ser importante. No es aconsejable invertir dinero que puedas necesitar a corto plazo.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="b6192ee60a5e0e40874f4d02fbaaa584a0f1541e" datatype="html">
@ -1131,7 +1131,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1786,7 +1786,7 @@
<target state="translated">¿Estás seguro de eliminar este método de acceso?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
@ -1866,7 +1866,7 @@
<target state="translated">Ubicación</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -1874,7 +1874,7 @@
<target state="translated">Formato de fecha y número</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -1882,7 +1882,7 @@
<target state="translated">Modo Zen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -1894,7 +1894,7 @@
<target state="new"> Accede con huella digital </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -1902,7 +1902,7 @@
<target state="translated">ID usuario</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -2662,7 +2662,7 @@
<target state="translated">Variación respecto al máximo histórico (ATH)</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -2670,7 +2670,7 @@
<target state="translated">desde el máximo histórico (ATH)</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
@ -3010,7 +3010,7 @@
<target state="translated">Funcionalidades experimentales</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="1931353503905413384" datatype="html">
@ -3058,7 +3058,7 @@
<target state="translated">Apariencia</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -3066,7 +3066,7 @@
<target state="translated">Automático</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -3074,7 +3074,7 @@
<target state="translated">Claro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -3082,7 +3082,7 @@
<target state="translated">Oscuro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="112783260724635106" datatype="html">
@ -3368,9 +3368,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -3606,7 +3610,7 @@
<target state="new"> Distraction-free experience for turbulent times </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -3614,7 +3618,7 @@
<target state="new"> Sneak peek at upcoming functionality </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
@ -4446,7 +4450,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -9114,7 +9118,7 @@
<target state="new">Biometric Authentication</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="8d0f35e084b3902a5b04ee86cfde0d4b991a93af" datatype="html">
@ -9198,7 +9202,7 @@
<target state="new">Export Data</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8298612418414367990" datatype="html">
@ -12562,7 +12566,7 @@
<target state="new">Last All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12833,6 +12837,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="new">50-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="new">200-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -6,7 +6,7 @@
<target state="translated">Le risque de perte en investissant peut être important. Il est déconseillé d&apos;investir de l&apos;argent dont vous pourriez avoir besoin à court terme.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="fbaaeb297e70b9a800acf841b9d26c19d60651ef" datatype="html">
@ -2049,7 +2049,7 @@
<target state="translated">Voulez-vous vraiment supprimer cette méthode de connexion ?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
@ -2163,9 +2163,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="6b939b00e8481ed8aa8a24d8add7a209d7116759" datatype="html">
@ -2173,7 +2177,7 @@
<target state="translated">Paramètres régionaux</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -2181,7 +2185,7 @@
<target state="translated">Format de date et d&apos;heure</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html">
@ -2189,7 +2193,7 @@
<target state="translated">Apparence</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -2197,7 +2201,7 @@
<target state="translated">Auto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -2205,7 +2209,7 @@
<target state="translated">Clair</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -2213,7 +2217,7 @@
<target state="translated">Sombre</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -2221,7 +2225,7 @@
<target state="translated">Mode Zen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -2233,7 +2237,7 @@
<target state="new"> Se connecter avec empreinte </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="03b120b05e0922e5e830c3466fda9ee0bfbf59e9" datatype="html">
@ -2241,7 +2245,7 @@
<target state="translated">Fonctionnalités expérimentales</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -2249,7 +2253,7 @@
<target state="translated">ID d&apos;utilisateur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -3009,7 +3013,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3217,7 +3221,7 @@
<target state="translated">Différence avec le Record Historique</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -3225,7 +3229,7 @@
<target state="translated">par rapport au record historique</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
@ -3605,7 +3609,7 @@
<target state="new"> Expérience sans distraction pour les périodes tumultueuses </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -3613,7 +3617,7 @@
<target state="new"> Avant-première de fonctionnalités futures </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
@ -4445,7 +4449,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -9113,7 +9117,7 @@
<target state="new">Biometric Authentication</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="8d0f35e084b3902a5b04ee86cfde0d4b991a93af" datatype="html">
@ -9197,7 +9201,7 @@
<target state="new">Export Data</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8298612418414367990" datatype="html">
@ -12561,7 +12565,7 @@
<target state="new">Last All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12832,6 +12836,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="new">50-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="new">200-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -23,7 +23,7 @@
<target state="translated">Il rischio di perdita nel trading può essere notevole. Non è consigliabile investire denaro di cui potresti avere bisogno a breve termine.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="b6192ee60a5e0e40874f4d02fbaaa584a0f1541e" datatype="html">
@ -1131,7 +1131,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1786,7 +1786,7 @@
<target state="translated">Vuoi davvero rimuovere questo metodo di accesso?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
@ -1866,7 +1866,7 @@
<target state="translated">Locale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -1874,7 +1874,7 @@
<target state="translated">Formato data e numero</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -1882,7 +1882,7 @@
<target state="translated">Modalità Zen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -1894,7 +1894,7 @@
<target state="new"> Accesso con impronta digitale </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -1902,7 +1902,7 @@
<target state="translated">ID utente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -2662,7 +2662,7 @@
<target state="translated">Variazione rispetto al massimo storico (ATH)</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -2670,7 +2670,7 @@
<target state="translated">dal massimo storico (ATH)</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
@ -3010,7 +3010,7 @@
<target state="translated">Funzionalità sperimentali</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="1931353503905413384" datatype="html">
@ -3058,7 +3058,7 @@
<target state="translated">Aspetto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -3066,7 +3066,7 @@
<target state="translated">Auto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -3074,7 +3074,7 @@
<target state="translated">Chiaro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -3082,7 +3082,7 @@
<target state="translated">Scuro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="112783260724635106" datatype="html">
@ -3368,9 +3368,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -3606,7 +3610,7 @@
<target state="new"> Esperienza priva di distrazioni per i periodi più turbolenti </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -3614,7 +3618,7 @@
<target state="new"> Un&apos;anteprima delle funzionalità in arrivo </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
@ -4446,7 +4450,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -9114,7 +9118,7 @@
<target state="translated">Autenticazione biometrica</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="8d0f35e084b3902a5b04ee86cfde0d4b991a93af" datatype="html">
@ -9198,7 +9202,7 @@
<target state="translated">Esporta dati</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8298612418414367990" datatype="html">
@ -12562,7 +12566,7 @@
<target state="new">Last All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12833,6 +12837,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="new">50-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="new">200-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -22,7 +22,7 @@
<target state="translated">Het risico op verlies bij handelen kan aanzienlijk zijn. Het is niet aan te raden om geld te investeren dat je misschien op korte termijn nodig heeft.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="b6192ee60a5e0e40874f4d02fbaaa584a0f1541e" datatype="html">
@ -1130,7 +1130,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -1785,7 +1785,7 @@
<target state="translated">Wil je deze aanmeldingsmethode echt verwijderen?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
@ -1865,7 +1865,7 @@
<target state="translated">Locatie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -1873,7 +1873,7 @@
<target state="translated">Datum- en getalnotatie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -1881,7 +1881,7 @@
<target state="translated">Zen-modus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -1893,7 +1893,7 @@
<target state="new"> Aanmelden met vingerafdruk </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -1901,7 +1901,7 @@
<target state="translated">Gebruikers-ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -2661,7 +2661,7 @@
<target state="translated">Verandering van All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -2669,7 +2669,7 @@
<target state="translated">van ATH</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
@ -3009,7 +3009,7 @@
<target state="translated">Experimentele functies</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="1931353503905413384" datatype="html">
@ -3057,7 +3057,7 @@
<target state="translated">Weergave</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -3065,7 +3065,7 @@
<target state="translated">Automatisch</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -3073,7 +3073,7 @@
<target state="translated">Licht</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -3081,7 +3081,7 @@
<target state="translated">Donker</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="112783260724635106" datatype="html">
@ -3367,9 +3367,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="064d88bead9e71bd849ecaefd8b38cca8f195a88" datatype="html">
@ -3605,7 +3609,7 @@
<target state="new"> Afleidingsvrije ervaring voor roerige tijden </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -3613,7 +3617,7 @@
<target state="new"> Voorproefje van nieuwe functionaliteit </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
@ -4445,7 +4449,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -9113,7 +9117,7 @@
<target state="translated">Biometrische authenticatie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="8d0f35e084b3902a5b04ee86cfde0d4b991a93af" datatype="html">
@ -9197,7 +9201,7 @@
<target state="translated">Exporteer Data</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8298612418414367990" datatype="html">
@ -12561,7 +12565,7 @@
<target state="new">Last All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12832,6 +12836,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="new">50-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="new">200-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

File diff suppressed because it is too large

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

@ -6,7 +6,7 @@
<target state="translated">O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="fbaaeb297e70b9a800acf841b9d26c19d60651ef" datatype="html">
@ -2033,7 +2033,7 @@
<target state="translated">Deseja realmente remover este método de início de sessão?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92" datatype="html">
@ -2133,7 +2133,7 @@
<target state="translated">Localidade</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -2141,7 +2141,7 @@
<target state="translated">Formato de números e datas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="b5dc65493e3e15fbe15b7d9c17f7626321d82e76" datatype="html">
@ -2149,7 +2149,7 @@
<target state="translated">Modo Zen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -2161,7 +2161,7 @@
<target state="translated">Aparência</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -2169,7 +2169,7 @@
<target state="translated">Auto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -2177,7 +2177,7 @@
<target state="translated">Claro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -2185,7 +2185,7 @@
<target state="translated">Escuro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -2193,7 +2193,7 @@
<target state="new"> Iniciar sessão com impressão digital </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="03b120b05e0922e5e830c3466fda9ee0bfbf59e9" datatype="html">
@ -2201,7 +2201,7 @@
<target state="translated">Funcionalidades Experimentais</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -2209,7 +2209,7 @@
<target state="translated">ID do Utilizador</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -2909,7 +2909,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3097,7 +3097,7 @@
<target state="translated">Diferença desde o Máximo Histórico</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -3105,7 +3105,7 @@
<target state="translated">a partir do ATH (All Time High)</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="ba18e93c4572bfe6d14b2a3f333468b12f890e5d" datatype="html">
@ -3423,9 +3423,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="4798457301875181136" datatype="html">
@ -3605,7 +3609,7 @@
<target state="new"> Experiência sem distrações para tempos turbulentos </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -3613,7 +3617,7 @@
<target state="new"> Acesso antecipado a funcionalidades futuras </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="280c5b1f5b5b748fbbb37bf7a12c37f41539c1ff" datatype="html">
@ -4445,7 +4449,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="4230401090765872563" datatype="html">
@ -9113,7 +9117,7 @@
<target state="new">Biometric Authentication</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="8d0f35e084b3902a5b04ee86cfde0d4b991a93af" datatype="html">
@ -9197,7 +9201,7 @@
<target state="new">Export Data</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8298612418414367990" datatype="html">
@ -12561,7 +12565,7 @@
<target state="new">Last All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12832,6 +12836,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="new">50-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="new">200-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -1300,9 +1300,13 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="2ca05295d27e46c262b233252d1b19c27d95d07f" datatype="html">
@ -1310,7 +1314,7 @@
<target state="translated">Alım satımda kayıp riski büyük boyutta olabilir. Kısa vadede ihtiyaç duyabileceğiniz parayla yatırım yapmak tavsiye edilmez.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="fbaaeb297e70b9a800acf841b9d26c19d60651ef" datatype="html">
@ -3713,7 +3717,7 @@
<target state="new">Zen Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -3749,7 +3753,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">278</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="802222cb4754d74846b18f651b1f94e21576185d" datatype="html">
@ -3757,7 +3761,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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -11413,7 +11417,7 @@
<target state="new">Do you really want to remove this sign in method?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="3c33a66194384cf8c14e25170416767efa56fd98" datatype="html">
@ -11513,7 +11517,7 @@
<target state="new">Locale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
@ -11521,7 +11525,7 @@
<target state="new">Date and number format</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html">
@ -11529,7 +11533,7 @@
<target state="new">Appearance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
@ -11537,7 +11541,7 @@
<target state="new">Auto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
@ -11545,7 +11549,7 @@
<target state="new">Light</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
@ -11553,7 +11557,7 @@
<target state="new">Dark</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
@ -11561,7 +11565,7 @@
<target state="new"> Distraction-free experience for turbulent times </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="fa22693b23a8bed32d787023df105a7b40002f9c" datatype="html">
@ -11569,7 +11573,7 @@
<target state="new">Biometric Authentication</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
@ -11577,7 +11581,7 @@
<target state="new">Sign in with fingerprint</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="03b120b05e0922e5e830c3466fda9ee0bfbf59e9" datatype="html">
@ -11585,7 +11589,7 @@
<target state="new">Experimental Features</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
@ -11593,7 +11597,7 @@
<target state="new"> Sneak peek at upcoming functionality </target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
@ -11601,7 +11605,7 @@
<target state="new">User ID</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
@ -11609,7 +11613,7 @@
<target state="new">Export Data</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -11753,7 +11757,7 @@
<target state="new">Change from All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
@ -11761,7 +11765,7 @@
<target state="new">from ATH</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
@ -12561,7 +12565,7 @@
<target state="new">Last All Time High</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="a3db2898b85fed425f03294b839a98cef247a2dc" datatype="html">
@ -12832,6 +12836,22 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<target state="new">50-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<target state="new">200-Day Trend</target>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

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

@ -1280,16 +1280,20 @@
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">82</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">86</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">259</context>
<context context-type="linenumber">260</context>
</context-group>
</trans-unit>
<trans-unit id="2ca05295d27e46c262b233252d1b19c27d95d07f" datatype="html">
<source>The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/app.component.html</context>
<context context-type="linenumber">174</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="fbaaeb297e70b9a800acf841b9d26c19d60651ef" datatype="html">
@ -3477,7 +3481,7 @@
<source>Zen Mode</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">137</context>
<context context-type="linenumber">141</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/features/features-page.html</context>
@ -3509,14 +3513,14 @@
<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">278</context>
<context context-type="linenumber">279</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">298</context>
<context context-type="linenumber">299</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -11021,7 +11025,7 @@
<source>Do you really want to remove this sign in method?</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.component.ts</context>
<context context-type="linenumber">181</context>
<context context-type="linenumber">182</context>
</context-group>
</trans-unit>
<trans-unit id="3c33a66194384cf8c14e25170416767efa56fd98" datatype="html">
@ -11098,91 +11102,91 @@
<source>Locale</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">91</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="4402006eb2c97591dd8c87a5bd8f721fe9e4dc00" datatype="html">
<source>Date and number format</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="bbe41ac2ea4a6c00ea941a41b33105048f8e9f13" datatype="html">
<source>Appearance</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">114</context>
<context context-type="linenumber">118</context>
</context-group>
</trans-unit>
<trans-unit id="5fb13fb4a8447e59cdf05dc196ade39c02a6f8aa" datatype="html">
<source>Auto</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">126</context>
<context context-type="linenumber">130</context>
</context-group>
</trans-unit>
<trans-unit id="693d14f486a25e86bc515dfcfc4462d5201217ef" datatype="html">
<source>Light</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">127</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="adb4562d2dbd3584370e44496969d58c511ecb63" datatype="html">
<source>Dark</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">128</context>
<context context-type="linenumber">132</context>
</context-group>
</trans-unit>
<trans-unit id="071f26a758dfeaed37626c8758754707c35e3915" datatype="html">
<source> Distraction-free experience for turbulent times </source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">138</context>
<context context-type="linenumber">142</context>
</context-group>
</trans-unit>
<trans-unit id="fa22693b23a8bed32d787023df105a7b40002f9c" datatype="html">
<source>Biometric Authentication</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">154</context>
<context context-type="linenumber">158</context>
</context-group>
</trans-unit>
<trans-unit id="9ae348ee3a7319c2fc4794fa8bc425999d355f8f" datatype="html">
<source>Sign in with fingerprint</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">155</context>
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="03b120b05e0922e5e830c3466fda9ee0bfbf59e9" datatype="html">
<source>Experimental Features</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">172</context>
<context context-type="linenumber">176</context>
</context-group>
</trans-unit>
<trans-unit id="7f44fdbb881db76676fff811a21dc3eadcf11a33" datatype="html">
<source> Sneak peek at upcoming functionality </source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">173</context>
<context context-type="linenumber">177</context>
</context-group>
</trans-unit>
<trans-unit id="83c4d4d764d2e2725ab8e919ec16ac400e1f290a" datatype="html">
<source>User ID</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">192</context>
</context-group>
</trans-unit>
<trans-unit id="35a09ebb1f8ae079a58f2ab952be62e354a51672" datatype="html">
<source>Export Data</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
<context context-type="linenumber">195</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="9021c579c084e68d9db06a569d76f024111c6c54" datatype="html">
@ -11310,14 +11314,14 @@
<source>Change from All Time High</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">31</context>
<context context-type="linenumber">79</context>
</context-group>
</trans-unit>
<trans-unit id="4bbe89749f1580cdca7f9238cb67ba2bd6968126" datatype="html">
<source>from ATH</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">33</context>
<context context-type="linenumber">81</context>
</context-group>
</trans-unit>
<trans-unit id="b74406fd93207c23bb840732ad2760ce0efaa2c5" datatype="html">
@ -11962,7 +11966,7 @@
<source>Last All Time High</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
<context context-type="linenumber">63</context>
</context-group>
</trans-unit>
<trans-unit id="5addbb0c4775966d2aa8eddc530d5b81a4ddad03" datatype="html">
@ -12248,6 +12252,20 @@
<context context-type="linenumber">159</context>
</context-group>
</trans-unit>
<trans-unit id="7cca44e647a4b3a6deff49cd29055e21e245f5ee" datatype="html">
<source>200-Day Trend</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">39</context>
</context-group>
</trans-unit>
<trans-unit id="d762c43328624b5dd81f3c6a3023203ae9a7553f" datatype="html">
<source>50-Day Trend</source>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/benchmark/benchmark.component.html</context>
<context context-type="linenumber">15</context>
</context-group>
</trans-unit>
</body>
</file>
</xliff>

1
libs/common/src/lib/config.ts

@ -101,6 +101,7 @@ export const SUPPORTED_LANGUAGE_CODES = [
'fr',
'it',
'nl',
'pl',
'pt',
'tr'
];

61
libs/common/src/lib/helper.ts

@ -1,5 +1,5 @@
import * as currencies from '@dinero.js/currencies';
import { DataSource } from '@prisma/client';
import { DataSource, MarketData } from '@prisma/client';
import Big from 'big.js';
import {
getDate,
@ -10,11 +10,11 @@ import {
parseISO,
subDays
} from 'date-fns';
import { de, es, fr, it, nl, pt, tr } from 'date-fns/locale';
import { de, es, fr, it, nl, pl, pt, tr } from 'date-fns/locale';
import { ghostfolioScraperApiSymbolPrefix, locale } from './config';
import { Benchmark, UniqueAsset } from './interfaces';
import { ColorScheme } from './types';
import { BenchmarkTrend, ColorScheme } from './types';
export const DATE_FORMAT = 'yyyy-MM-dd';
export const DATE_FORMAT_MONTHLY = 'MMMM yyyy';
@ -22,6 +22,59 @@ export const DATE_FORMAT_YEARLY = 'yyyy';
const NUMERIC_REGEXP = /[-]{0,1}[\d]*[.,]{0,1}[\d]+/g;
export function calculateBenchmarkTrend({
days,
historicalData
}: {
days: number;
historicalData: MarketData[];
}): BenchmarkTrend {
const hasEnoughData = historicalData.length >= 2 * days;
if (!hasEnoughData) {
return 'UNKNOWN';
}
const recentPeriodAverage = calculateMovingAverage({
days,
prices: historicalData.slice(0, days).map(({ marketPrice }) => {
return new Big(marketPrice);
})
});
const pastPeriodAverage = calculateMovingAverage({
days,
prices: historicalData.slice(days, 2 * days).map(({ marketPrice }) => {
return new Big(marketPrice);
})
});
if (recentPeriodAverage > pastPeriodAverage) {
return 'UP';
}
if (recentPeriodAverage < pastPeriodAverage) {
return 'DOWN';
}
return 'NEUTRAL';
}
export function calculateMovingAverage({
days,
prices
}: {
days: number;
prices: Big[];
}) {
return prices
.reduce((previous, current) => {
return previous.add(current);
}, new Big(0))
.div(days)
.toNumber();
}
export function capitalize(aString: string) {
return aString.charAt(0).toUpperCase() + aString.slice(1).toLowerCase();
}
@ -106,6 +159,8 @@ export function getDateFnsLocale(aLanguageCode: string) {
return it;
} else if (aLanguageCode === 'nl') {
return nl;
} else if (aLanguageCode === 'pl') {
return pl;
} else if (aLanguageCode === 'pt') {
return pt;
} else if (aLanguageCode === 'tr') {

1
libs/common/src/lib/interfaces/benchmark-property.interface.ts

@ -1,3 +1,4 @@
export interface BenchmarkProperty {
enableSharing?: boolean;
symbolProfileId: string;
}

4
libs/common/src/lib/interfaces/benchmark.interface.ts

@ -1,3 +1,5 @@
import { BenchmarkTrend } from '@ghostfolio/common/types/';
import { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface';
export interface Benchmark {
@ -9,4 +11,6 @@ export interface Benchmark {
performancePercent: number;
};
};
trend50d: BenchmarkTrend;
trend200d: BenchmarkTrend;
}

1
libs/common/src/lib/types/benchmark-trend.type.ts

@ -0,0 +1 @@
export type BenchmarkTrend = 'DOWN' | 'NEUTRAL' | 'UNKNOWN' | 'UP';

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

@ -1,6 +1,7 @@
import type { AccessWithGranteeUser } from './access-with-grantee-user.type';
import type { AccountWithPlatform } from './account-with-platform.type';
import type { AccountWithValue } from './account-with-value.type';
import type { BenchmarkTrend } from './benchmark-trend.type';
import type { ColorScheme } from './color-scheme.type';
import type { DateRange } from './date-range.type';
import type { Granularity } from './granularity.type';
@ -20,6 +21,7 @@ export type {
AccessWithGranteeUser,
AccountWithPlatform,
AccountWithValue,
BenchmarkTrend,
ColorScheme,
DateRange,
Granularity,

53
libs/ui/src/lib/benchmark/benchmark.component.html

@ -6,6 +6,54 @@
</td>
</ng-container>
<ng-container matColumnDef="trend50d">
<th
*matHeaderCellDef
class="d-none d-lg-table-cell px-2 text-right"
mat-header-cell
>
<ng-container i18n>50-Day Trend</ng-container>
</th>
<td *matCellDef="let element" class="d-none d-lg-table-cell px-2" mat-cell>
<div class="d-flex justify-content-end">
<gf-trend-indicator
*ngIf="element?.trend50d !== 'UNKNOWN'"
[value]="
element?.trend50d === 'UP'
? 0.001
: element?.trend50d === 'DOWN'
? -0.001
: 0
"
/>
</div>
</td>
</ng-container>
<ng-container matColumnDef="trend200d">
<th
*matHeaderCellDef
class="d-none d-lg-table-cell px-2 text-right"
mat-header-cell
>
<ng-container i18n>200-Day Trend</ng-container>
</th>
<td *matCellDef="let element" class="d-none d-lg-table-cell px-2" mat-cell>
<div class="d-flex justify-content-end">
<gf-trend-indicator
*ngIf="element?.trend200d !== 'UNKNOWN'"
[value]="
element?.trend200d === 'UP'
? 0.001
: element?.trend200d === 'DOWN'
? -0.001
: 0
"
/>
</div>
</td>
</ng-container>
<ng-container matColumnDef="date">
<th
*matHeaderCellDef
@ -20,7 +68,7 @@
[isDate]="true"
[locale]="locale"
[value]="element?.performances?.allTimeHigh?.date"
></gf-value>
/>
</div>
</td>
</ng-container>
@ -35,7 +83,6 @@
<td *matCellDef="let element" class="px-2 text-right" mat-cell>
<gf-value
class="d-inline-block justify-content-end"
size="medium"
[isPercent]="true"
[locale]="locale"
[ngClass]="{
@ -45,7 +92,7 @@
element?.performances?.allTimeHigh?.performancePercent > 0
}"
[value]="element?.performances?.allTimeHigh?.performancePercent"
></gf-value>
/>
</td>
</ng-container>

15
libs/ui/src/lib/benchmark/benchmark.component.ts

@ -4,9 +4,8 @@ import {
Input,
OnChanges
} from '@angular/core';
import { locale } from '@ghostfolio/common/config';
import { resolveMarketCondition } from '@ghostfolio/common/helper';
import { Benchmark } from '@ghostfolio/common/interfaces';
import { Benchmark, User } from '@ghostfolio/common/interfaces';
@Component({
selector: 'gf-benchmark',
@ -17,6 +16,7 @@ import { Benchmark } from '@ghostfolio/common/interfaces';
export class BenchmarkComponent implements OnChanges {
@Input() benchmarks: Benchmark[];
@Input() locale: string;
@Input() user: User;
public displayedColumns = ['name', 'date', 'change', 'marketCondition'];
public resolveMarketCondition = resolveMarketCondition;
@ -24,8 +24,15 @@ export class BenchmarkComponent implements OnChanges {
public constructor() {}
public ngOnChanges() {
if (!this.locale) {
this.locale = locale;
if (this.user?.settings?.isExperimentalFeatures) {
this.displayedColumns = [
'name',
'trend50d',
'trend200d',
'date',
'change',
'marketCondition'
];
}
}
}

2
libs/ui/src/lib/benchmark/benchmark.module.ts

@ -3,6 +3,7 @@ import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { MatTableModule } from '@angular/material/table';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { GfTrendIndicatorModule } from '../trend-indicator';
import { GfValueModule } from '../value';
import { BenchmarkComponent } from './benchmark.component';
@ -11,6 +12,7 @@ import { BenchmarkComponent } from './benchmark.component';
exports: [BenchmarkComponent],
imports: [
CommonModule,
GfTrendIndicatorModule,
GfValueModule,
MatTableModule,
NgxSkeletonLoaderModule

10
libs/ui/src/lib/trend-indicator/trend-indicator.component.html

@ -13,7 +13,7 @@
*ngIf="marketState === 'closed' && range === '1d'; else delayed"
class="text-muted"
name="pause-circle-outline"
size="large"
[size]="size"
>
</ion-icon>
<ng-template #delayed>
@ -21,7 +21,7 @@
*ngIf="marketState === 'delayed' && range === '1d'; else trend"
class="text-muted"
name="time-outline"
size="large"
[size]="size"
>
</ion-icon>
</ng-template>
@ -31,21 +31,21 @@
*ngIf="value <= -0.0005"
class="text-danger"
name="arrow-down-circle-outline"
size="large"
[ngClass]="{ 'rotate-45-down': value > -0.01 }"
[size]="size"
></ion-icon>
<ion-icon
*ngIf="value > -0.0005 && value < 0.0005"
class="text-muted"
name="arrow-forward-circle-outline"
size="large"
[size]="size"
></ion-icon>
<ion-icon
*ngIf="value >= 0.0005"
class="text-success"
name="arrow-up-circle-outline"
size="large"
[ngClass]="{ 'rotate-45-up': value < 0.01 }"
[size]="size"
></ion-icon>
</ng-container>
</ng-template>

1
libs/ui/src/lib/trend-indicator/trend-indicator.component.ts

@ -11,6 +11,7 @@ export class TrendIndicatorComponent {
@Input() isLoading = false;
@Input() marketState: MarketState = 'open';
@Input() range: DateRange = 'max';
@Input() size: 'large' | 'medium' | 'small' = 'small';
@Input() value = 0;
public constructor() {}

8
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "2.22.0",
"version": "2.24.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -109,7 +109,7 @@
"google-spreadsheet": "3.2.0",
"got": "11.8.6",
"helmet": "7.0.0",
"http-status-codes": "2.2.0",
"http-status-codes": "2.3.0",
"ionicons": "7.1.0",
"lodash": "4.17.21",
"marked": "4.2.12",
@ -178,7 +178,7 @@
"codelyzer": "6.0.1",
"cypress": "6.2.1",
"eslint": "8.33.0",
"eslint-config-prettier": "8.6.0",
"eslint-config-prettier": "9.0.0",
"eslint-plugin-cypress": "2.14.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-storybook": "0.6.12",
@ -189,7 +189,7 @@
"jest-environment-jsdom": "29.4.3",
"jest-preset-angular": "13.1.1",
"nx": "17.0.2",
"prettier": "3.0.3",
"prettier": "3.1.0",
"prettier-plugin-organize-attributes": "1.0.0",
"react": "18.2.0",
"react-dom": "18.2.0",

2
test/import/invalid-currency.csv

@ -1,2 +1,2 @@
Date,Code,Currency,Price,Quantity,Action,Fee
12/12/2021,BTC,<invalid>,44558.42,1,buy,0
12/12/2021,BTCUSD,<invalid>,44558.42,1,buy,0

1 Date Code Currency Price Quantity Action Fee
2 12/12/2021 BTC BTCUSD <invalid> 44558.42 1 buy 0

24
yarn.lock

@ -10219,10 +10219,10 @@ escodegen@^2.0.0:
optionalDependencies:
source-map "~0.6.1"
eslint-config-prettier@8.6.0:
version "8.6.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207"
integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==
eslint-config-prettier@9.0.0:
version "9.0.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f"
integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==
eslint-import-resolver-node@^0.3.7:
version "0.3.9"
@ -11966,10 +11966,10 @@ http-signature@~1.3.6:
jsprim "^2.0.2"
sshpk "^1.14.1"
http-status-codes@2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.2.0.tgz#bb2efe63d941dfc2be18e15f703da525169622be"
integrity sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==
http-status-codes@2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-2.3.0.tgz#987fefb28c69f92a43aecc77feec2866349a8bfc"
integrity sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==
http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3"
@ -15906,10 +15906,10 @@ prettier-plugin-organize-attributes@1.0.0:
resolved "https://registry.yarnpkg.com/prettier-plugin-organize-attributes/-/prettier-plugin-organize-attributes-1.0.0.tgz#037870ee3111b3c1d6371f677b64888de353cc63"
integrity sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg==
prettier@3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643"
integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==
prettier@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e"
integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==
prettier@^2.8.0:
version "2.8.8"

Loading…
Cancel
Save