From f882e3ddf4e0b0e96f2faeec6f3da6db0b893aae Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 28 May 2026 17:35:45 +0200 Subject: [PATCH 01/37] Task/add HTTP fetch service (#6951) * Add HTTP fetch service * Update changelog --- CHANGELOG.md | 4 + apps/api/src/app/auth/auth.module.ts | 10 +- .../ghostfolio/ghostfolio.module.ts | 2 + .../ghostfolio/ghostfolio.service.ts | 3 + apps/api/src/app/logo/logo.module.ts | 2 + apps/api/src/app/logo/logo.service.ts | 22 ++- .../coingecko/coingecko.service.ts | 52 +++--- .../data-enhancer/data-enhancer.module.ts | 3 +- .../openfigi/openfigi.service.ts | 13 +- .../trackinsight/trackinsight.service.ts | 43 +++-- .../data-provider/data-provider.module.ts | 2 + .../eod-historical-data.service.ts | 43 ++--- .../financial-modeling-prep.service.ts | 175 ++++++++++-------- .../ghostfolio/ghostfolio.service.ts | 12 +- .../data-provider/manual/manual.service.ts | 4 +- .../rapid-api/rapid-api.service.ts | 13 +- apps/api/src/services/fetch/fetch.module.ts | 9 + apps/api/src/services/fetch/fetch.service.ts | 63 +++++++ .../statistics-gathering.module.ts | 2 + .../statistics-gathering.processor.ts | 66 +++---- 20 files changed, 343 insertions(+), 200 deletions(-) create mode 100644 apps/api/src/services/fetch/fetch.module.ts create mode 100644 apps/api/src/services/fetch/fetch.service.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 87da5e0bd..8333f2f72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added the `FetchService` to centralize outbound HTTP requests + ### Changed - Upgraded `nestjs` from version `11.1.19` to `11.1.21` diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index 9fc5d0925..f55093bbf 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -5,6 +5,8 @@ import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { ApiKeyService } from '@ghostfolio/api/services/api-key/api-key.service'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; @@ -23,6 +25,7 @@ import { OidcStrategy } from './oidc.strategy'; controllers: [AuthController], imports: [ ConfigurationModule, + FetchModule, JwtModule.register({ secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '180 days' } @@ -40,11 +43,12 @@ import { OidcStrategy } from './oidc.strategy'; GoogleStrategy, JwtStrategy, { - inject: [AuthService, ConfigurationService], + inject: [AuthService, ConfigurationService, FetchService], provide: OidcStrategy, useFactory: async ( authService: AuthService, - configurationService: ConfigurationService + configurationService: ConfigurationService, + fetchService: FetchService ) => { const isOidcEnabled = configurationService.get( 'ENABLE_FEATURE_AUTH_OIDC' @@ -81,7 +85,7 @@ import { OidcStrategy } from './oidc.strategy'; } else { // Fetch OIDC configuration from discovery endpoint try { - const response = await fetch( + const response = await fetchService.fetch( `${issuer}/.well-known/openid-configuration` ); diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts index 01691bcf4..484f30ee3 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.module.ts @@ -12,6 +12,7 @@ import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/goog import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { RapidApiService } from '@ghostfolio/api/services/data-provider/rapid-api/rapid-api.service'; import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service'; +import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; @@ -27,6 +28,7 @@ import { GhostfolioService } from './ghostfolio.service'; imports: [ CryptocurrencyModule, DataProviderModule, + FetchModule, MarketDataModule, PrismaModule, PropertyModule, diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index d088bf3ac..3f91dbecc 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -8,6 +8,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { @@ -36,6 +37,7 @@ export class GhostfolioService { public constructor( private readonly configurationService: ConfigurationService, private readonly dataProviderService: DataProviderService, + private readonly fetchService: FetchService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService ) {} @@ -355,6 +357,7 @@ export class GhostfolioService { private getDataProviderInfo(): DataProviderInfo { const ghostfolioDataProviderService = new GhostfolioDataProviderService( this.configurationService, + this.fetchService, this.propertyService ); diff --git a/apps/api/src/app/logo/logo.module.ts b/apps/api/src/app/logo/logo.module.ts index 1f59df1c8..8eede126a 100644 --- a/apps/api/src/app/logo/logo.module.ts +++ b/apps/api/src/app/logo/logo.module.ts @@ -1,5 +1,6 @@ import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; import { Module } from '@nestjs/common'; @@ -11,6 +12,7 @@ import { LogoService } from './logo.service'; controllers: [LogoController], imports: [ ConfigurationModule, + FetchModule, SymbolProfileModule, TransformDataSourceInRequestModule ], diff --git a/apps/api/src/app/logo/logo.service.ts b/apps/api/src/app/logo/logo.service.ts index ba1acdd29..551d62438 100644 --- a/apps/api/src/app/logo/logo.service.ts +++ b/apps/api/src/app/logo/logo.service.ts @@ -1,4 +1,5 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; @@ -10,6 +11,7 @@ import { StatusCodes, getReasonPhrase } from 'http-status-codes'; export class LogoService { public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -43,15 +45,17 @@ export class LogoService { } private async getBuffer(aUrl: string) { - const blob = await fetch( - `https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${aUrl}&size=64`, - { - headers: { 'User-Agent': 'request' }, - signal: AbortSignal.timeout( - this.configurationService.get('REQUEST_TIMEOUT') - ) - } - ).then((res) => res.blob()); + const blob = await this.fetchService + .fetch( + `https://t0.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=${aUrl}&size=64`, + { + headers: { 'User-Agent': 'request' }, + signal: AbortSignal.timeout( + this.configurationService.get('REQUEST_TIMEOUT') + ) + } + ) + .then((res) => res.blob()); return { buffer: await blob.arrayBuffer().then((arrayBuffer) => { diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index d5ed69d06..b01ba177b 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -7,6 +7,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { @@ -32,7 +33,8 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { private headers: HeadersInit = {}; public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public onModuleInit() { @@ -67,12 +69,14 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { }; try { - const { name } = await fetch(`${this.apiUrl}/coins/${symbol}`, { - headers: this.headers, - signal: AbortSignal.timeout( - this.configurationService.get('REQUEST_TIMEOUT') - ) - }).then((res) => res.json()); + const { name } = await this.fetchService + .fetch(`${this.apiUrl}/coins/${symbol}`, { + headers: this.headers, + signal: AbortSignal.timeout( + this.configurationService.get('REQUEST_TIMEOUT') + ) + }) + .then((res) => res.json()); response.name = name; } catch (error) { @@ -118,13 +122,15 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { vs_currency: DEFAULT_CURRENCY.toLowerCase() }); - const { error, prices, status } = await fetch( - `${this.apiUrl}/coins/${symbol}/market_chart/range?${queryParams.toString()}`, - { - headers: this.headers, - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const { error, prices, status } = await this.fetchService + .fetch( + `${this.apiUrl}/coins/${symbol}/market_chart/range?${queryParams.toString()}`, + { + headers: this.headers, + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); if (error?.status) { throw new Error(error.status.error_message); @@ -181,13 +187,12 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { vs_currencies: DEFAULT_CURRENCY.toLowerCase() }); - const quotes = await fetch( - `${this.apiUrl}/simple/price?${queryParams.toString()}`, - { + const quotes = await this.fetchService + .fetch(`${this.apiUrl}/simple/price?${queryParams.toString()}`, { headers: this.headers, signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + }) + .then((res) => res.json()); for (const symbol in quotes) { response[symbol] = { @@ -230,13 +235,12 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { query }); - const { coins } = await fetch( - `${this.apiUrl}/search?${queryParams.toString()}`, - { + const { coins } = await this.fetchService + .fetch(`${this.apiUrl}/search?${queryParams.toString()}`, { headers: this.headers, signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + }) + .then((res) => res.json()); items = coins.map(({ id: symbol, name }) => { return { diff --git a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts index cadf8cf1d..ecad9a673 100644 --- a/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts +++ b/apps/api/src/services/data-provider/data-enhancer/data-enhancer.module.ts @@ -3,6 +3,7 @@ import { CryptocurrencyModule } from '@ghostfolio/api/services/cryptocurrency/cr import { OpenFigiDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/openfigi/openfigi.service'; import { TrackinsightDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/trackinsight/trackinsight.service'; import { YahooFinanceDataEnhancerService } from '@ghostfolio/api/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service'; +import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { Module } from '@nestjs/common'; @@ -16,7 +17,7 @@ import { DataEnhancerService } from './data-enhancer.service'; YahooFinanceDataEnhancerService, 'DataEnhancers' ], - imports: [ConfigurationModule, CryptocurrencyModule], + imports: [ConfigurationModule, CryptocurrencyModule, FetchModule], providers: [ DataEnhancerService, OpenFigiDataEnhancerService, diff --git a/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts b/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts index bb9d0606c..1f5bb74b4 100644 --- a/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/openfigi/openfigi.service.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { parseSymbol } from '@ghostfolio/common/helper'; import { Injectable } from '@nestjs/common'; @@ -10,7 +11,8 @@ export class OpenFigiDataEnhancerService implements DataEnhancerInterface { private static baseUrl = 'https://api.openfigi.com'; public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public async enhance({ @@ -42,9 +44,8 @@ export class OpenFigiDataEnhancerService implements DataEnhancerInterface { this.configurationService.get('API_KEY_OPEN_FIGI'); } - const mappings = (await fetch( - `${OpenFigiDataEnhancerService.baseUrl}/v3/mapping`, - { + const mappings = (await this.fetchService + .fetch(`${OpenFigiDataEnhancerService.baseUrl}/v3/mapping`, { body: JSON.stringify([ { exchCode: exchange, idType: 'TICKER', idValue: ticker } ]), @@ -54,8 +55,8 @@ export class OpenFigiDataEnhancerService implements DataEnhancerInterface { }, method: 'POST', signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json())) as any[]; + }) + .then((res) => res.json())) as any[]; if (mappings?.length === 1 && mappings[0].data?.length === 1) { const { compositeFIGI, figi, shareClassFIGI } = mappings[0].data[0]; diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index 1e297b93b..54627f312 100644 --- a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -1,5 +1,6 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { Holding } from '@ghostfolio/common/interfaces'; import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; @@ -23,7 +24,8 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { }; public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public async enhance({ @@ -60,12 +62,13 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { return response; } - const profile = await fetch( - `${TrackinsightDataEnhancerService.baseUrl}/funds/${trackinsightSymbol}.json`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ) + const profile = await this.fetchService + .fetch( + `${TrackinsightDataEnhancerService.baseUrl}/funds/${trackinsightSymbol}.json`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) .then((res) => res.json()) .catch(() => { return {}; @@ -83,12 +86,13 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { response.isin = isin; } - const holdings = await fetch( - `${TrackinsightDataEnhancerService.baseUrl}/holdings/${trackinsightSymbol}.json`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ) + const holdings = await this.fetchService + .fetch( + `${TrackinsightDataEnhancerService.baseUrl}/holdings/${trackinsightSymbol}.json`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) .then((res) => res.json()) .catch(() => { return {}; @@ -182,12 +186,13 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { requestTimeout: number; symbol: string; }) { - return fetch( - `https://www.trackinsight.com/search-api/search_v2/${symbol}/_/ticker/default/0/3`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ) + return this.fetchService + .fetch( + `https://www.trackinsight.com/search-api/search_v2/${symbol}/_/ticker/default/0/3`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) .then((res) => res.json()) .then((jsonRes) => { if ( diff --git a/apps/api/src/services/data-provider/data-provider.module.ts b/apps/api/src/services/data-provider/data-provider.module.ts index 71b54f01e..2c6e9fce1 100644 --- a/apps/api/src/services/data-provider/data-provider.module.ts +++ b/apps/api/src/services/data-provider/data-provider.module.ts @@ -10,6 +10,7 @@ import { GoogleSheetsService } from '@ghostfolio/api/services/data-provider/goog import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { RapidApiService } from '@ghostfolio/api/services/data-provider/rapid-api/rapid-api.service'; import { YahooFinanceService } from '@ghostfolio/api/services/data-provider/yahoo-finance/yahoo-finance.service'; +import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; @@ -26,6 +27,7 @@ import { DataProviderService } from './data-provider.service'; ConfigurationModule, CryptocurrencyModule, DataEnhancerModule, + FetchModule, MarketDataModule, PrismaModule, PropertyModule, diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 8c718108c..3fa38842b 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -7,6 +7,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { DEFAULT_CURRENCY, @@ -41,6 +42,7 @@ export class EodHistoricalDataService public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -111,12 +113,11 @@ export class EodHistoricalDataService [date: string]: DataProviderHistoricalResponse; } = {}; - const historicalResult = await fetch( - `${this.URL}/div/${symbol}?${queryParams.toString()}`, - { + const historicalResult = await this.fetchService + .fetch(`${this.URL}/div/${symbol}?${queryParams.toString()}`, { signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + }) + .then((res) => res.json()); for (const { date, value } of historicalResult) { response[date] = { @@ -158,12 +159,11 @@ export class EodHistoricalDataService to: format(to, DATE_FORMAT) }); - const response = await fetch( - `${this.URL}/eod/${symbol}?${queryParams.toString()}`, - { + const response = await this.fetchService + .fetch(`${this.URL}/eod/${symbol}?${queryParams.toString()}`, { signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + }) + .then((res) => res.json()); return response.reduce( (result, { adjusted_close, date }) => { @@ -223,12 +223,14 @@ export class EodHistoricalDataService s: eodHistoricalDataSymbols.join(',') }); - const realTimeResponse = await fetch( - `${this.URL}/real-time/${eodHistoricalDataSymbols[0]}?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const realTimeResponse = await this.fetchService + .fetch( + `${this.URL}/real-time/${eodHistoricalDataSymbols[0]}?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); const quotes: { close: number; @@ -430,12 +432,11 @@ export class EodHistoricalDataService api_token: this.apiKey }); - const response = await fetch( - `${this.URL}/search/${query}?${queryParams.toString()}`, - { + const response = await this.fetchService + .fetch(`${this.URL}/search/${query}?${queryParams.toString()}`, { signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + }) + .then((res) => res.json()); searchResult = response.map( ({ Code, Currency, Exchange, ISIN: isin, Name: name, Type }) => { diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index d9a43fc50..fa36a0d17 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -9,6 +9,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DEFAULT_CURRENCY, @@ -59,6 +60,7 @@ export class FinancialModelingPrepService public constructor( private readonly configurationService: ConfigurationService, private readonly cryptocurrencyService: CryptocurrencyService, + private readonly fetchService: FetchService, private readonly prismaService: PrismaService ) {} @@ -96,12 +98,14 @@ export class FinancialModelingPrepService apikey: this.apiKey }); - const [quote] = await fetch( - `${this.getUrl({ version: 'stable' })}/quote?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const [quote] = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/quote?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); response.assetClass = AssetClass.LIQUIDITY; response.assetSubClass = AssetSubClass.CRYPTOCURRENCY; @@ -115,12 +119,14 @@ export class FinancialModelingPrepService apikey: this.apiKey }); - const [assetProfile] = await fetch( - `${this.getUrl({ version: 'stable' })}/profile?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const [assetProfile] = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/profile?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); if (!assetProfile) { throw new AssetProfileDelistedError( @@ -143,12 +149,14 @@ export class FinancialModelingPrepService apikey: this.apiKey }); - const etfCountryWeightings = await fetch( - `${this.getUrl({ version: 'stable' })}/etf/country-weightings?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const etfCountryWeightings = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/etf/country-weightings?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); response.countries = etfCountryWeightings .filter(({ country: countryName }) => { @@ -174,12 +182,14 @@ export class FinancialModelingPrepService }; }); - const etfHoldings = await fetch( - `${this.getUrl({ version: 'stable' })}/etf/holdings?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const etfHoldings = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/etf/holdings?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); const sortedTopHoldings = etfHoldings .sort((a, b) => { @@ -193,23 +203,27 @@ export class FinancialModelingPrepService } ); - const [etfInformation] = await fetch( - `${this.getUrl({ version: 'stable' })}/etf/info?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const [etfInformation] = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/etf/info?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); if (etfInformation?.website) { response.url = etfInformation.website; } - const etfSectorWeightings = await fetch( - `${this.getUrl({ version: 'stable' })}/etf/sector-weightings?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const etfSectorWeightings = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/etf/sector-weightings?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); response.sectors = etfSectorWeightings.map( ({ sector, weightPercentage }) => { @@ -286,12 +300,14 @@ export class FinancialModelingPrepService [date: string]: DataProviderHistoricalResponse; } = {}; - const dividends = await fetch( - `${this.getUrl({ version: 'stable' })}/dividends?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const dividends = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/dividends?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); dividends .filter(({ date }) => { @@ -354,12 +370,14 @@ export class FinancialModelingPrepService to: format(currentTo, DATE_FORMAT) }); - const historical = await fetch( - `${this.getUrl({ version: 'stable' })}/historical-price-eod/full?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const historical = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/historical-price-eod/full?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); for (const { close, date } of historical) { if ( @@ -422,14 +440,17 @@ export class FinancialModelingPrepService symbolTarget: { in: symbols } } }), - fetch( - `${this.getUrl({ version: 'stable' })}/batch-quote-short?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then( - (res) => res.json() as unknown as { price: number; symbol: string }[] - ) + this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/batch-quote-short?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then( + (res) => + res.json() as unknown as { price: number; symbol: string }[] + ) ]); for (const { currency, symbolTarget } of assetProfileResolutions) { @@ -525,12 +546,14 @@ export class FinancialModelingPrepService isin: query.toUpperCase() }); - const result = await fetch( - `${this.getUrl({ version: 'stable' })}/search-isin?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()); + const result = await this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/search-isin?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()); await Promise.all( result.map(({ symbol }) => { @@ -558,18 +581,22 @@ export class FinancialModelingPrepService }); const [nameResults, symbolResults] = await Promise.all([ - fetch( - `${this.getUrl({ version: 'stable' })}/search-name?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()), - fetch( - `${this.getUrl({ version: 'stable' })}/search-symbol?${queryParams.toString()}`, - { - signal: AbortSignal.timeout(requestTimeout) - } - ).then((res) => res.json()) + this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/search-name?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()), + this.fetchService + .fetch( + `${this.getUrl({ version: 'stable' })}/search-symbol?${queryParams.toString()}`, + { + signal: AbortSignal.timeout(requestTimeout) + } + ) + .then((res) => res.json()) ]); const result = uniqBy( diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 2b49e89c2..2f2601d5d 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -8,6 +8,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { HEADER_KEY_TOKEN, @@ -38,6 +39,7 @@ export class GhostfolioService implements DataProviderInterface { public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly propertyService: PropertyService ) {} @@ -52,7 +54,7 @@ export class GhostfolioService implements DataProviderInterface { let assetProfile: DataProviderGhostfolioAssetProfileResponse; try { - const response = await fetch( + const response = await this.fetchService.fetch( `${this.URL}/v1/data-providers/ghostfolio/asset-profile/${symbol}`, { headers: await this.getRequestHeaders(), @@ -122,7 +124,7 @@ export class GhostfolioService implements DataProviderInterface { to: format(to, DATE_FORMAT) }); - const response = await fetch( + const response = await this.fetchService.fetch( `${this.URL}/v2/data-providers/ghostfolio/dividends/${symbol}?${queryParams.toString()}`, { headers: await this.getRequestHeaders(), @@ -174,7 +176,7 @@ export class GhostfolioService implements DataProviderInterface { to: format(to, DATE_FORMAT) }); - const response = await fetch( + const response = await this.fetchService.fetch( `${this.URL}/v2/data-providers/ghostfolio/historical/${symbol}?${queryParams.toString()}`, { headers: await this.getRequestHeaders(), @@ -245,7 +247,7 @@ export class GhostfolioService implements DataProviderInterface { symbols: symbols.join(',') }); - const response = await fetch( + const response = await this.fetchService.fetch( `${this.URL}/v2/data-providers/ghostfolio/quotes?${queryParams.toString()}`, { headers: await this.getRequestHeaders(), @@ -302,7 +304,7 @@ export class GhostfolioService implements DataProviderInterface { query }); - const response = await fetch( + const response = await this.fetchService.fetch( `${this.URL}/v2/data-providers/ghostfolio/lookup?${queryParams.toString()}`, { headers: await this.getRequestHeaders(), diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 51e65e631..11e0aae6a 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -8,6 +8,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { @@ -32,6 +33,7 @@ import { addDays, format, isBefore } from 'date-fns'; export class ManualService implements DataProviderInterface { public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly prismaService: PrismaService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -292,7 +294,7 @@ export class ManualService implements DataProviderInterface { }): Promise { let locale = scraperConfiguration.locale; - const response = await fetch(scraperConfiguration.url, { + const response = await this.fetchService.fetch(scraperConfiguration.url, { headers: scraperConfiguration.headers as HeadersInit, signal: AbortSignal.timeout( this.configurationService.get('REQUEST_TIMEOUT') diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index d6bc8d0e4..22896cccc 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -7,6 +7,7 @@ import { GetQuotesParams, GetSearchParams } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { ghostfolioFearAndGreedIndexSymbol, ghostfolioFearAndGreedIndexSymbolStocks @@ -26,7 +27,8 @@ import { format } from 'date-fns'; @Injectable() export class RapidApiService implements DataProviderInterface { public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public canHandle() { @@ -142,9 +144,8 @@ export class RapidApiService implements DataProviderInterface { oneYearAgo: { value: number; valueText: string }; }> { try { - const { fgi } = await fetch( - `https://fear-and-greed-index.p.rapidapi.com/v1/fgi`, - { + const { fgi } = await this.fetchService + .fetch(`https://fear-and-greed-index.p.rapidapi.com/v1/fgi`, { headers: { useQueryString: 'true', 'x-rapidapi-host': 'fear-and-greed-index.p.rapidapi.com', @@ -153,8 +154,8 @@ export class RapidApiService implements DataProviderInterface { signal: AbortSignal.timeout( this.configurationService.get('REQUEST_TIMEOUT') ) - } - ).then((res) => res.json()); + }) + .then((res) => res.json()); return fgi; } catch (error) { diff --git a/apps/api/src/services/fetch/fetch.module.ts b/apps/api/src/services/fetch/fetch.module.ts new file mode 100644 index 000000000..f98f2f45c --- /dev/null +++ b/apps/api/src/services/fetch/fetch.module.ts @@ -0,0 +1,9 @@ +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; + +import { Module } from '@nestjs/common'; + +@Module({ + exports: [FetchService], + providers: [FetchService] +}) +export class FetchModule {} diff --git a/apps/api/src/services/fetch/fetch.service.ts b/apps/api/src/services/fetch/fetch.service.ts new file mode 100644 index 000000000..b3bd022d9 --- /dev/null +++ b/apps/api/src/services/fetch/fetch.service.ts @@ -0,0 +1,63 @@ +import { redactPaths } from '@ghostfolio/api/helper/object.helper'; + +import { Injectable, Logger } from '@nestjs/common'; + +@Injectable() +export class FetchService { + private static readonly REDACTED_QUERY_PARAM_NAMES = ['apikey', 'api_token']; + + public async fetch( + input: RequestInfo | URL, + init?: RequestInit + ): Promise { + const method = ( + init?.method ?? + (input instanceof Request ? input.method : undefined) ?? + 'GET' + ).toUpperCase(); + + const url = input instanceof Request ? input.url : input.toString(); + const urlRedacted = this.redactUrl(url); + + Logger.debug(`${method} ${urlRedacted}`, 'FetchService'); + + try { + return await globalThis.fetch(input, init); + } catch (error) { + if (error instanceof Error) { + Logger.error( + `${method} ${urlRedacted} failed: [${error.name}] ${error.message}`, + 'FetchService' + ); + } else { + Logger.error( + `${method} ${urlRedacted} failed: ${String(error)}`, + 'FetchService' + ); + } + + throw error; + } + } + + private redactUrl(rawUrl: string): string { + try { + const url = new URL(rawUrl); + + const redacted = redactPaths({ + object: Object.fromEntries(url.searchParams), + paths: FetchService.REDACTED_QUERY_PARAM_NAMES + }); + + for (const [key, value] of Object.entries(redacted)) { + if (value === null) { + url.searchParams.set(key, '*******'); + } + } + + return url.toString(); + } catch { + return rawUrl; + } + } +} diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.module.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.module.ts index 60b963c69..d6f6d5ccd 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.module.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.module.ts @@ -1,4 +1,5 @@ import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; +import { FetchModule } from '@ghostfolio/api/services/fetch/fetch.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { STATISTICS_GATHERING_QUEUE } from '@ghostfolio/common/config'; @@ -29,6 +30,7 @@ import { StatisticsGatheringService } from './statistics-gathering.service'; name: STATISTICS_GATHERING_QUEUE }), ConfigurationModule, + FetchModule, PropertyModule ], providers: [StatisticsGatheringProcessor, StatisticsGatheringService] diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts index 1312d49ea..a523ef4f2 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts @@ -1,4 +1,5 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME, @@ -28,6 +29,7 @@ import { format, subDays } from 'date-fns'; export class StatisticsGatheringProcessor { public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly propertyService: PropertyService ) {} @@ -126,15 +128,14 @@ export class StatisticsGatheringProcessor { private async countDockerHubPulls(): Promise { try { - const { pull_count } = (await fetch( - 'https://hub.docker.com/v2/repositories/ghostfolio/ghostfolio', - { + const { pull_count } = (await this.fetchService + .fetch('https://hub.docker.com/v2/repositories/ghostfolio/ghostfolio', { headers: { 'User-Agent': 'request' }, signal: AbortSignal.timeout( this.configurationService.get('REQUEST_TIMEOUT') ) - } - ).then((res) => res.json())) as { pull_count: number }; + }) + .then((res) => res.json())) as { pull_count: number }; return pull_count; } catch (error) { @@ -146,11 +147,13 @@ export class StatisticsGatheringProcessor { private async countGitHubContributors(): Promise { try { - const body = await fetch('https://github.com/ghostfolio/ghostfolio', { - signal: AbortSignal.timeout( - this.configurationService.get('REQUEST_TIMEOUT') - ) - }).then((res) => res.text()); + const body = await this.fetchService + .fetch('https://github.com/ghostfolio/ghostfolio', { + signal: AbortSignal.timeout( + this.configurationService.get('REQUEST_TIMEOUT') + ) + }) + .then((res) => res.text()); const $ = cheerio.load(body); @@ -174,15 +177,14 @@ export class StatisticsGatheringProcessor { private async countGitHubStargazers(): Promise { try { - const { stargazers_count } = (await fetch( - 'https://api.github.com/repos/ghostfolio/ghostfolio', - { + const { stargazers_count } = (await this.fetchService + .fetch('https://api.github.com/repos/ghostfolio/ghostfolio', { headers: { 'User-Agent': 'request' }, signal: AbortSignal.timeout( this.configurationService.get('REQUEST_TIMEOUT') ) - } - ).then((res) => res.json())) as { stargazers_count: number }; + }) + .then((res) => res.json())) as { stargazers_count: number }; return stargazers_count; } catch (error) { @@ -194,22 +196,24 @@ export class StatisticsGatheringProcessor { private async getUptime(monitorId: string): Promise { try { - const { data } = await fetch( - `https://uptime.betterstack.com/api/v2/monitors/${monitorId}/sla?from=${format( - subDays(new Date(), 90), - DATE_FORMAT - )}&to${format(new Date(), DATE_FORMAT)}`, - { - headers: { - [HEADER_KEY_TOKEN]: `Bearer ${this.configurationService.get( - 'API_KEY_BETTER_UPTIME' - )}` - }, - signal: AbortSignal.timeout( - this.configurationService.get('REQUEST_TIMEOUT') - ) - } - ).then((res) => res.json()); + const { data } = await this.fetchService + .fetch( + `https://uptime.betterstack.com/api/v2/monitors/${monitorId}/sla?from=${format( + subDays(new Date(), 90), + DATE_FORMAT + )}&to${format(new Date(), DATE_FORMAT)}`, + { + headers: { + [HEADER_KEY_TOKEN]: `Bearer ${this.configurationService.get( + 'API_KEY_BETTER_UPTIME' + )}` + }, + signal: AbortSignal.timeout( + this.configurationService.get('REQUEST_TIMEOUT') + ) + } + ) + .then((res) => res.json()); return data.attributes.availability / 100; } catch (error) { From a3f3d8e853e1e67c14424c097a6e2f9420c4eb63 Mon Sep 17 00:00:00 2001 From: David Requeno <108202767+DavidReque@users.noreply.github.com> Date: Thu, 28 May 2026 09:38:35 -0600 Subject: [PATCH 02/37] Task/extract FAB into a reusable component (GfFabComponent) (#6922) * Extract FAB into a reusable component * Update changelog --- CHANGELOG.md | 1 + .../admin-market-data.component.ts | 3 ++- .../admin-market-data/admin-market-data.html | 12 +---------- .../home-watchlist.component.ts | 10 ++------- .../home-watchlist/home-watchlist.html | 12 +---------- .../user-account-access.component.ts | 3 ++- .../user-account-access.html | 12 +---------- .../pages/accounts/accounts-page.component.ts | 10 +++------ .../src/app/pages/accounts/accounts-page.html | 12 +---------- .../activities/activities-page.component.ts | 11 ++-------- .../portfolio/activities/activities-page.html | 12 +---------- apps/client/src/styles.scss | 11 ---------- libs/ui/src/lib/fab/fab.component.html | 9 ++++++++ libs/ui/src/lib/fab/fab.component.scss | 14 +++++++++++++ libs/ui/src/lib/fab/fab.component.ts | 21 +++++++++++++++++++ libs/ui/src/lib/fab/index.ts | 1 + .../lib/page-tabs/page-tabs.component.scss | 6 ------ 17 files changed, 62 insertions(+), 98 deletions(-) create mode 100644 libs/ui/src/lib/fab/fab.component.html create mode 100644 libs/ui/src/lib/fab/fab.component.scss create mode 100644 libs/ui/src/lib/fab/fab.component.ts create mode 100644 libs/ui/src/lib/fab/index.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 8333f2f72..fafe92dbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Extracted the floating action buttons (FAB) to a reusable component - Upgraded `nestjs` from version `11.1.19` to `11.1.21` ## 3.5.0 - 2026-05-24 diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index 28b7297d2..805adf89d 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -18,6 +18,7 @@ import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market- import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; +import { GfFabComponent } from '@ghostfolio/ui/fab'; import { translate } from '@ghostfolio/ui/i18n'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { AdminService, DataService } from '@ghostfolio/ui/services'; @@ -80,10 +81,10 @@ import { CreateAssetProfileDialogParams } from './create-asset-profile-dialog/in @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - host: { class: 'has-fab' }, imports: [ CommonModule, GfActivitiesFilterComponent, + GfFabComponent, GfPremiumIndicatorComponent, GfSymbolPipe, GfValueComponent, diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.html b/apps/client/src/app/components/admin-market-data/admin-market-data.html index 14d12627d..63d425513 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.html +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -332,15 +332,5 @@ -
- - - -
+ diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts index 7deace7de..22d829daa 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.component.ts @@ -8,6 +8,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; +import { GfFabComponent } from '@ghostfolio/ui/fab'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { DataService } from '@ghostfolio/ui/services'; @@ -22,12 +23,8 @@ import { OnInit } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; -import { IonIcon } from '@ionic/angular/standalone'; -import { addIcons } from 'ionicons'; -import { addOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { GfCreateWatchlistItemDialogComponent } from './create-watchlist-item-dialog/create-watchlist-item-dialog.component'; @@ -37,9 +34,8 @@ import { CreateWatchlistItemDialogParams } from './create-watchlist-item-dialog/ changeDetection: ChangeDetectionStrategy.OnPush, imports: [ GfBenchmarkComponent, + GfFabComponent, GfPremiumIndicatorComponent, - IonIcon, - MatButtonModule, RouterModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA], @@ -108,8 +104,6 @@ export class GfHomeWatchlistComponent implements OnInit { this.changeDetectorRef.markForCheck(); } }); - - addIcons({ addOutline }); } public ngOnInit() { diff --git a/apps/client/src/app/components/home-watchlist/home-watchlist.html b/apps/client/src/app/components/home-watchlist/home-watchlist.html index c7c9a9c4b..e2865b9cf 100644 --- a/apps/client/src/app/components/home-watchlist/home-watchlist.html +++ b/apps/client/src/app/components/home-watchlist/home-watchlist.html @@ -22,15 +22,5 @@ @if (!hasImpersonationId && hasPermissionToCreateWatchlistItem) { -
- - - -
+ } diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index 985dba2cb..eef50cee3 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -4,6 +4,7 @@ import { CreateAccessDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { Access, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { GfFabComponent } from '@ghostfolio/ui/fab'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { DataService } from '@ghostfolio/ui/services'; @@ -42,9 +43,9 @@ import { CreateOrUpdateAccessDialogParams } from './create-or-update-access-dial @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - host: { class: 'has-fab' }, imports: [ GfAccessTableComponent, + GfFabComponent, GfPremiumIndicatorComponent, IonIcon, MatButtonModule, diff --git a/apps/client/src/app/components/user-account-access/user-account-access.html b/apps/client/src/app/components/user-account-access/user-account-access.html index 412a2f8d2..62b1648bb 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.html +++ b/apps/client/src/app/components/user-account-access/user-account-access.html @@ -69,16 +69,6 @@ (accessToUpdate)="onUpdateAccess($event)" /> @if (hasPermissionToCreateAccess) { -
- - - -
+ } diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 08513ef3e..cca1eda03 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -10,6 +10,7 @@ import { import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table'; +import { GfFabComponent } from '@ghostfolio/ui/fab'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { DataService } from '@ghostfolio/ui/services'; @@ -20,12 +21,9 @@ import { OnInit } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; import { Account as AccountModel } from '@prisma/client'; -import { addIcons } from 'ionicons'; -import { addOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { EMPTY, Subscription } from 'rxjs'; import { catchError } from 'rxjs/operators'; @@ -36,8 +34,8 @@ import { TransferBalanceDialogParams } from './transfer-balance/interfaces/inter import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-balance-dialog.component'; @Component({ - host: { class: 'has-fab page' }, - imports: [GfAccountsTableComponent, MatButtonModule, RouterModule], + host: { class: 'page' }, + imports: [GfAccountsTableComponent, GfFabComponent, RouterModule], selector: 'gf-accounts-page', styleUrls: ['./accounts-page.scss'], templateUrl: './accounts-page.html' @@ -90,8 +88,6 @@ export class GfAccountsPageComponent implements OnInit { this.openTransferBalanceDialog(); } }); - - addIcons({ addOutline }); } public ngOnInit() { diff --git a/apps/client/src/app/pages/accounts/accounts-page.html b/apps/client/src/app/pages/accounts/accounts-page.html index 3d9d7ee5c..1bdedbbb9 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.html +++ b/apps/client/src/app/pages/accounts/accounts-page.html @@ -26,16 +26,6 @@ hasPermissionToCreateAccount && !user.settings.isRestrictedView ) { -
- - - -
+ } diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index e43af52c9..41ff570c2 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -12,6 +12,7 @@ import { import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { DateRange } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; +import { GfFabComponent } from '@ghostfolio/ui/fab'; import { DataService } from '@ghostfolio/ui/services'; import { @@ -21,17 +22,13 @@ import { OnInit } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { PageEvent } from '@angular/material/paginator'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { Sort, SortDirection } from '@angular/material/sort'; import { MatTableDataSource } from '@angular/material/table'; import { ActivatedRoute, Router, RouterModule } from '@angular/router'; -import { IonIcon } from '@ionic/angular/standalone'; import { format, parseISO } from 'date-fns'; -import { addIcons } from 'ionicons'; -import { addOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { Subscription } from 'rxjs'; @@ -41,11 +38,9 @@ import { GfImportActivitiesDialogComponent } from './import-activities-dialog/im import { ImportActivitiesDialogParams } from './import-activities-dialog/interfaces/interfaces'; @Component({ - host: { class: 'has-fab' }, imports: [ GfActivitiesTableComponent, - IonIcon, - MatButtonModule, + GfFabComponent, MatSnackBarModule, RouterModule ], @@ -107,8 +102,6 @@ export class GfActivitiesPageComponent implements OnInit { } } }); - - addIcons({ addOutline }); } public ngOnInit() { diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html index 2a72dcfd2..f06947988 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.html +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -43,16 +43,6 @@ hasPermissionToCreateActivity && !user.settings.isRestrictedView ) { -
- - - -
+ } diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 1eb5bd2dd..4321622a1 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -360,10 +360,6 @@ ngx-skeleton-loader { text-wrap: balance; } -.has-fab { - padding-bottom: 3rem !important; -} - .has-info-message { // Restrict viewport height of tabbed views when the Live Demo or system announcements banner are displayed .page:has(gf-page-tabs) { @@ -484,13 +480,6 @@ ngx-skeleton-loader { padding-bottom: env(safe-area-inset-bottom); padding-bottom: constant(safe-area-inset-bottom); - .fab-container { - bottom: 2rem; - position: fixed; - right: 2rem; - z-index: 999; - } - // Restrict viewport height and layout boundaries only when the page hosts tab navigation &:has(gf-page-tabs) { height: calc(100svh - var(--mat-toolbar-standard-height)); diff --git a/libs/ui/src/lib/fab/fab.component.html b/libs/ui/src/lib/fab/fab.component.html new file mode 100644 index 000000000..021bc5f79 --- /dev/null +++ b/libs/ui/src/lib/fab/fab.component.html @@ -0,0 +1,9 @@ + + + diff --git a/libs/ui/src/lib/fab/fab.component.scss b/libs/ui/src/lib/fab/fab.component.scss new file mode 100644 index 000000000..ab6353981 --- /dev/null +++ b/libs/ui/src/lib/fab/fab.component.scss @@ -0,0 +1,14 @@ +:host { + bottom: calc(constant(safe-area-inset-bottom) + 2rem); + bottom: calc(env(safe-area-inset-bottom) + 2rem); + position: fixed; + right: 2rem; + z-index: 999; +} + +:host-context(gf-page-tabs) { + @media (max-width: 575.98px) { + bottom: calc(constant(safe-area-inset-bottom) + 5rem); + bottom: calc(env(safe-area-inset-bottom) + 5rem); + } +} diff --git a/libs/ui/src/lib/fab/fab.component.ts b/libs/ui/src/lib/fab/fab.component.ts new file mode 100644 index 000000000..20972d5a6 --- /dev/null +++ b/libs/ui/src/lib/fab/fab.component.ts @@ -0,0 +1,21 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { MatButtonModule } from '@angular/material/button'; +import { Params, RouterModule } from '@angular/router'; +import { IonIcon } from '@ionic/angular/standalone'; +import { addIcons } from 'ionicons'; +import { addOutline } from 'ionicons/icons'; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [IonIcon, MatButtonModule, RouterModule], + selector: 'gf-fab', + styleUrls: ['./fab.component.scss'], + templateUrl: './fab.component.html' +}) +export class GfFabComponent { + public readonly queryParams = input.required(); + + public constructor() { + addIcons({ addOutline }); + } +} diff --git a/libs/ui/src/lib/fab/index.ts b/libs/ui/src/lib/fab/index.ts new file mode 100644 index 000000000..d03295245 --- /dev/null +++ b/libs/ui/src/lib/fab/index.ts @@ -0,0 +1 @@ +export * from './fab.component'; diff --git a/libs/ui/src/lib/page-tabs/page-tabs.component.scss b/libs/ui/src/lib/page-tabs/page-tabs.component.scss index 920b00ae9..0b377e57a 100644 --- a/libs/ui/src/lib/page-tabs/page-tabs.component.scss +++ b/libs/ui/src/lib/page-tabs/page-tabs.component.scss @@ -15,12 +15,6 @@ ); ::ng-deep { - .fab-container { - @media (max-width: 575.98px) { - bottom: 5rem; - } - } - .mat-mdc-tab-nav-panel { padding: 2rem 0; From 5bf04c48f2dc8e6c6dda66f9fb5d2f2376ef1169 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 28 May 2026 17:38:57 +0200 Subject: [PATCH 03/37] Task/upgrade yahoo-finance2 to version 3.14.2 (#6955) * Upgrade yahoo-finance2 to version 3.14.2 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fafe92dbf..a7817256f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extracted the floating action buttons (FAB) to a reusable component - Upgraded `nestjs` from version `11.1.19` to `11.1.21` +- Upgraded `yahoo-finance2` from version `3.14.0` to `3.14.2` ## 3.5.0 - 2026-05-24 diff --git a/package-lock.json b/package-lock.json index f8e778549..7a06ea1b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "svgmap": "2.19.3", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", - "yahoo-finance2": "3.14.0", + "yahoo-finance2": "3.14.2", "zone.js": "0.16.1" }, "devDependencies": { @@ -39885,9 +39885,9 @@ } }, "node_modules/yahoo-finance2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.14.0.tgz", - "integrity": "sha512-gsT/tqgeizKtMxbIIWFiFyuhM/6MZE4yEyNLmPekr88AX14JL2HWw0/QNMOR081jVtzTjihqDW0zV7IayH1Wcw==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.14.2.tgz", + "integrity": "sha512-s+F7TWQT7zAtjhfC7rFHEX16Xfq36u3wceysINP7V+esF3mAYyk9slxZU+fEdkxaTuCT0+PnikHdekMX4UPMrg==", "license": "MIT", "dependencies": { "@deno/shim-deno": "~0.18.0", diff --git a/package.json b/package.json index 857313cae..dfc870b94 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "svgmap": "2.19.3", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", - "yahoo-finance2": "3.14.0", + "yahoo-finance2": "3.14.2", "zone.js": "0.16.1" }, "devDependencies": { From 8156e4057bf76281c75dae3aec6a4e86ade4378c Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 28 May 2026 17:54:52 +0200 Subject: [PATCH 04/37] Task/respect HTTP_PROXY environment variables for outbound HTTP requests (#6952) * Respect HTTP proxy environment variables for outbound HTTP requests * Update changelog --- CHANGELOG.md | 1 + apps/api/src/main.ts | 4 ++++ package-lock.json | 7 ++++--- package.json | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7817256f..d82e7dd19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Added `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variable support to outbound HTTP requests - Added the `FetchService` to centralize outbound HTTP requests ### Changed diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index f08a09a83..94e389f6a 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -18,11 +18,15 @@ import type { NestExpressApplication } from '@nestjs/platform-express'; import cookieParser from 'cookie-parser'; import { NextFunction, Request, Response } from 'express'; import helmet from 'helmet'; +import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; async function bootstrap() { + // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY for outbound HTTP requests + setGlobalDispatcher(new EnvHttpProxyAgent()); + const configApp = await NestFactory.create(AppModule); const configService = configApp.get(ConfigService); let customLogLevels: LogLevel[]; diff --git a/package-lock.json b/package-lock.json index 7a06ea1b3..6527c6bc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,6 +94,7 @@ "svgmap": "2.19.3", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", + "undici": "7.24.4", "yahoo-finance2": "3.14.2", "zone.js": "0.16.1" }, @@ -28576,9 +28577,9 @@ } }, "node_modules/jsdom/node_modules/undici": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", - "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", "dev": true, "license": "MIT", "peer": true, diff --git a/package.json b/package.json index dfc870b94..fea49e02e 100644 --- a/package.json +++ b/package.json @@ -138,6 +138,7 @@ "svgmap": "2.19.3", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", + "undici": "7.24.4", "yahoo-finance2": "3.14.2", "zone.js": "0.16.1" }, From 4ad6537ddff54271424bae67c1b1dc40cb13320e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 28 May 2026 17:57:10 +0200 Subject: [PATCH 05/37] Release 3.6.0 (#6956) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d82e7dd19..983e9d6ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 3.6.0 - 2026-05-28 ### Added diff --git a/package-lock.json b/package-lock.json index 6527c6bc4..c9abbd50d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.5.0", + "version": "3.6.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.5.0", + "version": "3.6.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index fea49e02e..22e39c437 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.5.0", + "version": "3.6.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From b371318c7851f8c5b33316ba0ad60c1846e86a76 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 30 May 2026 09:36:09 +0200 Subject: [PATCH 06/37] Bugfix/add missing guards to getMarketDataBySymbol() in market data controller (#6958) Add missing guards --- .../src/app/endpoints/market-data/market-data.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/api/src/app/endpoints/market-data/market-data.controller.ts b/apps/api/src/app/endpoints/market-data/market-data.controller.ts index 0dae82d2c..f6857283b 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.controller.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.controller.ts @@ -120,10 +120,10 @@ export class MarketDataController { if (!canReadAllAssetProfiles && !canReadOwnAssetProfile) { throw new HttpException( - assetProfile.userId + assetProfile?.userId ? getReasonPhrase(StatusCodes.NOT_FOUND) : getReasonPhrase(StatusCodes.FORBIDDEN), - assetProfile.userId ? StatusCodes.NOT_FOUND : StatusCodes.FORBIDDEN + assetProfile?.userId ? StatusCodes.NOT_FOUND : StatusCodes.FORBIDDEN ); } From fea5ee33bb5178d48ca89c90253e6e8ea48c3870 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sat, 30 May 2026 14:36:27 +0700 Subject: [PATCH 07/37] Task/improve type safety in HTTP interceptor (#6957) * feat(client): resolve errors * feat(client): replace constructor based DI with inject function * feat(client): enforce encapsulation and immutability * feat(client): remove unused tap operator * feat(client): implement generic type parameter * feat(client): replace constructor based DI with inject functions --- apps/client/src/app/core/auth.guard.ts | 12 +++-- apps/client/src/app/core/auth.interceptor.ts | 16 +++---- .../src/app/core/http-response.interceptor.ts | 45 +++++++++---------- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index 3292f0ff7..6ac3417db 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -3,7 +3,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { DataService } from '@ghostfolio/ui/services'; -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Router, @@ -14,12 +14,10 @@ import { catchError } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class AuthGuard { - public constructor( - private dataService: DataService, - private router: Router, - private settingsStorageService: SettingsStorageService, - private userService: UserService - ) {} + private readonly dataService = inject(DataService); + private readonly router = inject(Router); + private readonly settingsStorageService = inject(SettingsStorageService); + private readonly userService = inject(UserService); canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { const utmSource = route.queryParams?.utm_source; diff --git a/apps/client/src/app/core/auth.interceptor.ts b/apps/client/src/app/core/auth.interceptor.ts index 7491cecf1..9c06a11d5 100644 --- a/apps/client/src/app/core/auth.interceptor.ts +++ b/apps/client/src/app/core/auth.interceptor.ts @@ -13,20 +13,20 @@ import { HttpInterceptor, HttpRequest } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; @Injectable() export class AuthInterceptor implements HttpInterceptor { - public constructor( - private impersonationStorageService: ImpersonationStorageService, - private tokenStorageService: TokenStorageService - ) {} + private readonly impersonationStorageService = inject( + ImpersonationStorageService + ); + private readonly tokenStorageService = inject(TokenStorageService); - public intercept( - req: HttpRequest, + public intercept( + req: HttpRequest, next: HttpHandler - ): Observable> { + ): Observable> { let request = req; if (request.headers.has(HEADER_KEY_SKIP_INTERCEPTOR)) { diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index 315e9d64e..17927a924 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -12,7 +12,7 @@ import { HttpInterceptor, HttpRequest } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { MatSnackBar, MatSnackBarRef, @@ -22,31 +22,28 @@ import { Router } from '@angular/router'; import { StatusCodes } from 'http-status-codes'; import ms from 'ms'; import { Observable, throwError } from 'rxjs'; -import { catchError, tap } from 'rxjs/operators'; +import { catchError } from 'rxjs/operators'; @Injectable() export class HttpResponseInterceptor implements HttpInterceptor { - public info: InfoItem; - public snackBarRef: MatSnackBarRef; + private readonly info: InfoItem; + private snackBarRef: MatSnackBarRef | undefined; - public constructor( - private dataService: DataService, - private router: Router, - private snackBar: MatSnackBar, - private userService: UserService, - private webAuthnService: WebAuthnService - ) { + private readonly dataService = inject(DataService); + private readonly router = inject(Router); + private readonly snackBar = inject(MatSnackBar); + private readonly userService = inject(UserService); + private readonly webAuthnService = inject(WebAuthnService); + + public constructor() { this.info = this.dataService.fetchInfo(); } - public intercept( - request: HttpRequest, + public intercept( + request: HttpRequest, next: HttpHandler - ): Observable> { + ): Observable> { return next.handle(request).pipe( - tap((event: HttpEvent) => { - return event; - }), catchError((error: HttpErrorResponse) => { if (error.status === StatusCodes.FORBIDDEN) { if (!this.snackBarRef) { @@ -61,7 +58,7 @@ export class HttpResponseInterceptor implements HttpInterceptor { } ); } else if ( - !error.url.includes(internalRoutes.auth.routerLink.join('')) + !error.url?.includes(internalRoutes.auth.routerLink.join('')) ) { this.snackBarRef = this.snackBar.open( $localize`This action is not allowed.`, @@ -72,11 +69,11 @@ export class HttpResponseInterceptor implements HttpInterceptor { ); } - this.snackBarRef.afterDismissed().subscribe(() => { + this.snackBarRef?.afterDismissed().subscribe(() => { this.snackBarRef = undefined; }); - this.snackBarRef.onAction().subscribe(() => { + this.snackBarRef?.onAction().subscribe(() => { this.router.navigate(publicRoutes.pricing.routerLink); }); } @@ -92,11 +89,11 @@ export class HttpResponseInterceptor implements HttpInterceptor { } ); - this.snackBarRef.afterDismissed().subscribe(() => { + this.snackBarRef?.afterDismissed().subscribe(() => { this.snackBarRef = undefined; }); - this.snackBarRef.onAction().subscribe(() => { + this.snackBarRef?.onAction().subscribe(() => { window.location.reload(); }); } @@ -106,12 +103,12 @@ export class HttpResponseInterceptor implements HttpInterceptor { $localize`Oops! It looks like you’re making too many requests. Please slow down a bit.` ); - this.snackBarRef.afterDismissed().subscribe(() => { + this.snackBarRef?.afterDismissed().subscribe(() => { this.snackBarRef = undefined; }); } } else if (error.status === StatusCodes.UNAUTHORIZED) { - if (!error.url.includes('/data-providers/ghostfolio/status')) { + if (!error.url?.includes('/data-providers/ghostfolio/status')) { if (this.webAuthnService.isEnabled()) { this.router.navigate(internalRoutes.webauthn.routerLink); } else { From b6b44347b029bad0a896112ee404f0bbc1858bfe Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Sun, 31 May 2026 11:51:22 +0700 Subject: [PATCH 08/37] Task/improve type safety in file drop directive (#6961) * fix(client): resolve errors * feat(client): migrate to output signal * feat(client): migrate to host property --- .../file-drop/file-drop.directive.ts | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/client/src/app/directives/file-drop/file-drop.directive.ts b/apps/client/src/app/directives/file-drop/file-drop.directive.ts index a7e628bc9..b46357005 100644 --- a/apps/client/src/app/directives/file-drop/file-drop.directive.ts +++ b/apps/client/src/app/directives/file-drop/file-drop.directive.ts @@ -1,28 +1,34 @@ -import { Directive, EventEmitter, HostListener, Output } from '@angular/core'; +import { Directive, output } from '@angular/core'; @Directive({ + host: { + '(dragenter)': 'onDragEnter($event)', + '(dragover)': 'onDragOver($event)', + '(drop)': 'onDrop($event)' + }, selector: '[gfFileDrop]' }) export class GfFileDropDirective { - @Output() filesDropped = new EventEmitter(); + public readonly filesDropped = output(); - @HostListener('dragenter', ['$event']) onDragEnter(event: DragEvent) { + public onDragEnter(event: DragEvent) { event.preventDefault(); event.stopPropagation(); } - @HostListener('dragover', ['$event']) onDragOver(event: DragEvent) { + public onDragOver(event: DragEvent) { event.preventDefault(); event.stopPropagation(); } - @HostListener('drop', ['$event']) onDrop(event: DragEvent) { + public onDrop(event: DragEvent) { event.preventDefault(); event.stopPropagation(); - // Prevent the browser's default behavior for handling the file drop - event.dataTransfer.dropEffect = 'copy'; - - this.filesDropped.emit(event.dataTransfer.files); + if (event.dataTransfer) { + // Prevent the browser's default behavior for handling the file drop + event.dataTransfer.dropEffect = 'copy'; + this.filesDropped.emit(event.dataTransfer.files); + } } } From f9ebb9150abfb49ece0f7d51758d51971c2d3d8e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 May 2026 06:54:51 +0200 Subject: [PATCH 09/37] Task/add portfolio service test (#6949) * Add tests to cover cash positions --- .../app/portfolio/portfolio.service.spec.ts | 272 ++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 apps/api/src/app/portfolio/portfolio.service.spec.ts diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts new file mode 100644 index 000000000..da846c45d --- /dev/null +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -0,0 +1,272 @@ +import { AccountService } from '@ghostfolio/api/app/account/account.service'; +import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; +import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; +import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.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'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; +import { parseDate } from '@ghostfolio/common/helper'; + +import { Account, DataSource } from '@prisma/client'; +import { Big } from 'big.js'; +import { randomUUID } from 'node:crypto'; + +import { PortfolioService } from './portfolio.service'; + +describe('PortfolioService', () => { + let accountService: AccountService; + let activitiesService: ActivitiesService; + let configurationService: ConfigurationService; + let dataProviderService: DataProviderService; + let exchangeRateDataService: ExchangeRateDataService; + let impersonationService: ImpersonationService; + let portfolioCalculatorFactory: PortfolioCalculatorFactory; + let portfolioService: PortfolioService; + let symbolProfileService: SymbolProfileService; + let userService: UserService; + + beforeEach(() => { + configurationService = new ConfigurationService(); + + dataProviderService = new DataProviderService( + configurationService, + null, + null, + null, + null, + null + ); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + + accountService = new AccountService( + null, + null, + exchangeRateDataService, + null + ); + + activitiesService = new ActivitiesService( + null, + accountService, + null, + dataProviderService, + null, + exchangeRateDataService, + null, + null + ); + + impersonationService = new ImpersonationService(null, null); + + portfolioCalculatorFactory = new PortfolioCalculatorFactory( + configurationService, + null, + exchangeRateDataService, + null, + null + ); + + symbolProfileService = new SymbolProfileService(null); + + userService = new UserService( + null, + null, + null, + null, + null, + null, + null, + null + ); + + portfolioService = new PortfolioService( + null, + accountService, + activitiesService, + null, + portfolioCalculatorFactory, + dataProviderService, + exchangeRateDataService, + null, + impersonationService, + null, + null, + symbolProfileService, + userService + ); + }); + + describe('getCashSymbolProfiles', () => { + it('should use the exchange-rate data source so the symbol-profile join in getDetails matches the calculator positions', () => { + jest + .spyOn(dataProviderService, 'getDataSourceForExchangeRates') + .mockReturnValue(DataSource.YAHOO); + + const cashDetails: CashDetails = { + accounts: [ + { + balance: 2000, + comment: null, + createdAt: parseDate('2024-01-01'), + currency: 'USD', + id: randomUUID(), + isExcluded: false, + name: 'USD', + platformId: null, + updatedAt: parseDate('2024-01-01'), + userId: userDummyData.id + } + ], + balanceInBaseCurrency: 1820 + }; + + const assetProfiles = ( + portfolioService as unknown as { + getCashSymbolProfiles: ( + aCashDetails: CashDetails + ) => { dataSource: DataSource; symbol: string }[]; + } + ).getCashSymbolProfiles(cashDetails); + + expect(assetProfiles).toHaveLength(1); + expect(assetProfiles[0].dataSource).toBe(DataSource.YAHOO); + expect(assetProfiles[0].symbol).toBe('USD'); + }); + }); + + describe('getDetails', () => { + it('should return cash holdings when the calculator emits cash positions with the exchange-rate data source', async () => { + const accountId = randomUUID(); + + const cashAccount: Account = { + balance: 2000, + comment: null, + createdAt: parseDate('2024-01-01'), + currency: 'USD', + id: accountId, + isExcluded: false, + name: 'USD', + platformId: null, + updatedAt: parseDate('2024-01-01'), + userId: userDummyData.id + }; + + jest.spyOn(accountService, 'getCashDetails').mockResolvedValue({ + accounts: [cashAccount], + balanceInBaseCurrency: 1820 + }); + + jest + .spyOn(activitiesService, 'getActivitiesForPortfolioCalculator') + .mockResolvedValue({ activities: [], count: 0 }); + + jest + .spyOn(dataProviderService, 'getDataSourceForExchangeRates') + .mockReturnValue(DataSource.YAHOO); + + jest + .spyOn(impersonationService, 'validateImpersonationId') + .mockResolvedValue(null); + + jest + .spyOn(symbolProfileService, 'getSymbolProfiles') + .mockResolvedValue([]); + + jest.spyOn(userService, 'user').mockResolvedValue({ + accessesGet: [], + accounts: [], + activityCount: 0, + dataProviderGhostfolioDailyRequests: 0, + id: userDummyData.id, + settings: { + settings: { + baseCurrency: 'CHF' + } + } + } as unknown as Awaited>); + + const usdPosition = { + activitiesCount: 1, + averagePrice: new Big(1), + currency: 'USD', + dataSource: DataSource.YAHOO, + dateOfFirstActivity: '2024-01-01', + dividend: new Big(0), + dividendInBaseCurrency: new Big(0), + fee: new Big(0), + feeInBaseCurrency: new Big(0), + grossPerformance: new Big(0), + grossPerformancePercentage: new Big(0), + grossPerformancePercentageWithCurrencyEffect: new Big(0), + grossPerformanceWithCurrencyEffect: new Big(0), + investment: new Big(1820), + investmentWithCurrencyEffect: new Big(1820), + marketPrice: 1, + marketPriceInBaseCurrency: 0.91, + netPerformance: new Big(0), + netPerformancePercentage: new Big(0), + netPerformancePercentageWithCurrencyEffectMap: {}, + netPerformanceWithCurrencyEffectMap: {}, + quantity: new Big(2000), + symbol: 'USD', + tags: [], + timeWeightedInvestment: new Big(0), + timeWeightedInvestmentWithCurrencyEffect: new Big(0), + valueInBaseCurrency: new Big(1820) + }; + + jest + .spyOn(portfolioCalculatorFactory, 'createCalculator') + .mockReturnValue({ + getSnapshot: jest.fn().mockResolvedValue({ + activitiesCount: 1, + createdAt: parseDate('2024-01-01'), + currentValueInBaseCurrency: new Big(1820), + errors: [], + hasErrors: false, + historicalData: [], + positions: [usdPosition], + totalFeesWithCurrencyEffect: new Big(0), + totalInterestWithCurrencyEffect: new Big(0), + totalInvestment: new Big(1820), + totalInvestmentWithCurrencyEffect: new Big(1820), + totalLiabilitiesWithCurrencyEffect: new Big(0) + }) + } as unknown as ReturnType< + typeof portfolioCalculatorFactory.createCalculator + >); + + jest + .spyOn( + portfolioService as unknown as { + getValueOfAccountsAndPlatforms: () => Promise<{ + accounts: object; + platforms: object; + }>; + }, + 'getValueOfAccountsAndPlatforms' + ) + .mockResolvedValue({ accounts: {}, platforms: {} }); + + const { holdings } = await portfolioService.getDetails({ + filters: [], + impersonationId: userDummyData.id, + userId: userDummyData.id + }); + + expect(holdings['USD']).toBeDefined(); + expect(holdings['USD'].assetProfile.dataSource).toBe(DataSource.YAHOO); + expect(holdings['USD'].assetProfile.symbol).toBe('USD'); + }); + }); +}); From aa0ec2622f3474a62d030ae512e906c8c33c6d33 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 May 2026 07:03:47 +0200 Subject: [PATCH 10/37] Task/extend countries mapping in Trackinsight data enhancer service (#6959) * Extend countries mapping with USA * Update changelog --- CHANGELOG.md | 6 ++++++ .../data-enhancer/trackinsight/trackinsight.service.ts | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 983e9d6ea..9842a2b19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Extended the countries mapping in the data enhancer for asset profile data via _Trackinsight_ + ## 3.6.0 - 2026-05-28 ### Added diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index 54627f312..eeccf725e 100644 --- a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -13,7 +13,8 @@ import { countries } from 'countries-list'; export class TrackinsightDataEnhancerService implements DataEnhancerInterface { private static baseUrl = 'https://www.trackinsight.com/data-api'; private static countriesMapping = { - 'Russian Federation': 'Russia' + 'Russian Federation': 'Russia', + USA: 'United States' }; private static holdingsWeightTreshold = 0.85; private static sectorsMapping = { From ab6fdf6c4fe55aa663c4f4d6893780141e39ccab Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 May 2026 07:16:56 +0200 Subject: [PATCH 11/37] Task/remove deprecated attributes from portfolio position interface (#6950) * Remove deprecated attributes * Update changelog --- CHANGELOG.md | 1 + .../src/app/portfolio/portfolio.controller.ts | 44 ++-- .../src/app/portfolio/portfolio.service.ts | 34 +-- ...ate-or-update-activity-dialog.component.ts | 2 +- .../import-activities-dialog.component.ts | 3 +- .../allocations/allocations-page.component.ts | 50 ++--- .../portfolio/analysis/analysis-page.html | 16 +- .../app/pages/public/public-page.component.ts | 5 +- .../portfolio-position.interface.ts | 47 +--- .../src/lib/assistant/assistant.component.ts | 41 ++-- libs/ui/src/lib/mocks/holdings.ts | 200 ++++-------------- .../portfolio-filter-form.component.html | 9 +- .../portfolio-filter-form.component.ts | 3 +- 13 files changed, 136 insertions(+), 319 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9842a2b19..e0c416fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Extended the countries mapping in the data enhancer for asset profile data via _Trackinsight_ +- Removed the deprecated attributes (`assetClass`, `assetClassLabel`, `assetSubClass`, `assetSubClassLabel`, `countries`, `currency`, `dataSource`, `holdings`, `name`, `sectors`, `symbol` and `url`) from the holdings of the portfolio details endpoint response ## 3.6.0 - 2026-05-28 diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 8aa94ee92..9515c7a21 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -144,10 +144,10 @@ export class PortfolioController { .reduce((a, b) => a + b, 0); const totalValue = Object.values(holdings) - .filter(({ assetClass, assetSubClass }) => { + .filter(({ assetProfile }) => { return ( - assetClass !== AssetClass.LIQUIDITY && - assetSubClass !== AssetSubClass.CASH + assetProfile.assetClass !== AssetClass.LIQUIDITY && + assetProfile.assetSubClass !== AssetSubClass.CASH ); }) .map(({ valueInBaseCurrency }) => { @@ -217,37 +217,41 @@ export class PortfolioController { for (const [symbol, portfolioPosition] of Object.entries(holdings)) { holdings[symbol] = { ...portfolioPosition, - assetClass: - hasDetails || portfolioPosition.assetClass === AssetClass.LIQUIDITY - ? portfolioPosition.assetClass - : undefined, assetProfile: { ...portfolioPosition.assetProfile, + assetClass: + hasDetails || + portfolioPosition.assetProfile.assetClass === AssetClass.LIQUIDITY + ? portfolioPosition.assetProfile.assetClass + : undefined, + assetClassLabel: + hasDetails || + portfolioPosition.assetProfile.assetClass === AssetClass.LIQUIDITY + ? portfolioPosition.assetProfile.assetClassLabel + : undefined, + assetSubClass: + hasDetails || + portfolioPosition.assetProfile.assetSubClass === AssetSubClass.CASH + ? portfolioPosition.assetProfile.assetSubClass + : undefined, + assetSubClassLabel: + hasDetails || + portfolioPosition.assetProfile.assetSubClass === AssetSubClass.CASH + ? portfolioPosition.assetProfile.assetSubClassLabel + : undefined, ...(hasDetails ? {} : { - assetClass: undefined, - assetClassLabel: undefined, - assetSubClass: undefined, - assetSubClassLabel: undefined, countries: [], currency: undefined, holdings: [], sectors: [] }) }, - assetSubClass: - hasDetails || portfolioPosition.assetSubClass === AssetSubClass.CASH - ? portfolioPosition.assetSubClass - : undefined, - countries: hasDetails ? portfolioPosition.countries : [], - currency: hasDetails ? portfolioPosition.currency : undefined, - holdings: hasDetails ? portfolioPosition.holdings : [], markets: hasDetails ? portfolioPosition.markets : undefined, marketsAdvanced: hasDetails ? portfolioPosition.marketsAdvanced - : undefined, - sectors: hasDetails ? portfolioPosition.sectors : [] + : undefined }; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index cee36ec27..ab39a00a5 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -584,7 +584,6 @@ export class PortfolioService { for (const { activitiesCount, - currency, dataSource, dateOfFirstActivity, dividend, @@ -638,16 +637,13 @@ export class PortfolioService { holdings[symbol] = { activitiesCount, - currency, markets, marketsAdvanced, marketPrice, - symbol, tags, allocationInPercentage: filteredValueInBaseCurrency.eq(0) ? 0 : valueInBaseCurrency.div(filteredValueInBaseCurrency).toNumber(), - assetClass: assetProfile.assetClass, assetProfile: { assetClass: assetProfile.assetClass, assetSubClass: assetProfile.assetSubClass, @@ -670,9 +666,6 @@ export class PortfolioService { symbol: assetProfile.symbol, url: assetProfile.url }, - assetSubClass: assetProfile.assetSubClass, - countries: assetProfile.countries, - dataSource: assetProfile.dataSource, dateOfFirstActivity: parseDate(dateOfFirstActivity), dividend: dividend?.toNumber() ?? 0, grossPerformance: grossPerformance?.toNumber() ?? 0, @@ -681,19 +674,7 @@ export class PortfolioService { grossPerformancePercentageWithCurrencyEffect?.toNumber() ?? 0, grossPerformanceWithCurrencyEffect: grossPerformanceWithCurrencyEffect?.toNumber() ?? 0, - holdings: assetProfile.holdings.map( - ({ allocationInPercentage, name }) => { - return { - allocationInPercentage, - name, - valueInBaseCurrency: valueInBaseCurrency - .mul(allocationInPercentage) - .toNumber() - }; - } - ), investment: investment.toNumber(), - name: assetProfile.name, netPerformance: netPerformance?.toNumber() ?? 0, netPerformancePercent: netPerformancePercentage?.toNumber() ?? 0, netPerformancePercentWithCurrencyEffect: @@ -703,8 +684,6 @@ export class PortfolioService { netPerformanceWithCurrencyEffect: netPerformanceWithCurrencyEffectMap?.[dateRange]?.toNumber() ?? 0, quantity: quantity.toNumber(), - sectors: assetProfile.sectors, - url: assetProfile.url, valueInBaseCurrency: valueInBaseCurrency.toNumber() }; } @@ -1472,8 +1451,8 @@ export class PortfolioService { for (const [, position] of Object.entries(holdings)) { const value = position.valueInBaseCurrency; - if (position.assetClass !== AssetClass.LIQUIDITY) { - if (position.countries.length > 0) { + if (position.assetProfile.assetClass !== AssetClass.LIQUIDITY) { + if (position.assetProfile.countries.length > 0) { markets.developedMarkets.valueInBaseCurrency += position.markets.developedMarkets * value; markets.emergingMarkets.valueInBaseCurrency += @@ -1719,11 +1698,8 @@ export class PortfolioService { currency: string; }): PortfolioPosition { return { - currency, activitiesCount: 0, allocationInPercentage: 0, - assetClass: AssetClass.LIQUIDITY, - assetSubClass: AssetSubClass.CASH, assetProfile: { currency, assetClass: AssetClass.LIQUIDITY, @@ -1735,25 +1711,19 @@ export class PortfolioService { sectors: [], symbol: currency }, - countries: [], - dataSource: undefined, dateOfFirstActivity: undefined, dividend: 0, grossPerformance: 0, grossPerformancePercent: 0, grossPerformancePercentWithCurrencyEffect: 0, grossPerformanceWithCurrencyEffect: 0, - holdings: [], investment: balance, marketPrice: 0, - name: currency, netPerformance: 0, netPerformancePercent: 0, netPerformancePercentWithCurrencyEffect: 0, netPerformanceWithCurrencyEffect: 0, quantity: 0, - sectors: [], - symbol: currency, tags: [], valueInBaseCurrency: balance }; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 1e943824c..decb30682 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -139,7 +139,7 @@ export class GfCreateOrUpdateActivityDialogComponent { return !['CASH'].includes(assetProfile.assetSubClass); }) .sort((a, b) => { - return a.name?.localeCompare(b.name); + return a.assetProfile.name?.localeCompare(b.assetProfile.name); }) .map(({ assetProfile }) => { return { diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 42260d648..c3dbe6cf2 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -226,7 +226,8 @@ export class GfImportActivitiesDialogComponent { this.assetProfileForm.controls.assetProfileIdentifier.disable(); const { dataSource, symbol } = - this.assetProfileForm.controls.assetProfileIdentifier.value ?? {}; + this.assetProfileForm.controls.assetProfileIdentifier.value + ?.assetProfile ?? {}; if (!dataSource || !symbol) { return; diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index a7f8cd2ec..f48b551bb 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -73,15 +73,14 @@ export class GfAllocationsPageComponent implements OnInit { public hasImpersonationId: boolean; public holdings: { [symbol: string]: Pick< - PortfolioPosition, + PortfolioPosition['assetProfile'], | 'assetClass' | 'assetClassLabel' | 'assetSubClass' | 'assetSubClassLabel' | 'currency' - | 'exchange' | 'name' - > & { etfProvider: string; value: number }; + > & { etfProvider: string; exchange?: string; value: number }; }; public isLoading = false; public markets: { @@ -206,7 +205,7 @@ export class GfAllocationsPageComponent implements OnInit { assetSubClass, name }: { - assetSubClass: PortfolioPosition['assetSubClass']; + assetSubClass: PortfolioPosition['assetProfile']['assetSubClass']; name: string; }) { if (assetSubClass === 'ETF') { @@ -333,24 +332,27 @@ export class GfAllocationsPageComponent implements OnInit { this.holdings[symbol] = { value, - assetClass: position.assetClass || (UNKNOWN_KEY as AssetClass), - assetClassLabel: position.assetClassLabel || UNKNOWN_KEY, - assetSubClass: position.assetSubClass || (UNKNOWN_KEY as AssetSubClass), - assetSubClassLabel: position.assetSubClassLabel || UNKNOWN_KEY, - currency: position.currency, + assetClass: + position.assetProfile.assetClass || (UNKNOWN_KEY as AssetClass), + assetClassLabel: position.assetProfile.assetClassLabel || UNKNOWN_KEY, + assetSubClass: + position.assetProfile.assetSubClass || (UNKNOWN_KEY as AssetSubClass), + assetSubClassLabel: + position.assetProfile.assetSubClassLabel || UNKNOWN_KEY, + currency: position.assetProfile.currency, etfProvider: this.extractEtfProvider({ - assetSubClass: position.assetSubClass, - name: position.name + assetSubClass: position.assetProfile.assetSubClass, + name: position.assetProfile.name }), exchange: position.exchange, - name: position.name + name: position.assetProfile.name }; - if (position.assetClass !== AssetClass.LIQUIDITY) { + if (position.assetProfile.assetClass !== AssetClass.LIQUIDITY) { // Prepare analysis data by continents, countries, holdings and sectors except for liquidity - if (position.countries.length > 0) { - for (const country of position.countries) { + if (position.assetProfile.countries.length > 0) { + for (const country of position.assetProfile.countries) { const { code, continent, name, weight } = country; if (this.continents[continent]?.value) { @@ -401,12 +403,12 @@ export class GfAllocationsPageComponent implements OnInit { : this.portfolioDetails.holdings[symbol].valueInPercentage; } - if (position.holdings.length > 0) { + if (position.assetProfile.holdings.length > 0) { for (const { allocationInPercentage, name, valueInBaseCurrency - } of position.holdings) { + } of position.assetProfile.holdings) { const normalizedAssetName = this.normalizeAssetName(name); if (this.topHoldingsMap[normalizedAssetName]?.value) { @@ -428,8 +430,8 @@ export class GfAllocationsPageComponent implements OnInit { } } - if (position.sectors.length > 0) { - for (const sector of position.sectors) { + if (position.assetProfile.sectors.length > 0) { + for (const sector of position.assetProfile.sectors) { const { name, weight } = sector; if (this.sectors[name]?.value) { @@ -463,8 +465,8 @@ export class GfAllocationsPageComponent implements OnInit { } this.symbols[prettifySymbol(symbol)] = { - dataSource: position.dataSource, - name: position.name, + dataSource: position.assetProfile.dataSource, + name: position.assetProfile.name, symbol: prettifySymbol(symbol), value: isNumber(position.valueInBaseCurrency) ? position.valueInBaseCurrency @@ -517,8 +519,8 @@ export class GfAllocationsPageComponent implements OnInit { this.totalValueInEtf > 0 ? value / this.totalValueInEtf : 0, parents: Object.entries(this.portfolioDetails.holdings) .map(([symbol, holding]) => { - if (holding.holdings.length > 0) { - const currentParentHolding = holding.holdings.find( + if (holding.assetProfile.holdings.length > 0) { + const currentParentHolding = holding.assetProfile.holdings.find( (parentHolding) => { return ( this.normalizeAssetName(parentHolding.name) === @@ -531,7 +533,7 @@ export class GfAllocationsPageComponent implements OnInit { ? { allocationInPercentage: currentParentHolding.valueInBaseCurrency / value, - name: holding.name, + name: holding.assetProfile.name, position: holding, symbol: prettifySymbol(symbol), valueInBaseCurrency: diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index 4c5c61bd8..b93be9182 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -310,13 +310,15 @@ -
{{ holding.name }}
+
+ {{ holding.assetProfile.name }} +
-
{{ holding.name }}
+
+ {{ holding.assetProfile.name }} +
& { + [symbol: string]: Pick< + PortfolioPosition['assetProfile'], + 'currency' | 'name' + > & { value: number; }; }; diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index c4ef2e3dc..c94a1efa5 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -1,22 +1,12 @@ import { Market, MarketAdvanced } from '@ghostfolio/common/types'; -import { AssetClass, AssetSubClass, DataSource, Tag } from '@prisma/client'; +import { Tag } from '@prisma/client'; -import { Country } from './country.interface'; import { EnhancedSymbolProfile } from './enhanced-symbol-profile.interface'; -import { Holding } from './holding.interface'; -import { Sector } from './sector.interface'; export interface PortfolioPosition { activitiesCount: number; allocationInPercentage: number; - - /** @deprecated */ - assetClass?: AssetClass; - - /** @deprecated */ - assetClassLabel?: string; - assetProfile: Pick< EnhancedSymbolProfile, | 'assetClass' @@ -33,22 +23,6 @@ export interface PortfolioPosition { assetClassLabel?: string; assetSubClassLabel?: string; }; - - /** @deprecated */ - assetSubClass?: AssetSubClass; - - /** @deprecated */ - assetSubClassLabel?: string; - - /** @deprecated */ - countries: Country[]; - - /** @deprecated */ - currency: string; - - /** @deprecated */ - dataSource: DataSource; - dateOfFirstActivity: Date; dividend: number; exchange?: string; @@ -56,38 +30,19 @@ export interface PortfolioPosition { grossPerformancePercent: number; grossPerformancePercentWithCurrencyEffect: number; grossPerformanceWithCurrencyEffect: number; - - /** @deprecated */ - holdings: Holding[]; - investment: number; marketChange?: number; marketChangePercent?: number; marketPrice: number; markets?: { [key in Market]: number }; marketsAdvanced?: { [key in MarketAdvanced]: number }; - - /** @deprecated */ - name: string; - netPerformance: number; netPerformancePercent: number; netPerformancePercentWithCurrencyEffect: number; netPerformanceWithCurrencyEffect: number; quantity: number; - - /** @deprecated */ - sectors: Sector[]; - - /** @deprecated */ - symbol: string; - tags?: Tag[]; type?: string; - - /** @deprecated */ - url?: string; - valueInBaseCurrency?: number; valueInPercentage?: number; } diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index a0985a979..3c162a310 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -504,11 +504,16 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ holdings }) => { this.holdings = holdings - .filter(({ assetSubClass }) => { - return assetSubClass && !['CASH'].includes(assetSubClass); + .filter(({ assetProfile }) => { + return ( + assetProfile.assetSubClass && + !['CASH'].includes(assetProfile.assetSubClass) + ); }) .sort((a, b) => { - return a.name?.localeCompare(b.name); + return (a.assetProfile.name ?? '').localeCompare( + b.assetProfile.name ?? '' + ); }); this.setPortfolioFilterFormValues(); @@ -530,11 +535,11 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { type: 'ASSET_CLASS' }, { - id: filterValue?.holding?.dataSource ?? '', + id: filterValue?.holding?.assetProfile?.dataSource ?? '', type: 'DATA_SOURCE' }, { - id: filterValue?.holding?.symbol ?? '', + id: filterValue?.holding?.assetProfile?.symbol ?? '', type: 'SYMBOL' }, { @@ -718,18 +723,16 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { return EMPTY; }), map(({ holdings }) => { - return holdings.map( - ({ assetSubClass, currency, dataSource, name, symbol }) => { - return { - currency, - dataSource, - name, - symbol, - assetSubClassString: translate(assetSubClass ?? ''), - mode: SearchMode.HOLDING as const - }; - } - ); + return holdings.map(({ assetProfile }) => { + return { + assetSubClassString: translate(assetProfile.assetSubClass ?? ''), + currency: assetProfile.currency ?? '', + dataSource: assetProfile.dataSource, + mode: SearchMode.HOLDING as const, + name: assetProfile.name ?? '', + symbol: assetProfile.symbol + }; + }); }), takeUntilDestroyed(this.destroyRef) ); @@ -777,8 +780,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { return ( !!(dataSource && symbol) && getAssetProfileIdentifier({ - dataSource: holding.dataSource, - symbol: holding.symbol + dataSource: holding.assetProfile.dataSource, + symbol: holding.assetProfile.symbol }) === getAssetProfileIdentifier({ dataSource, symbol }) ); }); diff --git a/libs/ui/src/lib/mocks/holdings.ts b/libs/ui/src/lib/mocks/holdings.ts index b32eb527a..11f3bec0e 100644 --- a/libs/ui/src/lib/mocks/holdings.ts +++ b/libs/ui/src/lib/mocks/holdings.ts @@ -4,11 +4,11 @@ export const holdings: PortfolioPosition[] = [ { activitiesCount: 1, allocationInPercentage: 0.042990776363386086, - assetClass: 'EQUITY', - assetClassLabel: 'Equity', assetProfile: { assetClass: 'EQUITY', + assetClassLabel: 'Equity', assetSubClass: 'STOCK', + assetSubClassLabel: 'Stock', countries: [ { code: 'US', @@ -20,60 +20,40 @@ export const holdings: PortfolioPosition[] = [ currency: 'USD', dataSource: 'YAHOO', holdings: [], + name: 'Apple Inc', sectors: [ { name: 'Technology', weight: 1 } ], - symbol: 'AAPL' + symbol: 'AAPL', + url: 'https://www.apple.com' }, - assetSubClass: 'STOCK', - assetSubClassLabel: 'Stock', - countries: [ - { - code: 'US', - continent: 'North America', - name: 'United States', - weight: 1 - } - ], - currency: 'USD', - dataSource: 'YAHOO', dateOfFirstActivity: new Date('2021-12-01T00:00:00.000Z'), dividend: 0, grossPerformance: 3856, grossPerformancePercent: 0.46047289228564603, grossPerformancePercentWithCurrencyEffect: 0.46047289228564603, grossPerformanceWithCurrencyEffect: 3856, - holdings: [], investment: 8374, marketPrice: 244.6, - name: 'Apple Inc', netPerformance: 3855, netPerformancePercent: 0.460353475041796, netPerformancePercentWithCurrencyEffect: 0.036440677966101696, netPerformanceWithCurrencyEffect: 430, quantity: 50, - sectors: [ - { - name: 'Technology', - weight: 1 - } - ], - symbol: 'AAPL', tags: [], - url: 'https://www.apple.com', valueInBaseCurrency: 12230 }, { activitiesCount: 2, allocationInPercentage: 0.02377401948293552, - assetClass: 'EQUITY', - assetClassLabel: 'Equity', assetProfile: { assetClass: 'EQUITY', + assetClassLabel: 'Equity', assetSubClass: 'STOCK', + assetSubClassLabel: 'Stock', countries: [ { code: 'DE', @@ -85,60 +65,40 @@ export const holdings: PortfolioPosition[] = [ currency: 'EUR', dataSource: 'YAHOO', holdings: [], + name: 'Allianz SE', sectors: [ { name: 'Financial Services', weight: 1 } ], - symbol: 'ALV.DE' + symbol: 'ALV.DE', + url: 'https://www.allianz.com' }, - assetSubClass: 'STOCK', - assetSubClassLabel: 'Stock', - countries: [ - { - code: 'DE', - continent: 'Europe', - name: 'Germany', - weight: 1 - } - ], - currency: 'EUR', - dataSource: 'YAHOO', dateOfFirstActivity: new Date('2021-04-23T00:00:00.000Z'), dividend: 192, grossPerformance: 2226.700251889169, grossPerformancePercent: 0.49083842309827874, grossPerformancePercentWithCurrencyEffect: 0.29306136948826367, grossPerformanceWithCurrencyEffect: 1532.8272791336772, - holdings: [], investment: 4536.523929471033, marketPrice: 322.2, - name: 'Allianz SE', netPerformance: 2222.2921914357685, netPerformancePercent: 0.48986674069961134, netPerformancePercentWithCurrencyEffect: 0.034489367670592026, netPerformanceWithCurrencyEffect: 225.48257403052068, quantity: 20, - sectors: [ - { - name: 'Financial Services', - weight: 1 - } - ], - symbol: 'ALV.DE', tags: [], - url: 'https://www.allianz.com', valueInBaseCurrency: 6763.224181360202 }, { activitiesCount: 1, allocationInPercentage: 0.08038536990007467, - assetClass: 'EQUITY', - assetClassLabel: 'Equity', assetProfile: { assetClass: 'EQUITY', + assetClassLabel: 'Equity', assetSubClass: 'STOCK', + assetSubClassLabel: 'Stock', countries: [ { code: 'US', @@ -150,101 +110,73 @@ export const holdings: PortfolioPosition[] = [ currency: 'USD', dataSource: 'YAHOO', holdings: [], + name: 'Amazon.com, Inc.', sectors: [ { name: 'Consumer Discretionary', weight: 1 } ], - symbol: 'AMZN' + symbol: 'AMZN', + url: 'https://www.aboutamazon.com' }, - assetSubClass: 'STOCK', - assetSubClassLabel: 'Stock', - countries: [ - { - code: 'US', - continent: 'North America', - name: 'United States', - weight: 1 - } - ], - currency: 'USD', - dataSource: 'YAHOO', dateOfFirstActivity: new Date('2018-10-01T00:00:00.000Z'), dividend: 0, grossPerformance: 12758.05, grossPerformancePercent: 1.2619300787837724, grossPerformancePercentWithCurrencyEffect: 1.2619300787837724, grossPerformanceWithCurrencyEffect: 12758.05, - holdings: [], investment: 10109.95, marketPrice: 228.68, - name: 'Amazon.com, Inc.', netPerformance: 12677.26, netPerformancePercent: 1.253938941339967, netPerformancePercentWithCurrencyEffect: -0.037866008722316276, netPerformanceWithCurrencyEffect: -899.99926757812, quantity: 100, - sectors: [ - { - name: 'Consumer Discretionary', - weight: 1 - } - ], - symbol: 'AMZN', tags: [], - url: 'https://www.aboutamazon.com', valueInBaseCurrency: 22868 }, { activitiesCount: 1, allocationInPercentage: 0.19216416482928922, - assetClass: 'LIQUIDITY', - assetClassLabel: 'Liquidity', assetProfile: { assetClass: 'LIQUIDITY', - assetSubClass: 'CASH', + assetClassLabel: 'Liquidity', + assetSubClass: 'CRYPTOCURRENCY', + assetSubClassLabel: 'Cryptocurrency', countries: [], currency: 'USD', dataSource: 'COINGECKO', holdings: [], + name: 'Bitcoin', sectors: [], - symbol: 'bitcoin' + symbol: 'bitcoin', + url: undefined }, - assetSubClass: 'CRYPTOCURRENCY', - assetSubClassLabel: 'Cryptocurrency', - countries: [], - currency: 'USD', - dataSource: 'COINGECKO', dateOfFirstActivity: new Date('2017-08-16T00:00:00.000Z'), dividend: 0, grossPerformance: 52666.7898248, grossPerformancePercent: 26.333394912400003, grossPerformancePercentWithCurrencyEffect: 26.333394912400003, grossPerformanceWithCurrencyEffect: 52666.7898248, - holdings: [], investment: 1999.9999999999998, marketPrice: 97364, - name: 'Bitcoin', netPerformance: 52636.8898248, netPerformancePercent: 26.3184449124, netPerformancePercentWithCurrencyEffect: -0.04760906442310894, netPerformanceWithCurrencyEffect: -2732.737808972287, quantity: 0.5614682, - sectors: [], - symbol: 'bitcoin', tags: [], - url: undefined, valueInBaseCurrency: 54666.7898248 }, { activitiesCount: 1, allocationInPercentage: 0.04307127421937313, - assetClass: 'EQUITY', - assetClassLabel: 'Equity', assetProfile: { assetClass: 'EQUITY', + assetClassLabel: 'Equity', assetSubClass: 'STOCK', + assetSubClassLabel: 'Stock', countries: [ { code: 'US', @@ -256,60 +188,40 @@ export const holdings: PortfolioPosition[] = [ currency: 'USD', dataSource: 'YAHOO', holdings: [], + name: 'Microsoft Corporation', sectors: [ { name: 'Technology', weight: 1 } ], - symbol: 'MSFT' + symbol: 'MSFT', + url: 'https://www.microsoft.com' }, - assetSubClass: 'STOCK', - assetSubClassLabel: 'Stock', - countries: [ - { - code: 'US', - continent: 'North America', - name: 'United States', - weight: 1 - } - ], - currency: 'USD', - dataSource: 'YAHOO', dateOfFirstActivity: new Date('2023-01-03T00:00:00.000Z'), dividend: 0, grossPerformance: 5065.5, grossPerformancePercent: 0.7047750229568411, grossPerformancePercentWithCurrencyEffect: 0.7047750229568411, grossPerformanceWithCurrencyEffect: 5065.5, - holdings: [], investment: 7187.4, marketPrice: 408.43, - name: 'Microsoft Corporation', netPerformance: 5065.5, netPerformancePercent: 0.7047750229568411, netPerformancePercentWithCurrencyEffect: -0.015973588391056275, netPerformanceWithCurrencyEffect: -198.899926757814, quantity: 30, - sectors: [ - { - name: 'Technology', - weight: 1 - } - ], - symbol: 'MSFT', tags: [], - url: 'https://www.microsoft.com', valueInBaseCurrency: 12252.9 }, { activitiesCount: 1, allocationInPercentage: 0.18762679306394897, - assetClass: 'EQUITY', - assetClassLabel: 'Equity', assetProfile: { assetClass: 'EQUITY', + assetClassLabel: 'Equity', assetSubClass: 'STOCK', + assetSubClassLabel: 'Stock', countries: [ { code: 'US', @@ -321,60 +233,40 @@ export const holdings: PortfolioPosition[] = [ currency: 'USD', dataSource: 'YAHOO', holdings: [], + name: 'Tesla, Inc.', sectors: [ { name: 'Consumer Discretionary', weight: 1 } ], - symbol: 'TSLA' + symbol: 'TSLA', + url: 'https://www.tesla.com' }, - assetSubClass: 'STOCK', - assetSubClassLabel: 'Stock', - countries: [ - { - code: 'US', - continent: 'North America', - name: 'United States', - weight: 1 - } - ], - currency: 'USD', - dataSource: 'YAHOO', dateOfFirstActivity: new Date('2017-01-03T00:00:00.000Z'), dividend: 0, grossPerformance: 51227.500000005, grossPerformancePercent: 23.843379101756675, grossPerformancePercentWithCurrencyEffect: 23.843379101756675, grossPerformanceWithCurrencyEffect: 51227.500000005, - holdings: [], investment: 2148.499999995, marketPrice: 355.84, - name: 'Tesla, Inc.', netPerformance: 51197.500000005, netPerformancePercent: 23.829415871596066, netPerformancePercentWithCurrencyEffect: -0.12051410125545206, netPerformanceWithCurrencyEffect: -7314.00091552734, quantity: 150, - sectors: [ - { - name: 'Consumer Discretionary', - weight: 1 - } - ], - symbol: 'TSLA', tags: [], - url: 'https://www.tesla.com', valueInBaseCurrency: 53376 }, { activitiesCount: 5, allocationInPercentage: 0.053051250766657634, - assetClass: 'EQUITY', - assetClassLabel: 'Equity', assetProfile: { assetClass: 'EQUITY', + assetClassLabel: 'Equity', assetSubClass: 'ETF', + assetSubClassLabel: 'ETF', countries: [ { code: 'US', @@ -386,50 +278,30 @@ export const holdings: PortfolioPosition[] = [ currency: 'USD', dataSource: 'YAHOO', holdings: [], + name: 'Vanguard Total Stock Market Index Fund ETF Shares', sectors: [ { name: 'Equity', weight: 1 } ], - symbol: 'VTI' + symbol: 'VTI', + url: 'https://www.vanguard.com' }, - assetSubClass: 'ETF', - assetSubClassLabel: 'ETF', - countries: [ - { - code: 'US', - weight: 1, - continent: 'North America', - name: 'United States' - } - ], - currency: 'USD', - dataSource: 'YAHOO', dateOfFirstActivity: new Date('2019-03-01T00:00:00.000Z'), dividend: 0, grossPerformance: 6845.8, grossPerformancePercent: 1.0164758094605268, grossPerformancePercentWithCurrencyEffect: 1.0164758094605268, grossPerformanceWithCurrencyEffect: 6845.8, - holdings: [], investment: 8246.2, marketPrice: 301.84, - name: 'Vanguard Total Stock Market Index Fund ETF Shares', netPerformance: 6746.3, netPerformancePercent: 1.0017018833976383, netPerformancePercentWithCurrencyEffect: 0.01085061564051406, netPerformanceWithCurrencyEffect: 161.99969482422, quantity: 50, - sectors: [ - { - name: 'Equity', - weight: 1 - } - ], - symbol: 'VTI', tags: [], - url: 'https://www.vanguard.com', valueInBaseCurrency: 15092 } ]; diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html index f5dbac698..33bde3fd6 100644 --- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -29,18 +29,19 @@ [compareWith]="holdingComparisonFunction" > {{ - filterForm.get('holding')?.value?.name + filterForm.get('holding')?.value?.assetProfile?.name }} - @for (holding of holdings(); track holding.name) { + @for (holding of holdings(); track holding.assetProfile.name) {
{{ holding.name }}{{ holding.assetProfile.name }}
{{ holding.symbol | gfSymbol }} · {{ holding.currency }}{{ holding.assetProfile.symbol | gfSymbol }} · + {{ holding.assetProfile.currency }}
diff --git a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts index c1f82315c..20e8b0f0f 100644 --- a/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts +++ b/libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.ts @@ -109,7 +109,8 @@ export class GfPortfolioFilterFormComponent } return ( - getAssetProfileIdentifier(option) === getAssetProfileIdentifier(value) + getAssetProfileIdentifier(option.assetProfile) === + getAssetProfileIdentifier(value.assetProfile) ); } From 697ef59e3b58bebc5c21a9e482e4f5643390f316 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 31 May 2026 07:17:55 +0200 Subject: [PATCH 12/37] Feature/add support for web fetch in fetch service (#6960) * Add support for web fetch * Update changelog --- CHANGELOG.md | 4 + apps/api/src/services/fetch/fetch.module.ts | 2 + apps/api/src/services/fetch/fetch.service.ts | 154 +++++++++++++++++- .../interfaces/web-fetch-route.interface.ts | 19 +++ libs/common/src/lib/config.ts | 1 + 5 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 apps/api/src/services/fetch/interfaces/web-fetch-route.interface.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index e0c416fb0..d094f394b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Added + +- Added support for routing selected requests through the _OpenRouter_ `web_fetch` tool in the `FetchService` + ### Changed - Extended the countries mapping in the data enhancer for asset profile data via _Trackinsight_ diff --git a/apps/api/src/services/fetch/fetch.module.ts b/apps/api/src/services/fetch/fetch.module.ts index f98f2f45c..16e6f5f5d 100644 --- a/apps/api/src/services/fetch/fetch.module.ts +++ b/apps/api/src/services/fetch/fetch.module.ts @@ -1,9 +1,11 @@ import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service'; +import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { Module } from '@nestjs/common'; @Module({ exports: [FetchService], + imports: [PropertyModule], providers: [FetchService] }) export class FetchModule {} diff --git a/apps/api/src/services/fetch/fetch.service.ts b/apps/api/src/services/fetch/fetch.service.ts index b3bd022d9..f32e56a1c 100644 --- a/apps/api/src/services/fetch/fetch.service.ts +++ b/apps/api/src/services/fetch/fetch.service.ts @@ -1,15 +1,35 @@ import { redactPaths } from '@ghostfolio/api/helper/object.helper'; +import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { + PROPERTY_API_KEY_OPENROUTER, + PROPERTY_OPENROUTER_MODEL, + PROPERTY_WEB_FETCH_ROUTES +} from '@ghostfolio/common/config'; -import { Injectable, Logger } from '@nestjs/common'; +import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; +import { createOpenRouter } from '@openrouter/ai-sdk-provider'; +import { generateText, jsonSchema, tool } from 'ai'; +import ms from 'ms'; + +import { WebFetchRoute } from './interfaces/web-fetch-route.interface'; @Injectable() -export class FetchService { +export class FetchService implements OnModuleInit { private static readonly REDACTED_QUERY_PARAM_NAMES = ['apikey', 'api_token']; + private static readonly WEB_FETCH_TIMEOUT = ms('30 seconds'); + + private webFetchRoutes: WebFetchRoute[] = []; + + public constructor(private readonly propertyService: PropertyService) {} - public async fetch( - input: RequestInfo | URL, - init?: RequestInit - ): Promise { + public async onModuleInit() { + this.webFetchRoutes = + (await this.propertyService.getByKey( + PROPERTY_WEB_FETCH_ROUTES + )) ?? []; + } + + public async fetch(input: RequestInfo | URL, init?: RequestInit) { const method = ( init?.method ?? (input instanceof Request ? input.method : undefined) ?? @@ -21,6 +41,21 @@ export class FetchService { Logger.debug(`${method} ${urlRedacted}`, 'FetchService'); + if (method === 'GET') { + const webFetchRoute = this.getMatchingWebFetchRoute(url); + + if (webFetchRoute) { + const response = await this.fetchViaWebFetchTool({ + url, + webFetchRoute + }); + + if (response) { + return response; + } + } + } + try { return await globalThis.fetch(input, init); } catch (error) { @@ -40,6 +75,113 @@ export class FetchService { } } + private async fetchViaWebFetchTool({ + url, + webFetchRoute + }: { + url: string; + webFetchRoute: WebFetchRoute; + }) { + const [openRouterApiKey, openRouterModel] = await Promise.all([ + this.propertyService.getByKey(PROPERTY_API_KEY_OPENROUTER), + this.propertyService.getByKey(PROPERTY_OPENROUTER_MODEL) + ]); + + if (!openRouterApiKey || !openRouterModel) { + return undefined; + } + + try { + const openRouterService = createOpenRouter({ apiKey: openRouterApiKey }); + + const { sources, text } = await generateText({ + model: openRouterService.chat(openRouterModel), + prompt: [ + 'You have access to a web_fetch tool. You MUST call it to retrieve the URL below, do not answer from prior knowledge.', + 'Return the fetched response body exactly as received: raw body only, no commentary, no Markdown, and no code fences.', + `URL: ${url}` + ].join('\n'), + timeout: FetchService.WEB_FETCH_TIMEOUT, + tools: { + // Provider-defined tool: lets OpenRouter perform the actual web + // request server-side via its `web_fetch` engine. `id` and `args` + // are the OpenRouter-specific identifiers; the input schema is left + // open as the arguments are supplied by the model. + web_fetch: tool({ + args: { engine: 'openrouter' }, + id: 'openrouter.web_fetch', + inputSchema: jsonSchema({ + additionalProperties: true, + type: 'object' + }), + type: 'provider' + }) + } + }); + + const candidates = [ + ...(sources ?? []).map((source) => { + return source.providerMetadata?.openrouter?.content; + }), + text + ]; + + for (const candidate of candidates) { + if (typeof candidate !== 'string') { + continue; + } + + const body = candidate.trim(); + + if (!body) { + continue; + } + + if (webFetchRoute.responseContentType?.includes('application/json')) { + try { + JSON.parse(body); + } catch { + continue; + } + } + + Logger.debug( + `Routed ${this.redactUrl(url)} via web fetch tool`, + 'FetchService' + ); + + return new Response(body, { + headers: webFetchRoute.responseContentType + ? { 'content-type': webFetchRoute.responseContentType } + : undefined + }); + } + + return undefined; + } catch (error) { + Logger.error( + `Web fetch tool failed for ${this.redactUrl(url)}: ${ + error instanceof Error ? error.message : String(error) + }`, + 'FetchService' + ); + + return undefined; + } + } + + private getMatchingWebFetchRoute(url: string) { + try { + const { hostname } = new URL(url); + + return this.webFetchRoutes.find(({ domain }) => { + return hostname === domain || hostname.endsWith(`.${domain}`); + }); + } catch { + return undefined; + } + } + private redactUrl(rawUrl: string): string { try { const url = new URL(rawUrl); diff --git a/apps/api/src/services/fetch/interfaces/web-fetch-route.interface.ts b/apps/api/src/services/fetch/interfaces/web-fetch-route.interface.ts new file mode 100644 index 000000000..efff09398 --- /dev/null +++ b/apps/api/src/services/fetch/interfaces/web-fetch-route.interface.ts @@ -0,0 +1,19 @@ +/** + * Routes outgoing GET requests for a given domain through the OpenRouter + * `web_fetch` tool instead of a direct network request. + * + * Configured via the `WEB_FETCH_ROUTES` property as a JSON array, e.g. + * + * [ + * { + * "domain": "example.com", + * "responseContentType": "application/json" + * } + * ] + * + * Matches the domain itself and its subdomains (e.g. `api.example.com`). + */ +export interface WebFetchRoute { + domain: string; + responseContentType?: string; +} diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 113dffe4a..28d902d71 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -256,6 +256,7 @@ export const PROPERTY_SLACK_COMMUNITY_USERS = 'SLACK_COMMUNITY_USERS'; export const PROPERTY_STRIPE_CONFIG = 'STRIPE_CONFIG'; export const PROPERTY_SYSTEM_MESSAGE = 'SYSTEM_MESSAGE'; export const PROPERTY_UPTIME = 'UPTIME'; +export const PROPERTY_WEB_FETCH_ROUTES = 'WEB_FETCH_ROUTES'; export const QUEUE_JOB_STATUS_LIST = [ 'active', From 09794639b5994dc1948731bbf26ff99c144e801e Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jun 2026 07:35:19 +0200 Subject: [PATCH 13/37] Bugfix/environment variable expansion when debugging in Visual Studio Code (#6977) * Fix environment variable expansion * Update changelog --- .vscode/launch.json | 12 ++++++++++-- CHANGELOG.md | 4 ++++ tools/load-env.ts | 4 ++++ 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 tools/load-env.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index c1f19e7f0..6d36314d2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,12 +18,20 @@ "autoAttachChildProcesses": true, "console": "integratedTerminal", "cwd": "${workspaceFolder}/apps/api", - "envFile": "${workspaceFolder}/.env", + "env": { + "GHOSTFOLIO_ENV_FILE": "${workspaceFolder}/.env" + }, "name": "Debug API", "outFiles": ["${workspaceFolder}/dist/apps/api/**/*.js"], "program": "${workspaceFolder}/apps/api/src/main.ts", "request": "launch", - "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "runtimeArgs": [ + "--nolazy", + "-r", + "ts-node/register", + "-r", + "${workspaceFolder}/tools/load-env.ts" + ], "skipFiles": [ "${workspaceFolder}/node_modules/**/*.js", "/**/*.js" diff --git a/CHANGELOG.md b/CHANGELOG.md index d094f394b..558cd64e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the countries mapping in the data enhancer for asset profile data via _Trackinsight_ - Removed the deprecated attributes (`assetClass`, `assetClassLabel`, `assetSubClass`, `assetSubClassLabel`, `countries`, `currency`, `dataSource`, `holdings`, `name`, `sectors`, `symbol` and `url`) from the holdings of the portfolio details endpoint response +### Fixed + +- Fixed the environment variable expansion in the `.env` file when debugging via _Visual Studio Code_ + ## 3.6.0 - 2026-05-28 ### Added diff --git a/tools/load-env.ts b/tools/load-env.ts new file mode 100644 index 000000000..3dd0d03c7 --- /dev/null +++ b/tools/load-env.ts @@ -0,0 +1,4 @@ +import { config } from 'dotenv'; +import { expand } from 'dotenv-expand'; + +expand(config({ path: process.env.GHOSTFOLIO_ENV_FILE, quiet: true })); From 60be4de9a5c91519a5e19501940783972c7b5dd7 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Tue, 2 Jun 2026 21:57:09 +0700 Subject: [PATCH 14/37] Task/improve type safety in analysis page component (#6965) * fix(client): resolve errors in analysis page component * feat(client): replace constructor based DI with inject functions * feat(client): convert to view child signal * feat(client): enforce encapsulation * feat(client): enforce readability * feat(client): replace deprecated getDeviceInfo * feat(client): convert mode to signal --- .../analysis/analysis-page.component.ts | 153 ++++++++++-------- .../portfolio/analysis/analysis-page.html | 8 +- 2 files changed, 88 insertions(+), 73 deletions(-) diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index 03fd0767a..6c49a9030 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2,7 +2,10 @@ import { GfBenchmarkComparatorComponent } from '@ghostfolio/client/components/be import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; +import { + DEFAULT_DATE_RANGE, + NUMERICAL_PRECISION_THRESHOLD_6_FIGURES +} from '@ghostfolio/common/config'; import { HistoricalDataItem, InvestmentItem, @@ -24,9 +27,12 @@ import { Clipboard } from '@angular/cdk/clipboard'; import { ChangeDetectorRef, Component, + computed, DestroyRef, + inject, OnInit, - ViewChild + signal, + viewChild } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { MatButtonModule } from '@angular/material/button'; @@ -64,53 +70,57 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; templateUrl: './analysis-page.html' }) export class GfAnalysisPageComponent implements OnInit { - @ViewChild(MatMenuTrigger) actionsMenuButton!: MatMenuTrigger; - - public benchmark: Partial; - public benchmarkDataItems: HistoricalDataItem[] = []; - public benchmarks: Partial[]; - public bottom3: PortfolioPosition[]; - public deviceType: string; - public dividendsByGroup: InvestmentItem[]; - public dividendTimelineDataLabel = $localize`Dividend`; - public firstOrderDate: Date; - public hasImpersonationId: boolean; - public hasPermissionToReadAiPrompt: boolean; - public investments: InvestmentItem[]; - public investmentTimelineDataLabel = $localize`Investment`; - public investmentsByGroup: InvestmentItem[]; - public isLoadingAnalysisPrompt: boolean; - public isLoadingBenchmarkComparator: boolean; - public isLoadingDividendTimelineChart: boolean; - public isLoadingInvestmentChart: boolean; - public isLoadingInvestmentTimelineChart: boolean; - public isLoadingPortfolioPrompt: boolean; - public mode: GroupBy = 'month'; - public modeOptions: ToggleOption[] = [ + protected benchmark?: Partial; + protected benchmarkDataItems: HistoricalDataItem[] = []; + protected readonly benchmarks: Partial[]; + protected bottom3: PortfolioPosition[]; + protected dividendsByGroup: InvestmentItem[]; + protected readonly dividendTimelineDataLabel = $localize`Dividend`; + protected hasImpersonationId: boolean; + protected hasPermissionToReadAiPrompt: boolean; + protected investments: InvestmentItem[]; + protected readonly investmentTimelineDataLabel = $localize`Investment`; + protected investmentsByGroup: InvestmentItem[]; + protected isLoadingAnalysisPrompt: boolean; + protected isLoadingBenchmarkComparator: boolean; + protected isLoadingDividendTimelineChart: boolean; + protected isLoadingInvestmentChart: boolean; + protected isLoadingInvestmentTimelineChart: boolean; + protected isLoadingPortfolioPrompt: boolean; + protected readonly mode = signal('month'); + protected readonly modeOptions: ToggleOption[] = [ { label: $localize`Monthly`, value: 'month' }, { label: $localize`Yearly`, value: 'year' } ]; - public performance: PortfolioPerformance; - public performanceDataItems: HistoricalDataItem[]; - public performanceDataItemsInPercentage: HistoricalDataItem[]; - public portfolioEvolutionDataLabel = $localize`Investment`; - public precision = 2; - public streaks: PortfolioInvestmentsResponse['streaks']; - public top3: PortfolioPosition[]; - public unitCurrentStreak: string; - public unitLongestStreak: string; - public user: User; - - public constructor( - private changeDetectorRef: ChangeDetectorRef, - private clipboard: Clipboard, - private dataService: DataService, - private destroyRef: DestroyRef, - private deviceDetectorService: DeviceDetectorService, - private impersonationStorageService: ImpersonationStorageService, - private snackBar: MatSnackBar, - private userService: UserService - ) { + protected performance: PortfolioPerformance; + protected performanceDataItems: HistoricalDataItem[]; + protected performanceDataItemsInPercentage: HistoricalDataItem[]; + protected readonly portfolioEvolutionDataLabel = $localize`Investment`; + protected precision = 2; + protected streaks: PortfolioInvestmentsResponse['streaks']; + protected top3: PortfolioPosition[]; + protected unitCurrentStreak: string; + protected unitLongestStreak: string; + protected user: User; + + private readonly actionsMenuButton = viewChild.required(MatMenuTrigger); + private readonly deviceType = computed( + () => this.deviceDetectorService.deviceInfo().deviceType + ); + private firstOrderDate: Date; + + private readonly changeDetectorRef = inject(ChangeDetectorRef); + private readonly clipboard = inject(Clipboard); + private readonly dataService = inject(DataService); + private readonly destroyRef = inject(DestroyRef); + private readonly deviceDetectorService = inject(DeviceDetectorService); + private readonly impersonationStorageService = inject( + ImpersonationStorageService + ); + private readonly snackBar = inject(MatSnackBar); + private readonly userService = inject(UserService); + + public constructor() { const { benchmarks } = this.dataService.fetchInfo(); this.benchmarks = benchmarks; @@ -123,14 +133,16 @@ export class GfAnalysisPageComponent implements OnInit { ? undefined : this.user?.settings?.savingsRate; - return this.mode === 'year' + if (savingsRatePerMonth === undefined) { + return undefined; + } + + return this.mode() === 'year' ? savingsRatePerMonth * 12 : savingsRatePerMonth; } public ngOnInit() { - this.deviceType = this.deviceDetectorService.getDeviceInfo().deviceType; - this.impersonationStorageService .onChangeHasImpersonation() .pipe(takeUntilDestroyed(this.destroyRef)) @@ -158,7 +170,7 @@ export class GfAnalysisPageComponent implements OnInit { }); } - public onChangeBenchmark(symbolProfileId: string) { + protected onChangeBenchmark(symbolProfileId: string) { this.dataService .putUserSetting({ benchmark: symbolProfileId }) .pipe(takeUntilDestroyed(this.destroyRef)) @@ -174,12 +186,12 @@ export class GfAnalysisPageComponent implements OnInit { }); } - public onChangeGroupBy(aMode: GroupBy) { - this.mode = aMode; + protected onChangeGroupBy(aMode: GroupBy) { + this.mode.set(aMode); this.fetchDividendsAndInvestments(); } - public onCopyPromptToClipboard(mode: AiPromptMode) { + protected onCopyPromptToClipboard(mode: AiPromptMode) { if (mode === 'analysis') { this.isLoadingAnalysisPrompt = true; } else if (mode === 'portfolio') { @@ -210,7 +222,7 @@ export class GfAnalysisPageComponent implements OnInit { window.open('https://duck.ai', '_blank'); }); - this.actionsMenuButton.closeMenu(); + this.actionsMenuButton().closeMenu(); if (mode === 'analysis') { this.isLoadingAnalysisPrompt = false; @@ -227,8 +239,8 @@ export class GfAnalysisPageComponent implements OnInit { this.dataService .fetchDividends({ filters: this.userService.getFilters(), - groupBy: this.mode, - range: this.user?.settings?.dateRange + groupBy: this.mode(), + range: this.user?.settings?.dateRange ?? DEFAULT_DATE_RANGE }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ dividends }) => { @@ -242,15 +254,15 @@ export class GfAnalysisPageComponent implements OnInit { this.dataService .fetchInvestments({ filters: this.userService.getFilters(), - groupBy: this.mode, - range: this.user?.settings?.dateRange + groupBy: this.mode(), + range: this.user?.settings?.dateRange ?? DEFAULT_DATE_RANGE }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ investments, streaks }) => { this.investmentsByGroup = investments; this.streaks = streaks; this.unitCurrentStreak = - this.mode === 'year' + this.mode() === 'year' ? this.streaks?.currentStreak === 1 ? translate('YEAR') : translate('YEARS') @@ -258,7 +270,7 @@ export class GfAnalysisPageComponent implements OnInit { ? translate('MONTH') : translate('MONTHS'); this.unitLongestStreak = - this.mode === 'year' + this.mode() === 'year' ? this.streaks?.longestStreak === 1 ? translate('YEAR') : translate('YEARS') @@ -278,7 +290,7 @@ export class GfAnalysisPageComponent implements OnInit { this.dataService .fetchPortfolioPerformance({ filters: this.userService.getFilters(), - range: this.user?.settings?.dateRange + range: this.user?.settings?.dateRange ?? DEFAULT_DATE_RANGE }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ chart, firstOrderDate, performance }) => { @@ -298,13 +310,16 @@ export class GfAnalysisPageComponent implements OnInit { valueInPercentage, valueWithCurrencyEffect } - ] of chart.entries()) { + ] of (chart ?? []).entries()) { + // Ignore first item where value is 0 if (index > 0 || this.user?.settings?.dateRange === 'max') { - // Ignore first item where value is 0 - this.investments.push({ - date, - investment: totalInvestmentValueWithCurrencyEffect - }); + if (totalInvestmentValueWithCurrencyEffect !== undefined) { + this.investments.push({ + date, + investment: totalInvestmentValueWithCurrencyEffect + }); + } + this.performanceDataItems.push({ date, value: isNumber(valueWithCurrencyEffect) @@ -320,7 +335,7 @@ export class GfAnalysisPageComponent implements OnInit { } if ( - this.deviceType === 'mobile' && + this.deviceType() === 'mobile' && this.performance.currentValueInBaseCurrency >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES ) { @@ -387,7 +402,7 @@ export class GfAnalysisPageComponent implements OnInit { dataSource, symbol, filters: this.userService.getFilters(), - range: this.user?.settings?.dateRange, + range: this.user?.settings?.dateRange ?? DEFAULT_DATE_RANGE, startDate: this.firstOrderDate }) .pipe(takeUntilDestroyed(this.destroyRef)) diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index b93be9182..ec90fccec 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -442,7 +442,7 @@
Date: Tue, 2 Jun 2026 19:30:01 +0200 Subject: [PATCH 15/37] Task/upgrade Nx to version 22.7.5 (#6962) * Upgrade Nx to version 22.7.5 * Update changelog --- CHANGELOG.md | 1 + package-lock.json | 678 +++++++++++++++++++++++----------------------- package.json | 22 +- 3 files changed, 347 insertions(+), 354 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 558cd64e6..60a33a4b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Extended the countries mapping in the data enhancer for asset profile data via _Trackinsight_ - Removed the deprecated attributes (`assetClass`, `assetClassLabel`, `assetSubClass`, `assetSubClassLabel`, `countries`, `currency`, `dataSource`, `holdings`, `name`, `sectors`, `symbol` and `url`) from the holdings of the portfolio details endpoint response +- Upgraded `Nx` from version `22.7.2` to `22.7.5` ### Fixed diff --git a/package-lock.json b/package-lock.json index c9abbd50d..6330ef21f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -114,16 +114,16 @@ "@eslint/js": "9.35.0", "@nestjs/schematics": "11.1.0", "@nestjs/testing": "11.1.21", - "@nx/angular": "22.7.2", - "@nx/eslint-plugin": "22.7.2", - "@nx/jest": "22.7.2", - "@nx/js": "22.7.2", - "@nx/module-federation": "22.7.2", - "@nx/nest": "22.7.2", - "@nx/node": "22.7.2", - "@nx/storybook": "22.7.2", - "@nx/web": "22.7.2", - "@nx/workspace": "22.7.2", + "@nx/angular": "22.7.5", + "@nx/eslint-plugin": "22.7.5", + "@nx/jest": "22.7.5", + "@nx/js": "22.7.5", + "@nx/module-federation": "22.7.5", + "@nx/nest": "22.7.5", + "@nx/node": "22.7.5", + "@nx/storybook": "22.7.5", + "@nx/web": "22.7.5", + "@nx/workspace": "22.7.5", "@schematics/angular": "21.2.6", "@storybook/addon-docs": "10.1.10", "@storybook/addon-themes": "10.1.10", @@ -150,7 +150,7 @@ "jest": "30.2.0", "jest-environment-jsdom": "30.2.0", "jest-preset-angular": "16.0.0", - "nx": "22.7.2", + "nx": "22.7.5", "prettier": "3.8.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "7.8.0", @@ -7382,13 +7382,13 @@ } }, "node_modules/@module-federation/bridge-react-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-yxDv/FJoLiKo2eqIcEWvSnSpJgyYkCzJvNaFsQ2QE3rNv68IeAarlSzCo+d0QyQoPJnTETyHsOh1SSBazIzecw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-2.5.0.tgz", + "integrity": "sha512-Ux9XVW//K6K+KHKPdc0Jnc7RtTpZaEXgbVhp5yovtFkCJVt8hEClcTeuI18MvvLiV/q2hUpCU5Wsf9zNaIYStQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "2.4.0", + "@module-federation/sdk": "2.5.0", "@types/semver": "7.5.8", "semver": "7.6.3" } @@ -7407,14 +7407,14 @@ } }, "node_modules/@module-federation/cli": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.4.0.tgz", - "integrity": "sha512-c46g9srroc2hDfrlHyd4Y404SLnw3v9t7Kqij+yK01Hx8C2FyZpyanTGUHVyrmzqp/0y3lPrWURUHkHfk/cJQA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-2.5.0.tgz", + "integrity": "sha512-+czXA6yoiiF9W6+YEOCpQE6zpGZpA89X0oCEz3EaWPTkL4chEbxurjpME8CMnJk9iuFxl167+cBQiQlVBiHGGg==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "2.4.0", - "@module-federation/sdk": "2.4.0", + "@module-federation/dts-plugin": "2.5.0", + "@module-federation/sdk": "2.5.0", "commander": "11.1.0", "jiti": "2.4.2" }, @@ -7426,16 +7426,16 @@ } }, "node_modules/@module-federation/dts-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.4.0.tgz", - "integrity": "sha512-sa6v5ByyqMRHzpwDu0zc7s5mZ39EFIkG0jkRfZU09pzkrJEIy4uZ1Kt9SLysFB8RBMIAvAakAfqDlVWvf1lndg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-2.5.0.tgz", + "integrity": "sha512-q7KDhJ5tn2HrUV7uMuh/L3TaaztUosE+4LAb90sxx0pPPqWRwlpBpxu1REubv5BWXmU1K/Ozn14u6jRbjLVaGA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.4.0", - "@module-federation/managers": "2.4.0", - "@module-federation/sdk": "2.4.0", - "@module-federation/third-party-dts-extractor": "2.4.0", + "@module-federation/error-codes": "2.5.0", + "@module-federation/managers": "2.5.0", + "@module-federation/sdk": "2.5.0", + "@module-federation/third-party-dts-extractor": "2.5.0", "adm-zip": "0.5.10", "ansi-colors": "4.1.3", "isomorphic-ws": "5.0.0", @@ -7464,23 +7464,23 @@ } }, "node_modules/@module-federation/enhanced": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.4.0.tgz", - "integrity": "sha512-NiccK03x7V6bK2LvJNuW520kT+Onx+LJe8lyPsENjXctECCIFJdJOmYr8ABif/kLayWKrrYCzCGVNNiQXANEGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "2.4.0", - "@module-federation/cli": "2.4.0", - "@module-federation/dts-plugin": "2.4.0", - "@module-federation/error-codes": "2.4.0", - "@module-federation/inject-external-runtime-core-plugin": "2.4.0", - "@module-federation/managers": "2.4.0", - "@module-federation/manifest": "2.4.0", - "@module-federation/rspack": "2.4.0", - "@module-federation/runtime-tools": "2.4.0", - "@module-federation/sdk": "2.4.0", - "@module-federation/webpack-bundler-runtime": "2.4.0", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-2.5.0.tgz", + "integrity": "sha512-P91tzwyKSCQ6AwirqvAvTqWqmTY79ndpH0uenejFw+bbLpWrjuY0q+iZUXCV/7CSNmqwH2bkA/ssuyZljmcMVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/bridge-react-webpack-plugin": "2.5.0", + "@module-federation/cli": "2.5.0", + "@module-federation/dts-plugin": "2.5.0", + "@module-federation/error-codes": "2.5.0", + "@module-federation/inject-external-runtime-core-plugin": "2.5.0", + "@module-federation/managers": "2.5.0", + "@module-federation/manifest": "2.5.0", + "@module-federation/rspack": "2.5.0", + "@module-federation/runtime-tools": "2.5.0", + "@module-federation/sdk": "2.5.0", + "@module-federation/webpack-bundler-runtime": "2.5.0", "schema-utils": "4.3.0", "tapable": "2.3.0", "upath": "2.0.1" @@ -7544,56 +7544,56 @@ } }, "node_modules/@module-federation/error-codes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.4.0.tgz", - "integrity": "sha512-ktCZtwOoiKR1URJyBt223OsOFAUvc13rICYif55mt7+DomtELlh5FicnEz6mPLBUwmNM9vyBMvkxOdp+fQ5oUg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-2.5.0.tgz", + "integrity": "sha512-sq05/8Gp3csy1nr2/f76K3vLy0/xRqVtP71ibGy8BiLg7h1UxWN7G4EwAKSrPZ4FnsERGeFlIszg5Z+MqlwhFg==", "dev": true, "license": "MIT" }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.4.0.tgz", - "integrity": "sha512-GucUMQmQXcnJC/OnJGvMz3Qy7ap8nAffhQPwDpOSi0Qwm+Iq/ppzG8N3tlLBDmv/O8hiF8HHlg789XK2kcCQtg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-2.5.0.tgz", + "integrity": "sha512-e2KyTHpesBrPXGHMh4d4+s2xBiNoxbiFJkPRYHMCl81a/Gu+byrMkriZcV4VM/TFvBIlrgOJisVc1nnBI5UDRQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@module-federation/runtime-tools": "2.4.0" + "@module-federation/runtime-tools": "2.5.0" } }, "node_modules/@module-federation/managers": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.4.0.tgz", - "integrity": "sha512-Z8j6aog44G1gt4yIAaeDowwZ7xg0aAxTA1Hq69euJK9cR9MDEaLbLUk57jDoiRj6xLwlCiw7ozY+U15BQATk6Q==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-2.5.0.tgz", + "integrity": "sha512-9b5mU/7OYbKrYUJmhZ1kkfeJCZqR7qX6/FWp+oOfZMzUynN7Rb41dwoUs3TdnOKzbZ3CCwtZ2WsR4pF9ZNvuJA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/sdk": "2.4.0", + "@module-federation/sdk": "2.5.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/manifest": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.4.0.tgz", - "integrity": "sha512-ZL+W5rbtgRf9TWRP7Dupt/Svia4bJEOS6gWSj9jzemiLPRPkMO5hjWZKVHIc8oG+Vb25yzozFMmQ+luGi695wg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-2.5.0.tgz", + "integrity": "sha512-pmwQCGWjM2oKY7CkR7nEDOfMK0bNFJUifuDxuOB5iOWhU+Rp92UyyBI9IbJAtiISTSFGtuKRy40peJGvQq2VcQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/dts-plugin": "2.4.0", - "@module-federation/managers": "2.4.0", - "@module-federation/sdk": "2.4.0", + "@module-federation/dts-plugin": "2.5.0", + "@module-federation/managers": "2.5.0", + "@module-federation/sdk": "2.5.0", "find-pkg": "2.0.0" } }, "node_modules/@module-federation/node": { - "version": "2.7.42", - "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.42.tgz", - "integrity": "sha512-aX/T4L9bPbOgNLIW+30k/dA2Iohoy9/jf4yG1ka6Hkuo5h7iEBeZiQkwIqC06cnCbtKL1HnAiYlXHmrDPW5xvg==", + "version": "2.7.43", + "resolved": "https://registry.npmjs.org/@module-federation/node/-/node-2.7.43.tgz", + "integrity": "sha512-oKoLm7dqb5EvkiNIfsEdLmmBX7XLWHtPSx3M9kEYuXAaNAppoRWC9WtgrrZYXWErB2BG9wxMlx/8Xq3awRUCdQ==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/enhanced": "2.4.0", - "@module-federation/runtime": "2.4.0", - "@module-federation/sdk": "2.4.0", + "@module-federation/enhanced": "2.5.0", + "@module-federation/runtime": "2.5.0", + "@module-federation/sdk": "2.5.0", "encoding": "0.1.13", "node-fetch": "2.7.0", "tapable": "2.3.0" @@ -7608,19 +7608,19 @@ } }, "node_modules/@module-federation/rspack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.4.0.tgz", - "integrity": "sha512-NWH5Vaj/fA9R7PfbwTuE1Ty/pfiAt12On0E3FzoeVPCyb5MxO1i0z+xxRHbPhF4ZOrAPGEMaMQ8Z9vH94EiElw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-2.5.0.tgz", + "integrity": "sha512-OAFMpMXuLEQFmWBuC1I7LNDQ8N3CDANXe0YGPWkIPNxKq5Tj/KNfDidmutoYgvXlZKOM4yKBKBsL6Xt/UvtOIw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/bridge-react-webpack-plugin": "2.4.0", - "@module-federation/dts-plugin": "2.4.0", - "@module-federation/inject-external-runtime-core-plugin": "2.4.0", - "@module-federation/managers": "2.4.0", - "@module-federation/manifest": "2.4.0", - "@module-federation/runtime-tools": "2.4.0", - "@module-federation/sdk": "2.4.0" + "@module-federation/bridge-react-webpack-plugin": "2.5.0", + "@module-federation/dts-plugin": "2.5.0", + "@module-federation/inject-external-runtime-core-plugin": "2.5.0", + "@module-federation/managers": "2.5.0", + "@module-federation/manifest": "2.5.0", + "@module-federation/runtime-tools": "2.5.0", + "@module-federation/sdk": "2.5.0" }, "peerDependencies": { "@rspack/core": "^0.7.0 || ^1.0.0 || ^2.0.0-0", @@ -7637,43 +7637,43 @@ } }, "node_modules/@module-federation/runtime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.4.0.tgz", - "integrity": "sha512-IrLAMwUuteRgFlEkg9jrn4bk8uC897FnXvfNmkKD8/qIoNtSd+32e5ouQn+PEYbX/RjRUB1TYveY6rYHpTPkyg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-2.5.0.tgz", + "integrity": "sha512-dOc7pFEf8aruHBk5hoJLnvwkCa5ELT78q3o9dqcdaa/TT74X5z0FT0BsaGaRBPcse/iP6czK3fWd7RLv5ZKP5g==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.4.0", - "@module-federation/runtime-core": "2.4.0", - "@module-federation/sdk": "2.4.0" + "@module-federation/error-codes": "2.5.0", + "@module-federation/runtime-core": "2.5.0", + "@module-federation/sdk": "2.5.0" } }, "node_modules/@module-federation/runtime-core": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.4.0.tgz", - "integrity": "sha512-0S8fDw28DXDW17lTQwq5vfJWe2lG0Lw3+w4vk3DVVImLwXXay+OGxLDxzWUfypWcMznfpnoAnFUMO3PtuXziuA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-2.5.0.tgz", + "integrity": "sha512-STmhQ3c6/hunba2FMP6GrHazXU/8GuN7Gk4dOkWNRpnqYIoD8Wx4MNl76j3HdCzBESC7uSMXTniksVaM1+xxyA==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.4.0", - "@module-federation/sdk": "2.4.0" + "@module-federation/error-codes": "2.5.0", + "@module-federation/sdk": "2.5.0" } }, "node_modules/@module-federation/runtime-tools": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.4.0.tgz", - "integrity": "sha512-BWQsGT4EWscV9bx3bVHEwp6lERBsiYm7rnPiDpwd2fx+hGEpz1IM9Pz35VryHNDXYxw7MzaAuwTMM+L7uN8OYQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-2.5.0.tgz", + "integrity": "sha512-fR3Na6V78ov3/O17Mev+1vydfmqlYWP4ZNxD/bBkmqKhCO7jMdthNTT02yDljlCyhYl6+X90UJlFhwFle6rIsw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/runtime": "2.4.0", - "@module-federation/webpack-bundler-runtime": "2.4.0" + "@module-federation/runtime": "2.5.0", + "@module-federation/webpack-bundler-runtime": "2.5.0" } }, "node_modules/@module-federation/sdk": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.4.0.tgz", - "integrity": "sha512-eZDdF5B69W9npuka0VL24FY7XDM+YAwwfkscSeWOSqv4/8Hm0xmcmSurlP6NIOrwbeogerRCtEcnx/TFXYjoow==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-2.5.0.tgz", + "integrity": "sha512-ScU22XDyV77l50njjzewMpMlNN1CYo0tHS1D6iy+vNKWrHGq8DWVB0vwG8dmvx/WZ4uq+sXgUsQet17MoKsfZw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -7686,9 +7686,9 @@ } }, "node_modules/@module-federation/third-party-dts-extractor": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.4.0.tgz", - "integrity": "sha512-4v24t6L3dET/6abMOM2fiM3roT0c8mi21/i+uDc6WG7U0i+Xp2SojBppTs6gnT0lkwMTe+u6xIpNQakdUftHsg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-2.5.0.tgz", + "integrity": "sha512-5di43LGk2ies86Cj8QyzYr540Ijc+nyPqYziyFotL6Pparnu+uf3b3ERfEyQfBmEcyGk1MpitQIO2J3bd9BcNw==", "dev": true, "license": "MIT", "dependencies": { @@ -7697,15 +7697,15 @@ } }, "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.4.0.tgz", - "integrity": "sha512-Ntx0+QsgcwtXlpGjL/Vf2PMdPjUHl07b3yM4kBc1kbRogW3Ee84QneBRi/X3w4/jlz4JKbHjD+CMXaqi2W6hgw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-2.5.0.tgz", + "integrity": "sha512-UxVad+tNZYkBnZzqJQsZa0pB5gO5cJoCjMumOo3bhzXBJVqHsFupfeHa8Nk7WrRVbJE6zRT9ZHK0s0NDWBMyJw==", "dev": true, "license": "MIT", "dependencies": { - "@module-federation/error-codes": "2.4.0", - "@module-federation/runtime": "2.4.0", - "@module-federation/sdk": "2.4.0" + "@module-federation/error-codes": "2.5.0", + "@module-federation/runtime": "2.5.0", + "@module-federation/sdk": "2.5.0" } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { @@ -8964,20 +8964,20 @@ } }, "node_modules/@nx/angular": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.7.2.tgz", - "integrity": "sha512-+HCggLwJXp55ZdKrn0VkYfw9gGgZpiIHdlY8m3KnwJzdA+Tfl9t10JvidFXprk7gmnRaU8hHidfz6e1juG6D6g==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-22.7.5.tgz", + "integrity": "sha512-M+xTktTN0VBGpvFsK5u+8oMPZhD3Du2nr/b2U/EpqnfWFb2y7r7nIhQT8NYjvVlGCRyKjJi6tXNHxND6KLqr0g==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/eslint": "22.7.2", - "@nx/js": "22.7.2", - "@nx/module-federation": "22.7.2", - "@nx/rspack": "22.7.2", - "@nx/web": "22.7.2", - "@nx/webpack": "22.7.2", - "@nx/workspace": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/eslint": "22.7.5", + "@nx/js": "22.7.5", + "@nx/module-federation": "22.7.5", + "@nx/rspack": "22.7.5", + "@nx/web": "22.7.5", + "@nx/webpack": "22.7.5", + "@nx/workspace": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "@typescript-eslint/type-utils": "^8.0.0", "enquirer": "~2.3.6", @@ -9025,15 +9025,15 @@ } }, "node_modules/@nx/cypress": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-22.7.2.tgz", - "integrity": "sha512-ivrwIXNTn0p9nGg2z3mjZJYPuH7X+O3eMtuqyPglkxKlAhuUQXVmKYB9nIqRMGR2nGCi9cDC7J38h+0Py+TunA==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-22.7.5.tgz", + "integrity": "sha512-R7vlStn1ukKL9WL/dtfESKeqC38LyDvapPdSbxlBiDISCMgJAzntLcoBM22LfR3z7xy4kDk21fDMwglO3Bj30A==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/eslint": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/eslint": "22.7.5", + "@nx/js": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "detect-port": "^2.1.0", "semver": "^7.6.3", @@ -9050,9 +9050,9 @@ } }, "node_modules/@nx/devkit": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.7.2.tgz", - "integrity": "sha512-oE2SFUxQeZm/EmFABHpWQ4Pi0fBKbJbXKGPvdFaHoMumRxhqBhuBVf/ap5kYFg8Y9bK/zHJkpsEbGyiyRrhvog==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-22.7.5.tgz", + "integrity": "sha512-/63ziS7kdHXYTLLhwWBu9hFwoFFT8xf+PkcQjsNdPqc5JmkYkSew0cE/vp5ORgBpGLWWnFPJgmfqjbJoO2C7jA==", "dev": true, "license": "MIT", "dependencies": { @@ -9121,32 +9121,32 @@ } }, "node_modules/@nx/docker": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/docker/-/docker-22.7.2.tgz", - "integrity": "sha512-VSORTGE28czjDePM5XvNnbwneowlT/6N0t0Jhh6cJtSGCCWwaT4WQb8uVYOgchDr77HwOGhgezI79mmoKHWnsw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/docker/-/docker-22.7.5.tgz", + "integrity": "sha512-IuizX/ACvAjoTIued7eHFDaknSL6WVfDTMtzxiqaY+iDpdOwCVTC1ZXQZSMba/xEsh4owk4qnSRmJ2eWSWburw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", + "@nx/devkit": "22.7.5", "enquirer": "~2.3.6", "tslib": "^2.3.0" } }, "node_modules/@nx/eslint": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.7.2.tgz", - "integrity": "sha512-LDWFg6CNtORnEnwB3XSJBjm8QnheN3F9HxE/kq69Fx+4drkSYEXjRx+27M+9kSP1z2HriSQn5LjEmz1yQD8stA==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-22.7.5.tgz", + "integrity": "sha512-D/85AvnF07ng/fLcSvAE8bxFQKvejUc/MP4pX6aFZgRGrpduo7mTwFMlM/UtOtTTPRRRQVLmM9u7jn4JKROBRw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", "semver": "^7.6.3", "tslib": "^2.3.0", "typescript": "~5.9.2" }, "peerDependencies": { - "@nx/jest": "22.7.2", + "@nx/jest": "22.7.5", "@zkochan/js-yaml": "0.0.7", "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0" }, @@ -9160,14 +9160,14 @@ } }, "node_modules/@nx/eslint-plugin": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.7.2.tgz", - "integrity": "sha512-OgfyUt4dUrlTHcnygVLXcxP0KH7yOAaB9pfdWLe86QRWm2Ei4sRdACltPRXoa9tDeEa4EdBvDTccw0AZ3UnrvQ==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-22.7.5.tgz", + "integrity": "sha512-C9mLUAZjcAKvkAifLNxNBWzvX9RFc/fg+GbO0d50596Lw3Yoz5tRCm4mgpUbVI3mkMIQumjoe8hu9bFx85bXnw==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "@typescript-eslint/type-utils": "^8.0.0", "@typescript-eslint/utils": "^8.0.0", @@ -9202,16 +9202,16 @@ } }, "node_modules/@nx/jest": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.7.2.tgz", - "integrity": "sha512-t+UYRCUUT7BYoRohjf6lWVzeeITjytclxE1ENEzU0+PCAKYN8yJfAWLSsLfK4YDDBv2lTXyzHo7b5Pxpbmz+Qw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-22.7.5.tgz", + "integrity": "sha512-+WlVdtDlVM1dyJKQg/gKiMMs6B4cR8Qh3NT9J2WFPbKdD89DTR771j+WZE572MLijJmqzOE7uNH189kV1qEj0A==", "dev": true, "license": "MIT", "dependencies": { "@jest/reporters": "^30.0.2", "@jest/test-result": "^30.0.2", - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "identity-obj-proxy": "3.0.0", "jest-config": "^30.0.2", @@ -9265,9 +9265,9 @@ } }, "node_modules/@nx/js": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.7.2.tgz", - "integrity": "sha512-d1Hb/2n3QKE9rs8gRtfa/b1/GCGm1rnBFiqePivWbD/9iqerhgkbs6cg4MliLGRnD8gZgXSENLm4IW8ISOi69w==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-22.7.5.tgz", + "integrity": "sha512-2nJdlNPwYRldsdmUz+p/O8kF7eVjINaycTO4o1FXn8DL09wLvhxb1kFAaJrGA3Ig6znAnmRVGitccFt1QTPCIg==", "dev": true, "license": "MIT", "dependencies": { @@ -9278,8 +9278,8 @@ "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nx/devkit": "22.7.2", - "@nx/workspace": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/workspace": "22.7.5", "@zkochan/js-yaml": "0.0.7", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^3.1.0", @@ -9346,18 +9346,18 @@ } }, "node_modules/@nx/module-federation": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.7.2.tgz", - "integrity": "sha512-8KblqEdVw0b6uzhVSxz+RbjodN1BnHtWk1J4ndxG5XxiDLvW8bVEmpQAfn6DebsSRTIr+N/e3pah84j7xhZ9Yw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/module-federation/-/module-federation-22.7.5.tgz", + "integrity": "sha512-tb2j891NYZvl2jMFWbTgF2aLGOGDjhJrMbUKIml2/xIT6DNF89+ly8+wjMS5Nh7JAK3XSQtlERlFVBCcTD+bQA==", "dev": true, "license": "MIT", "dependencies": { "@module-federation/enhanced": "^2.3.3", "@module-federation/node": "^2.7.21", "@module-federation/sdk": "^2.1.0", - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", - "@nx/web": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", + "@nx/web": "22.7.5", "@rspack/core": "1.6.8", "express": "^4.21.2", "http-proxy-middleware": "^3.0.5", @@ -9778,41 +9778,41 @@ } }, "node_modules/@nx/nest": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-22.7.2.tgz", - "integrity": "sha512-Xpja5pry0RWJ8K5t25Eh0HCe5Z6kg81oZh3Qr17iodh4jxAKCMbSpx+1j8PNmC6PFfzbhJyXY6gWOtnaCgbh3g==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nest/-/nest-22.7.5.tgz", + "integrity": "sha512-UhCLlH3UjankgIFcQi6ZYEgAKSfKQlk6g9jJJpN+yyPDvoQYDPOr0iPicO+dUJvX+xDOxI/jS8easNuZ64fVPA==", "dev": true, "license": "MIT", "dependencies": { "@nestjs/schematics": "^11.0.0", - "@nx/devkit": "22.7.2", - "@nx/eslint": "22.7.2", - "@nx/js": "22.7.2", - "@nx/node": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/eslint": "22.7.5", + "@nx/js": "22.7.5", + "@nx/node": "22.7.5", "tslib": "^2.3.0" } }, "node_modules/@nx/node": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-22.7.2.tgz", - "integrity": "sha512-6nj6siMZy45r4hITYfHcqrOFpadYEkbfqwQP3xgTXZvTt6foX0HHoeOcv1rvaEvgdG6/DuZWQj4z8ursCnMWPw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-22.7.5.tgz", + "integrity": "sha512-BJckjbyOgClqD6h2mNDhjftSRsvxbuayw0vKpT9sbd1ivAVhUCqNpe/iVP/VEdTsaK3s26hacfifD8EH3fPNWQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/docker": "22.7.2", - "@nx/eslint": "22.7.2", - "@nx/jest": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/docker": "22.7.5", + "@nx/eslint": "22.7.5", + "@nx/jest": "22.7.5", + "@nx/js": "22.7.5", "kill-port": "^1.6.1", "tcp-port-used": "^1.0.2", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.7.2.tgz", - "integrity": "sha512-hu+x/IOzx+18imkFwSdtXnvB6d21qcXvc4bCqcbA9BQcUnvTnw0/11SLoasvDqy/9KLKHDWJAIPttcBkbArWVA==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-22.7.5.tgz", + "integrity": "sha512-eoPtwx0qZqvRUD+VVOHm150AlSYwYoPxkDHBBGqKCn5nzPspb0lLWw8q83crM/L1M928YgK0WmGf3C++7eqsTA==", "cpu": [ "arm64" ], @@ -9824,9 +9824,9 @@ ] }, "node_modules/@nx/nx-darwin-x64": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.7.2.tgz", - "integrity": "sha512-M4QPs4rjzZN51V7qiKUjJU7hLYtv/h0I/aGUedCQQZibbbDTl45sQlgBQlV/viw2dOw3K5+RxDxtMNFxAbhxQA==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-22.7.5.tgz", + "integrity": "sha512-VLOn/ZoEn3HfjSj+yIHLCM56/el79r+9I28CkZNHaSXJQWZ3edSkcgcfYjVxCurpN2VEwDQHLBeFCH8M+lQ7wQ==", "cpu": [ "x64" ], @@ -9838,9 +9838,9 @@ ] }, "node_modules/@nx/nx-freebsd-x64": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.7.2.tgz", - "integrity": "sha512-tdC2mBQ/ON9qvTs72aL3XVN7B5wd7UsiRJ/qwC2bk/PIpD0vo5c3EwxFyYXfTD60jnlV+CTFxhSVmu8S1pVsfw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-22.7.5.tgz", + "integrity": "sha512-LEVer/E2xfGvK9Go+imMQoEninOoq/38Z2bhV1SD3AThXrp1xaLFVkW5jQ6juebeVkAeztEoMLFlr576egS0vw==", "cpu": [ "x64" ], @@ -9852,9 +9852,9 @@ ] }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.7.2.tgz", - "integrity": "sha512-bBHIC9xZ8L12BWkwMKbRi7+oV4UH1v1Yy8PsIvRfjS7GzYNlOAUMkJxywjF2msnkp8M8Rn29MEvzllZjdyaR7Q==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-22.7.5.tgz", + "integrity": "sha512-NP27EFGpmFJM6RL1Ey/AFJ7gA2xuqtIHaw6jjSNGvfrnZRUNaway30GrVaGGeODf0DsvAty/unqoBMPy6kDHbw==", "cpu": [ "arm" ], @@ -9866,9 +9866,9 @@ ] }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.7.2.tgz", - "integrity": "sha512-MBYG58VUTmLW4S2RlYmXJiV6P0P1lkiZXtiaulZOXmP5uCSXiqMgK47k56hq9GTbtW1SpyGgh02lkNdCYTbmLw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-22.7.5.tgz", + "integrity": "sha512-QLnkJl3HkHsPfpLiNiAiMfpfAeFpic0U1diAxF8RqChOkCpQ7ulvyBVgE1UrQxvhd+gFQ3ed5RNDxtCRw8nTiw==", "cpu": [ "arm64" ], @@ -9880,9 +9880,9 @@ ] }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.7.2.tgz", - "integrity": "sha512-Wf4VBSJt5gEGdzX6uzZoITEYB/Y3TxjvPNT11NKfRU/m63b8/D8jCeRmr7cBTaMUlNmdH3Lf3G1PuPNGoEZ0Mg==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-22.7.5.tgz", + "integrity": "sha512-cEP6KmwBgnb38+jTTaibWCjwXcHmigqhTfy0tN1be7WZr6bHxbqNLsXqKRN70PSNA3HouZcxw1cdRL8tqbPBBA==", "cpu": [ "arm64" ], @@ -9894,9 +9894,9 @@ ] }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.7.2.tgz", - "integrity": "sha512-v3AQyfCkv9k+AWT2hy8hAGaCmFYf+G/bt4KAqnWhmXPWNhxrv9FhvTUcjpY+MY+6v7sKdhJv/3eDvtlLd9FOLg==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-22.7.5.tgz", + "integrity": "sha512-tbaX1tZCSpGifDNBfDdEZAMxVF3Yg4bhFP/bm1needc0diqb+Zflc0u5tM5/6BWDMITQDwenJVsNiQ8ZdtJURA==", "cpu": [ "x64" ], @@ -9908,9 +9908,9 @@ ] }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.7.2.tgz", - "integrity": "sha512-3SMfMB7ynr8wGGTZP+/ZV7FqkCsOg1Raoka+4EtIPX66bEcBycg8FVg81DbyV+IzuKk3N+8Hl2IeY1W2btPypw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-22.7.5.tgz", + "integrity": "sha512-H0M7csOZIgPT822LqjxSXzf4MXRND15vIkAQe3F3Jlr3Si8LC3tzbL52aVcRfgb8MF/xOB5U47mSwxWt1M2bPQ==", "cpu": [ "x64" ], @@ -9922,9 +9922,9 @@ ] }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.7.2.tgz", - "integrity": "sha512-eTFTTF1JUKXu+PNOGd7KAdqyWyfvFKO/wpqHoq9fjnbjXgCdCg1PaRxHIxA1WT5HFj1iHS6Or+GC1zA1KNt0Sw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-22.7.5.tgz", + "integrity": "sha512-JTcZch9YAnDL1gbhqePz3DZ4x7iYemLn1yJzrjbbXAmXju2eiiJiZvJJHbV06+SP9HKXDT8RjTKuAWTdVxnHug==", "cpu": [ "arm64" ], @@ -9936,9 +9936,9 @@ ] }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.7.2.tgz", - "integrity": "sha512-fbVAiJ7RKSanUXrL67Z6as7BY1akznRqo71ACmrxLvLicG3UsmATbHKGp0zULoe3jBm+rNrIrLk+quZn5q0wUg==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-22.7.5.tgz", + "integrity": "sha512-ngcMyHdBJ9FSz2nHdbZ7gtJlFq0O2b05sPAsVMkZ18CKzdaA1qrBDJfsMO49hPCny505eiT766+CkKdaCDl5kA==", "cpu": [ "x64" ], @@ -9950,16 +9950,16 @@ ] }, "node_modules/@nx/rspack": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.7.2.tgz", - "integrity": "sha512-hlBIqhL9otJEQ9x8pf6CYqz0DdTKRW1w3jQ7c1hSafEHrC+OHs3UGReYeDO9Avua5eNA4/FVMLUVFUOPNzk3Wg==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/rspack/-/rspack-22.7.5.tgz", + "integrity": "sha512-E0esSN1S3e0eiHPlNbMsy6guu7APga9C1J5eO9b9IL4dB5NWXUXPsRhfPSv/8hp1gIho/rmqobItaDFgyt6KBQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", - "@nx/module-federation": "22.7.2", - "@nx/web": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", + "@nx/module-federation": "22.7.5", + "@nx/web": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "@rspack/core": "1.6.8", "@rspack/dev-server": "^1.1.4", @@ -10459,22 +10459,22 @@ } }, "node_modules/@nx/storybook": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-22.7.2.tgz", - "integrity": "sha512-kf34LHK0nvyTsXG43FqBGBBPzq9Th90hdWUVktLo636K6/mDvVPTM033BPzQDIljEqWAD+34YPiCtKGLE3H1Ag==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/storybook/-/storybook-22.7.5.tgz", + "integrity": "sha512-ZA86Gdhbq93oQjbav+RyrzUzA0nEydQKLu1oY+L6LYXE+IK3Rrjr584VJW5KySAHmu4dgCNcvnS+lyZKXK5SXQ==", "dev": true, "license": "MIT", "dependencies": { - "@nx/cypress": "22.7.2", - "@nx/devkit": "22.7.2", - "@nx/eslint": "22.7.2", - "@nx/js": "22.7.2", + "@nx/cypress": "22.7.5", + "@nx/devkit": "22.7.5", + "@nx/eslint": "22.7.5", + "@nx/js": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "semver": "^7.6.3", "tslib": "^2.3.0" }, "peerDependencies": { - "@nx/web": "22.7.2", + "@nx/web": "22.7.5", "storybook": ">=7.0.0 <11.0.0" }, "peerDependenciesMeta": { @@ -10484,26 +10484,26 @@ } }, "node_modules/@nx/web": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.7.2.tgz", - "integrity": "sha512-DgjlnOlPOpRFHJuItUbm3+DRZqZQkqVUTRhxS/Ep5QtMx/KeO6jbULHFS4BTDV54/I20ejjsWvADYcYhsZaY1g==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-22.7.5.tgz", + "integrity": "sha512-mJOx3BknJhdr2T7UD4b4LuWyTa+MyXXJvYymBjHvBuCmWC5o68wuDm2y5kXrZ1WxHJYlqoLZ2281QPVyB+SZ7A==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", "detect-port": "^2.1.0", "http-server": "^14.1.0", "picocolors": "^1.1.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@nx/cypress": "22.7.2", - "@nx/eslint": "22.7.2", - "@nx/jest": "22.7.2", - "@nx/playwright": "22.7.2", - "@nx/vite": "22.7.2", - "@nx/webpack": "22.7.2" + "@nx/cypress": "22.7.5", + "@nx/eslint": "22.7.5", + "@nx/jest": "22.7.5", + "@nx/playwright": "22.7.5", + "@nx/vite": "22.7.5", + "@nx/webpack": "22.7.5" }, "peerDependenciesMeta": { "@nx/cypress": { @@ -10527,15 +10527,15 @@ } }, "node_modules/@nx/webpack": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.7.2.tgz", - "integrity": "sha512-XVJcf2Bn1P7GoxJRESKFF5bXqWGPyE6+Bw1BraUmtM7bBRiF3tSXaYrzdwQlyNxZdK82RH+Y8hkBSXX3VZ8Rkg==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-22.7.5.tgz", + "integrity": "sha512-R6LUNAiwQANzqnRDVG2Z4nBMOUQX8Pud1BzllK+CgJkT8qK5eRjVjkBMCEm42togZ8Ax5/BYzO5w4gqUVKfvOQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.23.2", - "@nx/devkit": "22.7.2", - "@nx/js": "22.7.2", + "@nx/devkit": "22.7.5", + "@nx/js": "22.7.5", "@phenomnomnominal/tsquery": "~6.2.0", "ajv": "^8.12.0", "autoprefixer": "^10.4.9", @@ -10747,17 +10747,17 @@ } }, "node_modules/@nx/workspace": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.7.2.tgz", - "integrity": "sha512-xTEQMkeltIS6V5Qb6QRA7O+HIJQjIZSxLm6SvBNczJqAxckuYwMdbrb2IkDSE0XnQqR3gYg7Isz6UuBUHjz66Q==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-22.7.5.tgz", + "integrity": "sha512-f3zx8EAOl0ANd2UXZIniBoHfDvNvi2Uy65R9Rp6emdcx7rxsuTU5Eaidryleo9wIQ5cZAcMx7Wvzp5Srj8diKA==", "dev": true, "license": "MIT", "dependencies": { - "@nx/devkit": "22.7.2", + "@nx/devkit": "22.7.5", "@zkochan/js-yaml": "0.0.7", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "nx": "22.7.2", + "nx": "22.7.5", "picomatch": "4.0.4", "semver": "^7.6.3", "tslib": "^2.3.0", @@ -19078,9 +19078,9 @@ } }, "node_modules/css-minimizer-webpack-plugin/node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "dev": true, "funding": [ { @@ -19098,7 +19098,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -30316,9 +30316,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -30863,9 +30863,9 @@ "license": "MIT" }, "node_modules/nx": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-22.7.2.tgz", - "integrity": "sha512-Gh7gGO1t/TvgbKuVJMYWbxUwZC+E+PuRRVUeoOeVe82yEvBNl40EKiVHIbbi6GID0s9Zwzflo07UrKGLoDSVGw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/nx/-/nx-22.7.5.tgz", + "integrity": "sha512-zoxsJabb33jl1QYnalDn0bicryrEBgSzdKp90d7VGGv/jDgzKrcLg/hw2ZxeYiOjWPIT/o8QNT9G9vTs4dv3AQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -30887,7 +30887,7 @@ "balanced-match": "4.0.3", "base64-js": "1.5.1", "bl": "4.1.0", - "brace-expansion": "5.0.5", + "brace-expansion": "5.0.6", "buffer": "5.7.1", "call-bind-apply-helpers": "1.0.2", "chalk": "4.1.2", @@ -30968,7 +30968,7 @@ "strip-bom": "3.0.0", "supports-color": "7.2.0", "tar-stream": "2.2.0", - "tmp": "0.2.4", + "tmp": "0.2.6", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tslib": "2.8.1", @@ -30977,7 +30977,7 @@ "wrap-ansi": "7.0.0", "wrappy": "1.0.2", "y18n": "5.0.8", - "yaml": "2.8.0", + "yaml": "2.9.0", "yargs": "17.7.2", "yargs-parser": "21.1.1" }, @@ -30986,16 +30986,16 @@ "nx-cloud": "dist/bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "22.7.2", - "@nx/nx-darwin-x64": "22.7.2", - "@nx/nx-freebsd-x64": "22.7.2", - "@nx/nx-linux-arm-gnueabihf": "22.7.2", - "@nx/nx-linux-arm64-gnu": "22.7.2", - "@nx/nx-linux-arm64-musl": "22.7.2", - "@nx/nx-linux-x64-gnu": "22.7.2", - "@nx/nx-linux-x64-musl": "22.7.2", - "@nx/nx-win32-arm64-msvc": "22.7.2", - "@nx/nx-win32-x64-msvc": "22.7.2" + "@nx/nx-darwin-arm64": "22.7.5", + "@nx/nx-darwin-x64": "22.7.5", + "@nx/nx-freebsd-x64": "22.7.5", + "@nx/nx-linux-arm-gnueabihf": "22.7.5", + "@nx/nx-linux-arm64-gnu": "22.7.5", + "@nx/nx-linux-arm64-musl": "22.7.5", + "@nx/nx-linux-x64-gnu": "22.7.5", + "@nx/nx-linux-x64-musl": "22.7.5", + "@nx/nx-win32-arm64-msvc": "22.7.5", + "@nx/nx-win32-x64-msvc": "22.7.5" }, "peerDependencies": { "@swc-node/register": "^1.11.1", @@ -31072,9 +31072,9 @@ } }, "node_modules/nx/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { @@ -31405,19 +31405,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/nx/node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, "node_modules/nx/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -37102,9 +37089,9 @@ "peer": true }, "node_modules/tmp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", - "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-5sJPdPjfI5Kx+qbrDesxkglRBxW//g7hCsqspEjwkewGvBMGIKMOTKzLt1hFVJzyadba3lDUN20O9qhvbQUSTA==", "dev": true, "license": "MIT", "engines": { @@ -37284,15 +37271,15 @@ } }, "node_modules/ts-checker-rspack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.3.0.tgz", - "integrity": "sha512-89oK/BtApjdid1j9CGjPGiYry+EZBhsnTAM481/8ipgr/y2IOgCbW1HPnan+fs5FnzlpUgf9dWGNZ4Ayw3Bd8A==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.3.1.tgz", + "integrity": "sha512-4VBjKblnJwypq+2aWZ9V65HENAmU/2s04d717YhLjC65MKitTTnqKeHE6GGB5C4S+2BnqZ9MtJt5AvS7nldaLQ==", "dev": true, "license": "MIT", "dependencies": { "@rspack/lite-tapable": "^1.1.0", "chokidar": "^3.6.0", - "memfs": "^4.56.10", + "memfs": "^4.57.2", "picocolors": "^1.1.1" }, "peerDependencies": { @@ -37340,14 +37327,14 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-core": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", - "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.3.tgz", + "integrity": "sha512-IvO50vkGydDZwS1e9rz/JXEtCCt9XvqxoGI6FlrVIvVm4/HpygMKW4ETtREWtMTsN5CLJ9FR6GuCduoQPZLBiw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-node-builtins": "4.57.3", + "@jsonjoy.com/fs-node-utils": "4.57.3", "thingies": "^2.5.0" }, "engines": { @@ -37362,15 +37349,15 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", - "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.3.tgz", + "integrity": "sha512-JlIDGUWPl7Y6zl+/ISnZuh8z2aMr/xoR66D18zlaVAuL192CvlNJEzOlzp27x4P52HRtDnCSOk6f59vTsmp5vw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-core": "4.57.3", + "@jsonjoy.com/fs-node-builtins": "4.57.3", + "@jsonjoy.com/fs-node-utils": "4.57.3", "thingies": "^2.5.0" }, "engines": { @@ -37385,17 +37372,17 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-node": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", - "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.3.tgz", + "integrity": "sha512-089gZoKvbeOsT2jeBaVKSz91oFXQWFG7a62sMY6gVMHnoWbyGzTb6OVUP/V7G3wLQLJ555BEsHt8SD1nj1dgaQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "@jsonjoy.com/fs-print": "4.57.2", - "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/fs-core": "4.57.3", + "@jsonjoy.com/fs-node-builtins": "4.57.3", + "@jsonjoy.com/fs-node-utils": "4.57.3", + "@jsonjoy.com/fs-print": "4.57.3", + "@jsonjoy.com/fs-snapshot": "4.57.3", "glob-to-regex.js": "^1.0.0", "thingies": "^2.5.0" }, @@ -37411,9 +37398,9 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", - "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.3.tgz", + "integrity": "sha512-JAI3PqNuY8BR7ovy4h0bADLrqJLIcUauONNZfyTxUnj3Wf3tpTYe39eJ6z7FzYyA+tdMt33VpiQQUikGr3QOBw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -37428,15 +37415,15 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", - "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.3.tgz", + "integrity": "sha512-uZGxyC0zDmcmW5bfHd4YivAZ54BLlbF9G0K5rBaksI/tZdJSGM7/AC+1TY7yvFu0Wc6gUHR7mFwf6SbQ3J1BTQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-fsa": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2" + "@jsonjoy.com/fs-fsa": "4.57.3", + "@jsonjoy.com/fs-node-builtins": "4.57.3", + "@jsonjoy.com/fs-node-utils": "4.57.3" }, "engines": { "node": ">=10.0" @@ -37450,13 +37437,13 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", - "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.3.tgz", + "integrity": "sha512-quCil8AvfcOxob4pn0drGdcQWpkPVgkt9q1+EjeyXXT40/L3l5lvYrr6hR8LmHu0eg+DNNaUwqjLT6Hr7V4sdQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.2" + "@jsonjoy.com/fs-node-builtins": "4.57.3" }, "engines": { "node": ">=10.0" @@ -37470,13 +37457,13 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-print": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", - "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.3.tgz", + "integrity": "sha512-ITwaLZpGIqD9jHndwMvDFZDIvbVzGRsJZDQ5HKln0vyMculu1c1nb7zbEBgY8BVSBZ9S2xO138OWIBGeRsrF3Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.3", "tree-dump": "^1.1.0" }, "engines": { @@ -37491,14 +37478,14 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", - "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.3.tgz", + "integrity": "sha512-wdNaG2DxCtvj9lKldAnEV3ycYPEpk+p2cP2lHD1qdxkoQGlWUtQverqvG9KZSkm6BHFha4PP6XRZbpARNfHRxA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.57.2", + "@jsonjoy.com/fs-node-utils": "4.57.3", "@jsonjoy.com/json-pack": "^17.65.0", "@jsonjoy.com/util": "^17.65.0" }, @@ -37641,20 +37628,20 @@ } }, "node_modules/ts-checker-rspack-plugin/node_modules/memfs": { - "version": "4.57.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", - "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", + "version": "4.57.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.3.tgz", + "integrity": "sha512-dlvqataP1zUOlfj6pv9wgCSC5pRIooNntXgdLfR7FWlcKi1p8fMfJADtHp/+8Dhu5JFvMHNh7L0QVcuaaBKqqA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.2", - "@jsonjoy.com/fs-fsa": "4.57.2", - "@jsonjoy.com/fs-node": "4.57.2", - "@jsonjoy.com/fs-node-builtins": "4.57.2", - "@jsonjoy.com/fs-node-to-fsa": "4.57.2", - "@jsonjoy.com/fs-node-utils": "4.57.2", - "@jsonjoy.com/fs-print": "4.57.2", - "@jsonjoy.com/fs-snapshot": "4.57.2", + "@jsonjoy.com/fs-core": "4.57.3", + "@jsonjoy.com/fs-fsa": "4.57.3", + "@jsonjoy.com/fs-node": "4.57.3", + "@jsonjoy.com/fs-node-builtins": "4.57.3", + "@jsonjoy.com/fs-node-to-fsa": "4.57.3", + "@jsonjoy.com/fs-node-utils": "4.57.3", + "@jsonjoy.com/fs-print": "4.57.3", + "@jsonjoy.com/fs-snapshot": "4.57.3", "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", @@ -37773,9 +37760,9 @@ } }, "node_modules/ts-loader": { - "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.6.0.tgz", + "integrity": "sha512-dsJO0S+T7grTDWTc4a0nTygXGjKncVUpx8Y+af8EvI/D5WgTJby5UEk5eoMCB9EcLQmnvitqh99MqtjtHgAwFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -37789,8 +37776,14 @@ "node": ">=12.0.0" }, "peerDependencies": { + "loader-utils": "*", "typescript": "*", - "webpack": "^5.0.0" + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "loader-utils": { + "optional": true + } } }, "node_modules/ts-node": { @@ -39941,12 +39934,11 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "devOptional": true, "license": "ISC", - "optional": true, - "peer": true, "bin": { "yaml": "bin.mjs" }, diff --git a/package.json b/package.json index 22e39c437..49cc4e793 100644 --- a/package.json +++ b/package.json @@ -158,16 +158,16 @@ "@eslint/js": "9.35.0", "@nestjs/schematics": "11.1.0", "@nestjs/testing": "11.1.21", - "@nx/angular": "22.7.2", - "@nx/eslint-plugin": "22.7.2", - "@nx/jest": "22.7.2", - "@nx/js": "22.7.2", - "@nx/module-federation": "22.7.2", - "@nx/nest": "22.7.2", - "@nx/node": "22.7.2", - "@nx/storybook": "22.7.2", - "@nx/web": "22.7.2", - "@nx/workspace": "22.7.2", + "@nx/angular": "22.7.5", + "@nx/eslint-plugin": "22.7.5", + "@nx/jest": "22.7.5", + "@nx/js": "22.7.5", + "@nx/module-federation": "22.7.5", + "@nx/nest": "22.7.5", + "@nx/node": "22.7.5", + "@nx/storybook": "22.7.5", + "@nx/web": "22.7.5", + "@nx/workspace": "22.7.5", "@schematics/angular": "21.2.6", "@storybook/addon-docs": "10.1.10", "@storybook/addon-themes": "10.1.10", @@ -194,7 +194,7 @@ "jest": "30.2.0", "jest-environment-jsdom": "30.2.0", "jest-preset-angular": "16.0.0", - "nx": "22.7.2", + "nx": "22.7.5", "prettier": "3.8.3", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "7.8.0", From 9996d8a8d2e91983fedf4980ff23c42e34ae8e06 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:56:10 +0200 Subject: [PATCH 16/37] Bugfix/base currency in impersonation mode (#6964) * Fix base currency in impersonation mode * Update changelog --- CHANGELOG.md | 1 + .../api/src/app/account/account.controller.ts | 11 +++++-- apps/api/src/app/account/account.module.ts | 4 ++- .../src/app/portfolio/portfolio.controller.ts | 11 +++++-- .../src/app/portfolio/portfolio.service.ts | 7 +++-- apps/api/src/app/user/user.service.ts | 31 +++++++++++++------ 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a33a4b2..aa0e05aa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Resolved an issue in the impersonation mode where the values did not match the owner’s currency - Fixed the environment variable expansion in the `.env` file when debugging via _Visual Studio Code_ ## 3.6.0 - 2026-05-28 diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 052720176..d44b716c0 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -1,5 +1,6 @@ import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.interceptor'; @@ -50,7 +51,8 @@ export class AccountController { private readonly apiService: ApiService, private readonly impersonationService: ImpersonationService, private readonly portfolioService: PortfolioService, - @Inject(REQUEST) private readonly request: RequestWithUser + @Inject(REQUEST) private readonly request: RequestWithUser, + private readonly userService: UserService ) {} @Delete(':id') @@ -137,11 +139,14 @@ export class AccountController { ): Promise { const impersonationUserId = await this.impersonationService.validateImpersonationId(impersonationId); + const userId = impersonationUserId || this.request.user.id; + + const { settings } = await this.userService.user({ id: userId }); return this.accountBalanceService.getAccountBalances({ + userId, filters: [{ id, type: 'ACCOUNT' }], - userCurrency: this.request.user.settings.settings.baseCurrency, - userId: impersonationUserId || this.request.user.id + userCurrency: settings.settings.baseCurrency }); } diff --git a/apps/api/src/app/account/account.module.ts b/apps/api/src/app/account/account.module.ts index fb89bb2b6..253c7fb1d 100644 --- a/apps/api/src/app/account/account.module.ts +++ b/apps/api/src/app/account/account.module.ts @@ -1,5 +1,6 @@ import { AccountBalanceModule } from '@ghostfolio/api/app/account-balance/account-balance.module'; import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'; +import { UserModule } from '@ghostfolio/api/app/user/user.module'; import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; @@ -23,7 +24,8 @@ import { AccountService } from './account.service'; ImpersonationModule, PortfolioModule, PrismaModule, - RedactValuesInResponseModule + RedactValuesInResponseModule, + UserModule ], providers: [AccountService] }) diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 9515c7a21..ca94605f9 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -1,4 +1,5 @@ import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; +import { UserService } from '@ghostfolio/api/app/user/user.service'; import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { @@ -70,7 +71,8 @@ export class PortfolioController { private readonly configurationService: ConfigurationService, private readonly impersonationService: ImpersonationService, private readonly portfolioService: PortfolioService, - @Inject(REQUEST) private readonly request: RequestWithUser + @Inject(REQUEST) private readonly request: RequestWithUser, + private readonly userService: UserService ) {} @Get('details') @@ -340,7 +342,10 @@ export class PortfolioController { const impersonationUserId = await this.impersonationService.validateImpersonationId(impersonationId); - const userCurrency = this.request.user.settings.settings.baseCurrency; + const userId = impersonationUserId || this.request.user.id; + + const { settings } = await this.userService.user({ id: userId }); + const userCurrency = settings.settings.baseCurrency; const { endDate, startDate } = getIntervalFromDateRange({ dateRange }); @@ -349,7 +354,7 @@ export class PortfolioController { filters, startDate, userCurrency, - userId: impersonationUserId || this.request.user.id, + userId, types: ['DIVIDEND'] }); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index ab39a00a5..37d76bcfa 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -164,7 +164,7 @@ export class PortfolioService { }; } - const [accounts, details] = await Promise.all([ + const [accounts, details, user] = await Promise.all([ this.accountService.accounts({ where, include: { @@ -178,10 +178,11 @@ export class PortfolioService { withExcludedAccounts, impersonationId: userId, userId: this.request.user.id - }) + }), + this.userService.user({ id: userId }) ]); - const userCurrency = this.request.user.settings.settings.baseCurrency; + const userCurrency = this.getUserCurrency(user); return Promise.all( accounts.map(async (account) => { diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 4a0e1598b..9d8d9da9d 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -49,7 +49,7 @@ import { PerformanceCalculationType } from '@ghostfolio/common/types/performance import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; -import { Prisma, Role, User } from '@prisma/client'; +import { Prisma, Role, Settings, User } from '@prisma/client'; import { differenceInDays, subDays } from 'date-fns'; import { without } from 'lodash'; import { createHmac } from 'node:crypto'; @@ -109,7 +109,14 @@ export class UserService { }): Promise { const { id, permissions, settings, subscription } = user; - const userData = await Promise.all([ + const [ + access, + accounts, + activitiesCount, + firstActivity, + impersonationUserSettings, + tagsForUser + ] = await Promise.all([ this.prismaService.access.findMany({ include: { user: true @@ -134,16 +141,17 @@ export class UserService { }, where: { userId: impersonationUserId || user.id } }), + impersonationUserId + ? this.prismaService.settings.findUnique({ + where: { userId: impersonationUserId } + }) + : Promise.resolve(null), this.tagService.getTagsForUser(impersonationUserId || user.id) ]); - const access = userData[0]; - const accounts = userData[1]; - const activitiesCount = userData[2]; - const firstActivity = userData[3]; - let tags = userData[4].filter((tag) => { - return tag.id !== TAG_ID_EXCLUDE_FROM_ANALYSIS; - }); + const baseCurrency = + (impersonationUserSettings?.settings as UserSettings)?.baseCurrency ?? + (settings.settings as UserSettings)?.baseCurrency; let systemMessage: SystemMessage; @@ -156,6 +164,10 @@ export class UserService { systemMessage = systemMessageProperty; } + let tags = tagsForUser.filter((tag) => { + return tag.id !== TAG_ID_EXCLUDE_FROM_ANALYSIS; + }); + if ( this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && subscription.type === SubscriptionType.Basic @@ -183,6 +195,7 @@ export class UserService { dateOfFirstActivity: firstActivity?.date ?? new Date(), settings: { ...(settings.settings as UserSettings), + baseCurrency, locale: (settings.settings as UserSettings)?.locale ?? locale } }; From 8a93f1f3013aff1a6c7ac3351257c16cb8dc4bda Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jun 2026 19:56:44 +0200 Subject: [PATCH 17/37] Bugfix/asset class chart on allocations page (#6979) Fix asset class chart --- libs/ui/src/lib/services/data.service.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts index 44cef1aed..2ae07708d 100644 --- a/libs/ui/src/lib/services/data.service.ts +++ b/libs/ui/src/lib/services/data.service.ts @@ -556,13 +556,11 @@ export class DataService { map((response) => { if (response.holdings) { for (const symbol of Object.keys(response.holdings)) { - response.holdings[symbol].assetClassLabel = translate( - response.holdings[symbol].assetClass - ); + response.holdings[symbol].assetProfile.assetClassLabel = + translate(response.holdings[symbol].assetProfile.assetClass); - response.holdings[symbol].assetSubClassLabel = translate( - response.holdings[symbol].assetSubClass - ); + response.holdings[symbol].assetProfile.assetSubClassLabel = + translate(response.holdings[symbol].assetProfile.assetSubClass); response.holdings[symbol].dateOfFirstActivity = response.holdings[ symbol From f14f98f766d70dd6c9b5e2c13cf0d67ab927a33a Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Tue, 2 Jun 2026 20:00:36 +0200 Subject: [PATCH 18/37] Release 3.7.0 (#6980) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa0e05aa4..451390256 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 3.7.0 - 2026-06-02 ### Added diff --git a/package-lock.json b/package-lock.json index 6330ef21f..e7b5a2bca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.6.0", + "version": "3.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.6.0", + "version": "3.7.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 49cc4e793..4fa3e522a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.6.0", + "version": "3.7.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 7fd755602e32b15fad9d5815e678e54e45032b75 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Thu, 4 Jun 2026 17:39:51 +0200 Subject: [PATCH 19/37] Task/extend personal finance tools (20260603) (#6982) Add URLs --- libs/common/src/lib/interfaces/product.ts | 1 + libs/common/src/lib/personal-finance-tools.ts | 321 ++++++++++++------ 2 files changed, 216 insertions(+), 106 deletions(-) diff --git a/libs/common/src/lib/interfaces/product.ts b/libs/common/src/lib/interfaces/product.ts index 5ef023ff8..6cd88fbe8 100644 --- a/libs/common/src/lib/interfaces/product.ts +++ b/libs/common/src/lib/interfaces/product.ts @@ -13,5 +13,6 @@ export interface Product { pricingPerYear?: string; regions?: string[]; slogan?: string; + url?: string; useAnonymously?: boolean; } diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 063b4254c..e7d964872 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -7,7 +7,8 @@ export const personalFinanceTools: Product[] = [ key: 'allinvestview', languages: ['English'], name: 'AllInvestView', - slogan: 'All your Investments in One View' + slogan: 'All your Investments in One View', + url: 'https://www.allinvestview.com' }, { founded: 2019, @@ -16,14 +17,16 @@ export const personalFinanceTools: Product[] = [ key: 'allvue-systems', name: 'Allvue Systems', origin: 'United States', - slogan: 'Investment Software Suite' + slogan: 'Investment Software Suite', + url: 'https://www.allvuesystems.com' }, { founded: 2016, key: 'alphatrackr', languages: ['English'], name: 'AlphaTrackr', - slogan: 'Investment Portfolio Tracking Tool' + slogan: 'Investment Portfolio Tracking Tool', + url: 'https://www.alphatrackr.com' }, { founded: 2017, @@ -31,7 +34,8 @@ export const personalFinanceTools: Product[] = [ key: 'altoo', name: 'Altoo Wealth Platform', origin: 'Switzerland', - slogan: 'Simplicity for Complex Wealth' + slogan: 'Simplicity for Complex Wealth', + url: 'https://altoo.io' }, { founded: 2018, @@ -40,7 +44,8 @@ export const personalFinanceTools: Product[] = [ key: 'altruist', name: 'Altruist', origin: 'United States', - slogan: 'The wealth platform built for independent advisors' + slogan: 'The wealth platform built for independent advisors', + url: 'https://altruist.com' }, { founded: 2023, @@ -50,7 +55,8 @@ export const personalFinanceTools: Product[] = [ name: 'Amsflow Portfolio', origin: 'Singapore', pricingPerYear: '$228', - slogan: 'Portfolio Visualizer' + slogan: 'Portfolio Visualizer', + url: 'https://amsflow.com' }, { founded: 2018, @@ -61,7 +67,8 @@ export const personalFinanceTools: Product[] = [ name: 'Anlage.App', origin: 'Austria', pricingPerYear: '$120', - slogan: 'Analyze and track your portfolio.' + slogan: 'Analyze and track your portfolio.', + url: 'https://anlage.app' }, { founded: 2022, @@ -70,14 +77,16 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Asseta', origin: 'United States', - slogan: 'The Intelligent Family Office Suite' + slogan: 'The Intelligent Family Office Suite', + url: 'https://www.asseta.ai' }, { founded: 2016, key: 'atominvest', name: 'Atominvest', origin: 'United Kingdom', - slogan: 'Portfolio Management' + slogan: 'Portfolio Management', + url: 'https://www.atominvest.co' }, { founded: 2020, @@ -87,7 +96,8 @@ export const personalFinanceTools: Product[] = [ name: 'Balance Pro', origin: 'United States', pricingPerYear: '$47.99', - slogan: 'The Smarter Way to Track Your Finances' + slogan: 'The Smarter Way to Track Your Finances', + url: 'https://www.balancepro.app' }, { hasFreePlan: false, @@ -96,7 +106,8 @@ export const personalFinanceTools: Product[] = [ name: 'Banktivity', origin: 'United States', pricingPerYear: '$59.99', - slogan: 'Proactive money management app for macOS & iOS' + slogan: 'Proactive money management app for macOS & iOS', + url: 'https://www.banktivity.com' }, { founded: 2022, @@ -104,7 +115,8 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'basil-finance', name: 'Basil Finance', - slogan: 'The ultimate solution for tracking and managing your investments' + slogan: 'The ultimate solution for tracking and managing your investments', + url: 'https://basil.fi' }, { founded: 2020, @@ -114,7 +126,8 @@ export const personalFinanceTools: Product[] = [ name: 'Beanvest', origin: 'France', pricingPerYear: '$100', - slogan: 'Stock Portfolio Tracker for Smart Investors' + slogan: 'Stock Portfolio Tracker for Smart Investors', + url: 'https://beanvest.com' }, { founded: 2024, @@ -123,7 +136,8 @@ export const personalFinanceTools: Product[] = [ languages: ['Deutsch', 'English', 'Français', 'Italiano'], name: 'BlueBudget', origin: 'Switzerland', - slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung' + slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung', + url: 'https://www.bluebudget.ch' }, { founded: 2015, @@ -134,13 +148,15 @@ export const personalFinanceTools: Product[] = [ note: 'Originally named as NewRetirement', origin: 'United States', pricingPerYear: '$144', - slogan: 'Take control with retirement planning tools that begin with you' + slogan: 'Take control with retirement planning tools that begin with you', + url: 'https://www.boldin.com' }, { key: 'budgetpulse', name: 'BudgetPulse', origin: 'United States', - slogan: 'Giving life to your finance!' + slogan: 'Giving life to your finance!', + url: 'https://www.budgetpulse.com' }, { founded: 2007, @@ -151,7 +167,8 @@ export const personalFinanceTools: Product[] = [ origin: 'United States', pricingPerYear: '$48', regions: ['Global'], - slogan: 'Take control of your financial future' + slogan: 'Take control of your financial future', + url: 'https://www.buxfer.com' }, { hasFreePlan: true, @@ -160,7 +177,8 @@ export const personalFinanceTools: Product[] = [ name: 'Capitally', origin: 'Poland', pricingPerYear: '€80', - slogan: 'Optimize your investments performance' + slogan: 'Optimize your investments performance', + url: 'https://www.mycapitally.com' }, { founded: 2022, @@ -185,7 +203,8 @@ export const personalFinanceTools: Product[] = [ key: 'cobalt', name: 'Cobalt', origin: 'United States', - slogan: 'Next-Level Portfolio Monitoring' + slogan: 'Next-Level Portfolio Monitoring', + url: 'https://www.cobalt.pe' }, { founded: 2017, @@ -195,7 +214,8 @@ export const personalFinanceTools: Product[] = [ name: 'CoinStats', origin: 'Armenia', pricingPerYear: '$168', - slogan: 'Manage All Your Wallets & Exchanges From One Place' + slogan: 'Manage All Your Wallets & Exchanges From One Place', + url: 'https://coinstats.app' }, { founded: 2013, @@ -206,14 +226,16 @@ export const personalFinanceTools: Product[] = [ name: 'CoinTracking', origin: 'Germany', pricingPerYear: '$120', - slogan: 'The leading Crypto Portfolio Tracker & Tax Calculator' + slogan: 'The leading Crypto Portfolio Tracker & Tax Calculator', + url: 'https://cointracking.info' }, { founded: 2019, key: 'compound-planning', name: 'Compound Planning', origin: 'United States', - slogan: 'Modern Wealth & Investment Management' + slogan: 'Modern Wealth & Investment Management', + url: 'https://compoundplanning.com' }, { founded: 2019, @@ -223,7 +245,8 @@ export const personalFinanceTools: Product[] = [ name: 'Copilot Money', origin: 'United States', pricingPerYear: '$95', - slogan: 'Do money better with Copilot' + slogan: 'Do money better with Copilot', + url: 'https://www.copilot.money' }, { founded: 2014, @@ -232,7 +255,8 @@ export const personalFinanceTools: Product[] = [ name: 'CountAbout', origin: 'United States', pricingPerYear: '$9.99', - slogan: 'Customizable and Secure Personal Finance App' + slogan: 'Customizable and Secure Personal Finance App', + url: 'https://countabout.com' }, { founded: 2023, @@ -240,14 +264,16 @@ export const personalFinanceTools: Product[] = [ key: 'danti', name: 'Danti', origin: 'United Kingdom', - slogan: 'Digitising Generational Wealth' + slogan: 'Digitising Generational Wealth', + url: 'https://danti.io' }, { founded: 2020, key: 'de.fi', languages: ['English'], name: 'De.Fi', - slogan: 'DeFi Portfolio Tracker' + slogan: 'DeFi Portfolio Tracker', + url: 'https://de.fi' }, { founded: 2016, @@ -258,7 +284,8 @@ export const personalFinanceTools: Product[] = [ name: 'DeFi Portfolio Tracker by Zerion', origin: 'United States', pricingPerYear: '$99', - slogan: 'DeFi Portfolio Tracker for All Chains' + slogan: 'DeFi Portfolio Tracker for All Chains', + url: 'https://zerion.io/defi-portfolio-tracker' }, { founded: 2022, @@ -269,7 +296,8 @@ export const personalFinanceTools: Product[] = [ name: 'DEGIRO Portfolio Tracker by Capitalyse', origin: 'Netherlands', pricingPerYear: '€24', - slogan: 'Democratizing Data Analytics' + slogan: 'Democratizing Data Analytics', + url: 'https://capitalyse.app/app/degiro' }, { founded: 2017, @@ -280,7 +308,8 @@ export const personalFinanceTools: Product[] = [ note: 'Acquired by eToro', origin: 'Belgium', pricingPerYear: '$150', - slogan: 'The app to track all your investments. Make smart moves only.' + slogan: 'The app to track all your investments. Make smart moves only.', + url: 'https://delta.app' }, { hasFreePlan: true, @@ -289,7 +318,8 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Digrin', pricingPerYear: '$49.90', - slogan: 'Dividend Portfolio Tracker' + slogan: 'Dividend Portfolio Tracker', + url: 'https://www.digrin.com' }, { founded: 2019, @@ -300,7 +330,8 @@ export const personalFinanceTools: Product[] = [ name: 'DivvyDiary', origin: 'Germany', pricingPerYear: '€65', - slogan: 'Your personal Dividend Calendar' + slogan: 'Your personal Dividend Calendar', + url: 'https://divvydiary.com' }, { founded: 2009, @@ -309,7 +340,8 @@ export const personalFinanceTools: Product[] = [ name: 'Empower', note: 'Originally named as Personal Capital', origin: 'United States', - slogan: 'Get answers to your money questions' + slogan: 'Get answers to your money questions', + url: 'https://www.empower.com' }, { alias: '8figures', @@ -317,7 +349,8 @@ export const personalFinanceTools: Product[] = [ key: 'eightfigures', name: '8FIGURES', origin: 'United States', - slogan: 'Portfolio Tracker Designed by Professional Investors' + slogan: 'Portfolio Tracker Designed by Professional Investors', + url: 'https://8figures.com' }, { founded: 2010, @@ -325,7 +358,8 @@ export const personalFinanceTools: Product[] = [ key: 'etops', name: 'etops', origin: 'Switzerland', - slogan: 'Your financial superpower' + slogan: 'Your financial superpower', + url: 'https://www.etops.com' }, { founded: 2020, @@ -335,7 +369,8 @@ export const personalFinanceTools: Product[] = [ name: 'Exirio', origin: 'United States', pricingPerYear: '$100', - slogan: 'All your wealth, in one place.' + slogan: 'All your wealth, in one place.', + url: 'https://www.exirio.com' }, { founded: 2018, @@ -345,7 +380,8 @@ export const personalFinanceTools: Product[] = [ name: 'Fey', origin: 'Canada', pricingPerYear: '$300', - slogan: 'Make better investments.' + slogan: 'Make better investments.', + url: 'https://fey.com' }, { founded: 2023, @@ -356,7 +392,8 @@ export const personalFinanceTools: Product[] = [ name: 'Fina', origin: 'United States', pricingPerYear: '$115', - slogan: 'Flexible Financial Management' + slogan: 'Flexible Financial Management', + url: 'https://www.fina.money' }, { founded: 2023, @@ -366,7 +403,8 @@ export const personalFinanceTools: Product[] = [ name: 'Finanzfluss Copilot', origin: 'Germany', pricingPerYear: '€69.99', - slogan: 'Portfolio Tracker für dein Vermögen' + slogan: 'Portfolio Tracker für dein Vermögen', + url: 'https://www.finanzfluss.de/copilot' }, { founded: 2020, @@ -374,7 +412,8 @@ export const personalFinanceTools: Product[] = [ languages: ['Deutsch', 'English', 'Français'], name: 'Finary', origin: 'United States', - slogan: 'Real-Time Portfolio Tracker & Stock Tracker' + slogan: 'Real-Time Portfolio Tracker & Stock Tracker', + url: 'https://finary.com' }, { founded: 2021, @@ -385,14 +424,16 @@ export const personalFinanceTools: Product[] = [ name: 'FINATEKA', origin: 'United States', slogan: - 'The most convenient mobile application for personal finance accounting' + 'The most convenient mobile application for personal finance accounting', + url: 'https://finateka.com' }, { founded: 2022, key: 'fincake', name: 'Fincake', origin: 'British Virgin Islands', - slogan: 'Easy-to-use Portfolio Tracker' + slogan: 'Easy-to-use Portfolio Tracker', + url: 'https://fincake.io' }, { founded: 2021, @@ -400,7 +441,8 @@ export const personalFinanceTools: Product[] = [ key: 'finvest', name: 'Finvest', origin: 'United States', - slogan: 'Grow your wealth in a stress-free way' + slogan: 'Grow your wealth in a stress-free way', + url: 'https://www.getfinvest.com' }, { founded: 2023, @@ -409,7 +451,8 @@ export const personalFinanceTools: Product[] = [ name: 'FinWise', origin: 'South Africa', pricingPerYear: '€69.99', - slogan: 'Personal finances, simplified' + slogan: 'Personal finances, simplified', + url: 'https://finwiseapp.io' }, { founded: 2021, @@ -420,7 +463,8 @@ export const personalFinanceTools: Product[] = [ name: 'FIREkit', origin: 'Ukraine', pricingPerYear: '$40', - slogan: 'A simple solution to track your wealth online' + slogan: 'A simple solution to track your wealth online', + url: 'https://firekit.space' }, { hasFreePlan: true, @@ -430,7 +474,8 @@ export const personalFinanceTools: Product[] = [ name: 'folishare', origin: 'Austria', pricingPerYear: '$65', - slogan: 'Take control over your investments' + slogan: 'Take control over your investments', + url: 'https://www.folishare.com' }, { hasFreePlan: true, @@ -448,7 +493,8 @@ export const personalFinanceTools: Product[] = [ origin: 'Argentina', pricingPerYear: '$60', regions: ['Global'], - slogan: 'Take control of your finances from WhatsApp' + slogan: 'Take control of your finances from WhatsApp', + url: 'https://gasti.pro' }, { founded: 2020, @@ -459,7 +505,8 @@ export const personalFinanceTools: Product[] = [ name: 'getquin', origin: 'Germany', pricingPerYear: '€48', - slogan: 'Portfolio Tracker, Analysis & Community' + slogan: 'Portfolio Tracker, Analysis & Community', + url: 'https://www.getquin.com' }, { hasFreePlan: true, @@ -479,6 +526,7 @@ export const personalFinanceTools: Product[] = [ name: 'Holistic', origin: 'Germany', slogan: 'Die All-in-One Lösung für dein Vermögen.', + url: 'https://holistic.capital', useAnonymously: true }, { @@ -487,7 +535,8 @@ export const personalFinanceTools: Product[] = [ key: 'honeydue', name: 'Honeydue', origin: 'United States', - slogan: 'Finance App for Couples' + slogan: 'Finance App for Couples', + url: 'https://www.honeydue.com' }, { founded: 2022, @@ -515,7 +564,8 @@ export const personalFinanceTools: Product[] = [ key: 'investify', name: 'Investify', origin: 'Pakistan', - slogan: 'Advanced portfolio tracking and stock market information' + slogan: 'Advanced portfolio tracking and stock market information', + url: 'https://www.investify.pk' }, { founded: 2021, @@ -527,6 +577,7 @@ export const personalFinanceTools: Product[] = [ origin: 'Switzerland', pricingPerYear: '$156', slogan: 'Track all your assets, investments and portfolios in one place', + url: 'https://invmon.com', useAnonymously: true }, { @@ -537,7 +588,8 @@ export const personalFinanceTools: Product[] = [ name: 'justETF', origin: 'Germany', pricingPerYear: '€119', - slogan: 'ETF portfolios made simple' + slogan: 'ETF portfolios made simple', + url: 'https://www.justetf.com' }, { founded: 2018, @@ -546,7 +598,8 @@ export const personalFinanceTools: Product[] = [ key: 'koinly', name: 'Koinly', origin: 'Singapore', - slogan: 'Track all your crypto wallets in one place' + slogan: 'Track all your crypto wallets in one place', + url: 'https://koinly.io' }, { founded: 2016, @@ -556,7 +609,8 @@ export const personalFinanceTools: Product[] = [ name: 'Koyfin', origin: 'United States', pricingPerYear: '$468', - slogan: 'Comprehensive financial data analysis' + slogan: 'Comprehensive financial data analysis', + url: 'https://www.koyfin.com' }, { founded: 2019, @@ -566,7 +620,8 @@ export const personalFinanceTools: Product[] = [ name: 'Kubera®', origin: 'United States', pricingPerYear: '$249', - slogan: 'The Time Machine for your Net Worth' + slogan: 'The Time Machine for your Net Worth', + url: 'https://www.kubera.com' }, { founded: 2021, @@ -575,7 +630,8 @@ export const personalFinanceTools: Product[] = [ languages: ['Deutsch', 'English'], name: 'Leafs', origin: 'Switzerland', - slogan: 'Sustainability insights for wealth managers' + slogan: 'Sustainability insights for wealth managers', + url: 'https://leafs.ch' }, { founded: 2018, @@ -585,7 +641,8 @@ export const personalFinanceTools: Product[] = [ name: 'Magnifi', origin: 'United States', pricingPerYear: '$132', - slogan: 'AI Investing Assistant' + slogan: 'AI Investing Assistant', + url: 'https://magnifi.com' }, { founded: 2022, @@ -597,14 +654,16 @@ export const personalFinanceTools: Product[] = [ origin: 'Germany', pricingPerYear: '€168', regions: ['Global'], - slogan: 'Track your investments' + slogan: 'Track your investments', + url: 'https://markets.sh' }, { founded: 2010, key: 'masttro', name: 'Masttro', origin: 'United States', - slogan: 'Your platform for wealth in full view' + slogan: 'Your platform for wealth in full view', + url: 'https://masttro.com' }, { founded: 2021, @@ -619,7 +678,8 @@ export const personalFinanceTools: Product[] = [ origin: 'United States', pricingPerYear: '$145', regions: ['United States'], - slogan: 'Your financial future, in your control' + slogan: 'Your financial future, in your control', + url: 'https://github.com/maybe-finance/maybe' }, { hasFreePlan: false, @@ -630,7 +690,8 @@ export const personalFinanceTools: Product[] = [ origin: 'United States', pricingPerYear: '$204', regions: ['Canada', 'United States'], - slogan: 'The smartest way to track your crypto' + slogan: 'The smartest way to track your crypto', + url: 'https://www.merlincrypto.com' }, { founded: 1991, @@ -649,7 +710,8 @@ export const personalFinanceTools: Product[] = [ name: 'Monarch Money', origin: 'United States', pricingPerYear: '$99.99', - slogan: 'The modern way to manage your money' + slogan: 'The modern way to manage your money', + url: 'https://www.monarch.com' }, { founded: 1999, @@ -659,7 +721,8 @@ export const personalFinanceTools: Product[] = [ name: 'Moneydance', origin: 'Scotland', pricingPerYear: '$100', - slogan: 'Personal Finance Manager for Mac, Windows, and Linux' + slogan: 'Personal Finance Manager for Mac, Windows, and Linux', + url: 'https://moneydance.com' }, { hasFreePlan: true, @@ -668,7 +731,8 @@ export const personalFinanceTools: Product[] = [ name: 'Money Peak', note: 'Originally named as goSPATZ', origin: 'Germany', - slogan: 'Dein smarter Finance Assistant' + slogan: 'Dein smarter Finance Assistant', + url: 'https://moneypeak.ai' }, { founded: 2007, @@ -677,14 +741,16 @@ export const personalFinanceTools: Product[] = [ note: 'License is a perpetual license', origin: 'United States', pricingPerYear: '$59.99', - slogan: 'Have total control of your financial life' + slogan: 'Have total control of your financial life', + url: 'https://www.moneyspire.com' }, { key: 'moneywiz', name: 'MoneyWiz', origin: 'United States', pricingPerYear: '$29.99', - slogan: 'Get money management superpowers' + slogan: 'Get money management superpowers', + url: 'https://www.wiz.money' }, { hasFreePlan: false, @@ -692,7 +758,8 @@ export const personalFinanceTools: Product[] = [ key: 'monse', name: 'Monse', pricingPerYear: '$60', - slogan: 'Gain financial control and keep your data private.' + slogan: 'Gain financial control and keep your data private.', + url: 'https://monse.app' }, { founded: 2025, @@ -703,7 +770,8 @@ export const personalFinanceTools: Product[] = [ name: 'Monsy', origin: 'Indonesia', pricingPerYear: '$20', - slogan: 'Smart, simple, stress-free money tracking.' + slogan: 'Smart, simple, stress-free money tracking.', + url: 'https://www.monsy.app' }, { hasFreePlan: true, @@ -713,7 +781,8 @@ export const personalFinanceTools: Product[] = [ name: 'Morningstar® Portfolio Manager', origin: 'United States', slogan: - 'Track your equity, fund, investment trust, ETF and pension investments in one place.' + 'Track your equity, fund, investment trust, ETF and pension investments in one place.', + url: 'https://www.morningstar.com/mm' }, { founded: 2020, @@ -723,7 +792,8 @@ export const personalFinanceTools: Product[] = [ name: 'Crypto Portfolio Tracker by Nansen', origin: 'Singapore', pricingPerYear: '$1188', - slogan: 'Your Complete Crypto Portfolio, Reimagined' + slogan: 'Your Complete Crypto Portfolio, Reimagined', + url: 'https://www.nansen.ai/crypto-portfolio-tracker' }, { founded: 2017, @@ -733,7 +803,8 @@ export const personalFinanceTools: Product[] = [ name: 'Navexa', origin: 'Australia', pricingPerYear: '$90', - slogan: 'The Intelligent Portfolio Tracker' + slogan: 'The Intelligent Portfolio Tracker', + url: 'https://www.navexa.com' }, { founded: 2020, @@ -745,21 +816,24 @@ export const personalFinanceTools: Product[] = [ origin: 'Germany', pricingPerYear: '€99.99', regions: ['Austria', 'Germany', 'Switzerland'], - slogan: 'Dein Vermögen immer im Blick' + slogan: 'Dein Vermögen immer im Blick', + url: 'https://www.parqet.com' }, { hasSelfHostingAbility: false, key: 'peek', name: 'Peek', origin: 'Singapore', - slogan: 'Feel in control of your money without spreadsheets or shame' + slogan: 'Feel in control of your money without spreadsheets or shame', + url: 'https://peek.money' }, { key: 'pennies', name: 'Pennies', origin: 'United States', pricingPerYear: '$39.99', - slogan: 'Your money. Made simple.' + slogan: 'Your money. Made simple.', + url: 'https://www.getpennies.com' }, { founded: 2022, @@ -769,7 +843,8 @@ export const personalFinanceTools: Product[] = [ name: 'PinkLion', origin: 'Germany', pricingPerYear: '€50', - slogan: 'Invest smarter, not harder' + slogan: 'Invest smarter, not harder', + url: 'https://pinklion.xyz' }, { founded: 2023, @@ -780,7 +855,8 @@ export const personalFinanceTools: Product[] = [ name: 'Plainzer', origin: 'Poland', pricingPerYear: '$74', - slogan: 'Free dividend tracker for your portfolio' + slogan: 'Free dividend tracker for your portfolio', + url: 'https://plainzer.com' }, { founded: 2023, @@ -788,7 +864,8 @@ export const personalFinanceTools: Product[] = [ key: 'plannix', name: 'Plannix', origin: 'Italy', - slogan: 'Your Personal Finance Hub' + slogan: 'Your Personal Finance Hub', + url: 'https://www.plannix.co' }, { founded: 2015, @@ -798,7 +875,8 @@ export const personalFinanceTools: Product[] = [ name: 'PocketGuard', origin: 'United States', pricingPerYear: '$74.99', - slogan: 'Budgeting App & Finance Planner' + slogan: 'Budgeting App & Finance Planner', + url: 'https://pocketguard.com' }, { founded: 2008, @@ -810,7 +888,8 @@ export const personalFinanceTools: Product[] = [ origin: 'New Zealand', pricingPerYear: '$120', regions: ['Global'], - slogan: 'Know where your money is going' + slogan: 'Know where your money is going', + url: 'https://www.pocketsmith.com' }, { hasFreePlan: false, @@ -820,7 +899,8 @@ export const personalFinanceTools: Product[] = [ name: 'Portfolio Dividend Tracker', origin: 'Netherlands', pricingPerYear: '€60', - slogan: 'Manage all your portfolios' + slogan: 'Manage all your portfolios', + url: 'https://portfoliodividendtracker.com' }, { hasFreePlan: true, @@ -829,7 +909,8 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Portfolio Visualizer', pricingPerYear: '$360', - slogan: 'Tools for Better Investors' + slogan: 'Tools for Better Investors', + url: 'https://www.portfoliovisualizer.com' }, { hasFreePlan: true, @@ -849,7 +930,8 @@ export const personalFinanceTools: Product[] = [ name: 'Portseido', origin: 'Thailand', pricingPerYear: '$96', - slogan: 'Portfolio Performance and Dividend Tracker' + slogan: 'Portfolio Performance and Dividend Tracker', + url: 'https://www.portseido.com' }, { founded: 2021, @@ -859,7 +941,8 @@ export const personalFinanceTools: Product[] = [ name: 'ProjectionLab', origin: 'United States', pricingPerYear: '$108', - slogan: 'Build Financial Plans You Love.' + slogan: 'Build Financial Plans You Love.', + url: 'https://projectionlab.com' }, { founded: 2022, @@ -869,7 +952,8 @@ export const personalFinanceTools: Product[] = [ name: 'Pro Stock Tracker', origin: 'United Kingdom', pricingPerYear: '$60', - slogan: 'The stock portfolio tracker built for long-term investors' + slogan: 'The stock portfolio tracker built for long-term investors', + url: 'https://prostocktracker.com' }, { founded: 2015, @@ -877,7 +961,8 @@ export const personalFinanceTools: Product[] = [ key: 'rocket-money', name: 'Rocket Money', origin: 'United States', - slogan: 'Track your net worth' + slogan: 'Track your net worth', + url: 'https://www.rocketmoney.com' }, { founded: 2019, @@ -897,14 +982,16 @@ export const personalFinanceTools: Product[] = [ name: 'Seeking Alpha', origin: 'United States', pricingPerYear: '$239', - slogan: 'Stock Market Analysis & Tools for Investors' + slogan: 'Stock Market Analysis & Tools for Investors', + url: 'https://seekingalpha.com' }, { founded: 2022, key: 'segmio', name: 'Segmio', origin: 'Romania', - slogan: 'Wealth Management and Net Worth Tracking' + slogan: 'Wealth Management and Net Worth Tracking', + url: 'https://www.segmio.com' }, { founded: 2007, @@ -915,7 +1002,8 @@ export const personalFinanceTools: Product[] = [ origin: 'New Zealand', pricingPerYear: '$135', regions: ['Global'], - slogan: 'Stock Portfolio Tracker' + slogan: 'Stock Portfolio Tracker', + url: 'https://www.sharesight.com' }, { hasFreePlan: true, @@ -932,7 +1020,8 @@ export const personalFinanceTools: Product[] = [ name: 'Simple Portfolio', origin: 'Czech Republic', pricingPerYear: '€80', - slogan: 'Stock Portfolio Tracker' + slogan: 'Stock Portfolio Tracker', + url: 'https://simpleportfolio.app' }, { founded: 2014, @@ -942,7 +1031,8 @@ export const personalFinanceTools: Product[] = [ name: 'Stock Portfolio Tracker & Visualizer by Simply Wall St', origin: 'Australia', pricingPerYear: '$120', - slogan: 'Smart portfolio tracker for informed investors' + slogan: 'Smart portfolio tracker for informed investors', + url: 'https://simplywall.st' }, { founded: 2021, @@ -952,7 +1042,8 @@ export const personalFinanceTools: Product[] = [ name: 'Snowball Analytics', origin: 'France', pricingPerYear: '$80', - slogan: 'Simple and powerful portfolio tracker' + slogan: 'Simple and powerful portfolio tracker', + url: 'https://snowball-analytics.com' }, { key: 'splashmoney', @@ -966,13 +1057,15 @@ export const personalFinanceTools: Product[] = [ key: 'stock-events', name: 'Stock Events', origin: 'Germany', - slogan: 'Track all your Investments' + slogan: 'Track all your Investments', + url: 'https://stockevents.app' }, { key: 'stockle', name: 'Stockle', origin: 'Finland', - slogan: 'Supercharge your investments tracking experience' + slogan: 'Supercharge your investments tracking experience', + url: 'https://stockle.app' }, { founded: 2008, @@ -991,7 +1084,8 @@ export const personalFinanceTools: Product[] = [ name: 'Stock Rover', origin: 'United States', pricingPerYear: '$79.99', - slogan: 'Investment Research and Portfolio Management' + slogan: 'Investment Research and Portfolio Management', + url: 'https://www.stockrover.com' }, { hasFreePlan: true, @@ -1001,7 +1095,8 @@ export const personalFinanceTools: Product[] = [ name: 'Stonksfolio', origin: 'Bulgaria', pricingPerYear: '€49.90', - slogan: 'Visualize all of your portfolios' + slogan: 'Visualize all of your portfolios', + url: 'https://stonksfolio.com' }, { hasFreePlan: true, @@ -1010,7 +1105,8 @@ export const personalFinanceTools: Product[] = [ name: 'Sumio', origin: 'Czech Republic', pricingPerYear: '$20', - slogan: 'Sum up and build your wealth.' + slogan: 'Sum up and build your wealth.', + url: 'https://www.sumio.app' }, { founded: 2016, @@ -1020,7 +1116,8 @@ export const personalFinanceTools: Product[] = [ origin: 'United States', pricingPerYear: '$79', slogan: - 'Your financial life in a spreadsheet, automatically updated each day' + 'Your financial life in a spreadsheet, automatically updated each day', + url: 'https://tiller.com' }, { founded: 2011, @@ -1030,7 +1127,8 @@ export const personalFinanceTools: Product[] = [ name: 'Tradervue', origin: 'United States', pricingPerYear: '$360', - slogan: 'The Trading Journal to Improve Your Trading Performance' + slogan: 'The Trading Journal to Improve Your Trading Performance', + url: 'https://www.tradervue.com' }, { founded: 2020, @@ -1052,7 +1150,8 @@ export const personalFinanceTools: Product[] = [ name: 'Turbobulls', origin: 'Romania', pricingPerYear: '€39.99', - slogan: 'Your complete financial dashboard. Actually private.' + slogan: 'Your complete financial dashboard. Actually private.', + url: 'https://www.turbobulls.com' }, { hasFreePlan: true, @@ -1063,6 +1162,7 @@ export const personalFinanceTools: Product[] = [ origin: 'Switzerland', pricingPerYear: '$300', slogan: 'Your Portfolio. Revealed.', + url: 'https://www.utluna.com', useAnonymously: true }, { @@ -1072,7 +1172,8 @@ export const personalFinanceTools: Product[] = [ name: 'Vyzer', origin: 'United States', pricingPerYear: '$348', - slogan: 'Virtual Family Office for Smart Wealth Management' + slogan: 'Virtual Family Office for Smart Wealth Management', + url: 'https://vyzer.co' }, { founded: 2020, @@ -1082,7 +1183,8 @@ export const personalFinanceTools: Product[] = [ name: 'Walletguide', origin: 'Germany', pricingPerYear: '€90', - slogan: 'Personal finance reimagined with AI' + slogan: 'Personal finance reimagined with AI', + url: 'https://walletguide.com' }, { hasSelfHostingAbility: false, @@ -1102,7 +1204,8 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Wealthbrain', origin: 'United Arab Emirates', - slogan: 'Portfolio Management System' + slogan: 'Portfolio Management System', + url: 'https://wealthbrain.com' }, { founded: 2024, @@ -1113,7 +1216,8 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Wealthfolio', origin: 'Canada', - slogan: 'Desktop Investment Tracker' + slogan: 'Desktop Investment Tracker', + url: 'https://wealthfolio.app' }, { founded: 2015, @@ -1124,7 +1228,8 @@ export const personalFinanceTools: Product[] = [ name: 'Wealthica', origin: 'Canada', pricingPerYear: '$50', - slogan: 'See all your investments in one place' + slogan: 'See all your investments in one place', + url: 'https://wealthica.com' }, { founded: 2018, @@ -1132,7 +1237,8 @@ export const personalFinanceTools: Product[] = [ key: 'wealthposition', name: 'WealthPosition', pricingPerYear: '$60', - slogan: 'Personal Finance & Budgeting App' + slogan: 'Personal Finance & Budgeting App', + url: 'https://www.wealthposition.com' }, { founded: 2018, @@ -1141,7 +1247,8 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Wealthy Tracker', origin: 'India', - slogan: 'One app to manage all your investments' + slogan: 'One app to manage all your investments', + url: 'https://www.wealthy.in/tracker' }, { key: 'whal', @@ -1170,7 +1277,8 @@ export const personalFinanceTools: Product[] = [ name: 'YNAB (You Need a Budget)', origin: 'United States', pricingPerYear: '$109', - slogan: 'Change Your Relationship With Money' + slogan: 'Change Your Relationship With Money', + url: 'https://www.ynab.com' }, { founded: 2019, @@ -1180,6 +1288,7 @@ export const personalFinanceTools: Product[] = [ name: 'Ziggma', origin: 'United States', pricingPerYear: '$84', - slogan: 'Your solution for investing success' + slogan: 'Your solution for investing success', + url: 'https://ziggma.com' } ]; From cc7fa8232ac45ae66aa25022f5118763ee671e47 Mon Sep 17 00:00:00 2001 From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com> Date: Thu, 4 Jun 2026 22:40:48 +0700 Subject: [PATCH 20/37] Task/resolve warnings in angular-sass plugin (#6973) * feat(client): migrate table import to @use * feat(client): migrate bootstrap import to @use * feat(client): implement color channel * feat(client): migrate svgmap import to @use --- apps/client/src/styles.scss | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 4321622a1..045de2eb6 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -1,10 +1,11 @@ @use '@angular/material' as mat; +@use 'sass:color'; -@import './styles/bootstrap'; -@import './styles/table'; -@import './styles/variables'; +@use './styles/bootstrap'; +@use './styles/table' as table; +@use './styles/variables' as variables; -@import 'svgmap/style.min'; +@use 'svgmap/style.min'; :root { --dark-background: rgb(25, 25, 25); @@ -12,8 +13,10 @@ --light-background: rgb(255, 255, 255); --dark-primary-text: - #{red($dark-primary-text)}, #{green($dark-primary-text)}, - #{blue($dark-primary-text)}, #{alpha($dark-primary-text)}; + #{color.channel(variables.$dark-primary-text, 'red')}, + #{color.channel(variables.$dark-primary-text, 'green')}, + #{color.channel(variables.$dark-primary-text, 'blue')}, + #{color.channel(variables.$dark-primary-text, 'alpha')}; --dark-secondary-text: 0, 0, 0, 0.54; --dark-accent-text: 0, 0, 0, 0.87; --dark-warn-text: 0, 0, 0, 0.87; @@ -21,8 +24,10 @@ --dark-dividers: 0, 0, 0, 0.12; --dark-focused: 0, 0, 0, 0.12; --light-primary-text: - #{red($light-primary-text)}, #{green($light-primary-text)}, - #{blue($light-primary-text)}, #{alpha($light-primary-text)}; + #{color.channel(variables.$light-primary-text, 'red')}, + #{color.channel(variables.$light-primary-text, 'green')}, + #{color.channel(variables.$light-primary-text, 'blue')}, + #{color.channel(variables.$light-primary-text, 'alpha')}; --light-secondary-text: 255, 255, 255, 0.7; --light-accent-text: 255, 255, 255, 1; --light-warn-text: 255, 255, 255, 1; @@ -240,7 +245,7 @@ body { } .gf-table { - @include gf-table(true); + @include table.gf-table(true); } .mat-mdc-dialog-container { @@ -353,7 +358,7 @@ ngx-skeleton-loader { } .gf-table { - @include gf-table; + @include table.gf-table; } .gf-text-wrap-balance { From 3adf88044486df623d9dd1bc3ea6e5f4a1285ff7 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Fri, 5 Jun 2026 17:24:52 +0200 Subject: [PATCH 21/37] Task/extend personal finance tools (#6985) * Gustav * MyFinanceTools * Networthy * Rallies * trefolio --- libs/common/src/lib/personal-finance-tools.ts | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index e7d964872..23697e63b 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -518,6 +518,18 @@ export const personalFinanceTools: Product[] = [ origin: 'Germany', slogan: 'Volle Kontrolle über deine Investitionen' }, + { + founded: 2024, + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'gustav', + languages: ['Français'], + name: 'Gustav', + origin: 'France', + pricingPerYear: '€59.99', + slogan: 'Prenez enfin le contrôle de votre argent', + url: 'https://get-gustav.com' + }, { hasFreePlan: true, hasSelfHostingAbility: false, @@ -784,6 +796,16 @@ export const personalFinanceTools: Product[] = [ 'Track your equity, fund, investment trust, ETF and pension investments in one place.', url: 'https://www.morningstar.com/mm' }, + { + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'myfinancetools', + languages: ['Deutsch', 'English', 'Español', 'Français', 'Português'], + name: 'MyFinanceTools', + pricingPerYear: '$36', + slogan: 'Your Personal Finance Command Center', + url: 'https://myfinancetools.io' + }, { founded: 2020, hasFreePlan: true, @@ -806,6 +828,15 @@ export const personalFinanceTools: Product[] = [ slogan: 'The Intelligent Portfolio Tracker', url: 'https://www.navexa.com' }, + { + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'networthy', + name: 'Networthy', + pricingPerYear: '€49.99', + slogan: 'Your Personal Financial Analyst, powered by AI.', + url: 'https://networthy.pro' + }, { founded: 2020, hasSelfHostingAbility: false, @@ -955,6 +986,17 @@ export const personalFinanceTools: Product[] = [ slogan: 'The stock portfolio tracker built for long-term investors', url: 'https://prostocktracker.com' }, + { + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'rallies', + languages: ['English'], + name: 'Rallies', + pricingPerYear: '$99.99', + slogan: + 'Your entire financial life in one app, monitored continuously by agents', + url: 'https://rallies.ai' + }, { founded: 2015, hasSelfHostingAbility: false, @@ -1130,6 +1172,25 @@ export const personalFinanceTools: Product[] = [ slogan: 'The Trading Journal to Improve Your Trading Performance', url: 'https://www.tradervue.com' }, + { + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'trefolio', + languages: [ + 'Deutsch', + 'English', + 'Español', + 'Français', + 'Italiano', + 'Nederlands', + 'Polski', + 'Português' + ], + name: 'trefolio', + pricingPerYear: '€60', + slogan: 'The Extra Leaf for Your Portfolio', + url: 'https://trefolio.com' + }, { founded: 2020, hasSelfHostingAbility: false, From 7b0ebf1587941f35bf279840a2006fbc7b4e1f27 Mon Sep 17 00:00:00 2001 From: Ankit Singh Date: Fri, 5 Jun 2026 20:55:41 +0530 Subject: [PATCH 22/37] Feature/auto-refresh user table in admin control panel every 30s (#6954) * Auto-refresh user table * Update changelog --------- Co-authored-by: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> --- CHANGELOG.md | 6 +++++ .../admin-users/admin-users.component.ts | 22 ++++++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 451390256..472d0678b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added an automatic refresh every 30 seconds to the users table in the admin control panel + ## 3.7.0 - 2026-06-02 ### Added diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index 93899c9ee..f477776a5 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -59,8 +59,10 @@ import { personOutline, trashOutline } from 'ionicons/icons'; +import ms from 'ms'; import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; +import { interval } from 'rxjs'; import { switchMap, tap } from 'rxjs/operators'; @Component({ @@ -184,6 +186,15 @@ export class GfAdminUsersComponent implements OnInit { public ngOnInit() { this.fetchUsers(); + + interval(ms('30 seconds')) + .pipe(takeUntilDestroyed(this.destroyRef)) + .subscribe(() => { + this.fetchUsers({ + pageIndex: this.paginator().pageIndex, + showLoading: false + }); + }); } protected formatDistanceToNow(aDateString: string) { @@ -267,8 +278,13 @@ export class GfAdminUsersComponent implements OnInit { ); } - private fetchUsers({ pageIndex }: { pageIndex: number } = { pageIndex: 0 }) { - this.isLoading = true; + private fetchUsers({ + pageIndex = 0, + showLoading = true + }: { pageIndex?: number; showLoading?: boolean } = {}) { + if (showLoading) { + this.isLoading = true; + } if (pageIndex === 0 && this.paginator()) { this.paginator().pageIndex = 0; @@ -281,7 +297,7 @@ export class GfAdminUsersComponent implements OnInit { }) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(({ count, users }) => { - this.dataSource = new MatTableDataSource(users); + this.dataSource.data = users; this.totalItems = count; this.isLoading = false; From 9c18b04d4342488966ac0a828b356659a7ec9fe0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 6 Jun 2026 08:50:32 +0200 Subject: [PATCH 23/37] Bugfix/truncate long titles in asset profile dialog (#6990) * Truncate long titles * Update changelog --- CHANGELOG.md | 4 ++++ .../asset-profile-dialog.component.scss | 4 ++++ .../asset-profile-dialog/asset-profile-dialog.html | 12 ++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 472d0678b..2e315dfc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added an automatic refresh every 30 seconds to the users table in the admin control panel +### Fixed + +- Fixed a layout issue in the asset profile dialog of the admin control by truncating long titles + ## 3.7.0 - 2026-06-02 ### Added diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss index 73c0c0d74..db23cf0a7 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss @@ -14,4 +14,8 @@ top: 0; } } + + .mat-mdc-dialog-title { + padding-right: 0.5rem !important; + } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index b2a7e0a05..61ca6a6da 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1,10 +1,10 @@
-
-

- {{ assetProfile?.name ?? data.symbol }} -

+

+ {{ + assetProfile?.name ?? data.symbol + }} -

+
Date: Sat, 6 Jun 2026 09:25:28 +0200 Subject: [PATCH 24/37] Task/migrate backend logger to instance pattern (#6966) * Refactor backend logging to use instance-based Logger * Update changelog --- CHANGELOG.md | 4 ++ apps/api/src/app/admin/admin.controller.ts | 4 +- apps/api/src/app/auth/auth.module.ts | 4 +- apps/api/src/app/auth/google.strategy.ts | 4 +- apps/api/src/app/auth/oidc.strategy.ts | 9 +-- apps/api/src/app/auth/web-auth.service.ts | 6 +- .../benchmarks/benchmarks.service.ts | 7 ++- .../ghostfolio/ghostfolio.service.ts | 12 ++-- apps/api/src/app/health/health.controller.ts | 4 +- apps/api/src/app/import/import.controller.ts | 4 +- .../calculator/portfolio-calculator.ts | 7 ++- .../calculator/roai/portfolio-calculator.ts | 6 +- .../src/app/portfolio/portfolio.service.ts | 7 ++- .../app/redis-cache/redis-cache.service.ts | 6 +- .../subscription/subscription.controller.ts | 14 ++--- .../app/subscription/subscription.service.ts | 9 +-- apps/api/src/app/symbol/symbol.service.ts | 4 +- .../events/asset-profile-changed.listener.ts | 12 ++-- .../src/events/portfolio-changed.listener.ts | 7 +-- .../performance-logging.service.ts | 4 +- apps/api/src/main.ts | 18 +++--- .../middlewares/html-template.middleware.ts | 8 +-- .../services/benchmark/benchmark.service.ts | 6 +- .../coingecko/coingecko.service.ts | 8 ++- .../trackinsight/trackinsight.service.ts | 7 ++- .../yahoo-finance/yahoo-finance.service.ts | 6 +- .../data-provider/data-provider.service.ts | 31 ++++++----- .../eod-historical-data.service.ts | 21 ++++--- .../financial-modeling-prep.service.ts | 13 +++-- .../ghostfolio/ghostfolio.service.ts | 12 ++-- .../google-sheets/google-sheets.service.ts | 4 +- .../data-provider/manual/manual.service.ts | 9 +-- .../rapid-api/rapid-api.service.ts | 6 +- .../yahoo-finance/yahoo-finance.service.ts | 23 +++----- .../exchange-rate-data.service.ts | 19 +++---- apps/api/src/services/fetch/fetch.service.ts | 24 +++----- apps/api/src/services/i18n/i18n.service.ts | 8 ++- .../api/src/services/prisma/prisma.service.ts | 4 +- .../data-gathering.processor.ts | 42 ++++++-------- .../data-gathering/data-gathering.service.ts | 15 ++--- .../portfolio-snapshot.processor.ts | 17 +++--- .../statistics-gathering.processor.ts | 55 +++++++------------ .../twitter-bot/twitter-bot.service.ts | 9 +-- 43 files changed, 249 insertions(+), 250 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e315dfc9..35ca028a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added an automatic refresh every 30 seconds to the users table in the admin control panel +### Changed + +- Refactored the backend logging to use the instance-based `Logger` + ### Fixed - Fixed a layout issue in the asset profile dialog of the admin control by truncating long titles diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 69b619625..97642feb5 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -58,6 +58,8 @@ import { AdminService } from './admin.service'; @Controller('admin') export class AdminController { + private readonly logger = new Logger(AdminController.name); + public constructor( private readonly adminService: AdminService, private readonly apiService: ApiService, @@ -260,7 +262,7 @@ export class AdminController { `Could not parse the market price for ${symbol} (${dataSource})` ); } catch (error) { - Logger.error(error, 'AdminController'); + this.logger.error(error); throw new HttpException(error.message, StatusCodes.BAD_REQUEST); } diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index f55093bbf..1d6990307 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -50,6 +50,8 @@ import { OidcStrategy } from './oidc.strategy'; configurationService: ConfigurationService, fetchService: FetchService ) => { + const logger = new Logger('OidcStrategy'); + const isOidcEnabled = configurationService.get( 'ENABLE_FEATURE_AUTH_OIDC' ); @@ -101,7 +103,7 @@ import { OidcStrategy } from './oidc.strategy'; tokenURL = manualTokenUrl || config.token_endpoint; userInfoURL = manualUserInfoUrl || config.userinfo_endpoint; } catch (error) { - Logger.error(error, 'OidcStrategy'); + logger.error(error); throw new Error('Failed to fetch OIDC configuration from issuer'); } } diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts index 3e4b4ca0d..53720c383 100644 --- a/apps/api/src/app/auth/google.strategy.ts +++ b/apps/api/src/app/auth/google.strategy.ts @@ -10,6 +10,8 @@ import { AuthService } from './auth.service'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { + private readonly logger = new Logger(GoogleStrategy.name); + public constructor( private readonly authService: AuthService, configurationService: ConfigurationService @@ -40,7 +42,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { done(null, { jwt }); } catch (error) { - Logger.error(error, 'GoogleStrategy'); + this.logger.error(error); done(error, false); } } diff --git a/apps/api/src/app/auth/oidc.strategy.ts b/apps/api/src/app/auth/oidc.strategy.ts index 96b284121..661f2a821 100644 --- a/apps/api/src/app/auth/oidc.strategy.ts +++ b/apps/api/src/app/auth/oidc.strategy.ts @@ -15,6 +15,8 @@ import { OidcStateStore } from './oidc-state.store'; @Injectable() export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { + private readonly logger = new Logger(OidcStrategy.name); + private static readonly stateStore = new OidcStateStore(); public constructor( @@ -52,9 +54,8 @@ export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { }); if (!thirdPartyId) { - Logger.error( - `Missing subject identifier in OIDC response from ${issuer}`, - 'OidcStrategy' + this.logger.error( + `Missing subject identifier in OIDC response from ${issuer}` ); throw new Error('Missing subject identifier in OIDC response'); @@ -62,7 +63,7 @@ export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { return { jwt }; } catch (error) { - Logger.error(error, 'OidcStrategy'); + this.logger.error(error); throw error; } } diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index 6cffcd244..5764eeece 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -33,6 +33,8 @@ import ms from 'ms'; @Injectable() export class WebAuthService { + private readonly logger = new Logger(WebAuthService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly deviceService: AuthDeviceService, @@ -103,7 +105,7 @@ export class WebAuthService { verification = await verifyRegistrationResponse(opts); } catch (error) { - Logger.error(error, 'WebAuthService'); + this.logger.error(error); throw new InternalServerErrorException(error.message); } @@ -210,7 +212,7 @@ export class WebAuthService { verification = await verifyAuthenticationResponse(opts); } catch (error) { - Logger.error(error, 'WebAuthService'); + this.logger.error(error); throw new InternalServerErrorException({ error: error.message }); } diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts index 03ff32c21..0b95880d4 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts @@ -17,6 +17,8 @@ import { isNumber } from 'lodash'; @Injectable() export class BenchmarksService { + private readonly logger = new Logger(BenchmarksService.name); + public constructor( private readonly benchmarkService: BenchmarkService, private readonly exchangeRateDataService: ExchangeRateDataService, @@ -96,12 +98,11 @@ export class BenchmarksService { })?.marketPrice; if (!marketPriceAtStartDate) { - Logger.error( + this.logger.error( `No historical market data has been found for ${symbol} (${dataSource}) at ${format( startDate, DATE_FORMAT - )}`, - 'BenchmarkService' + )}` ); return { marketData }; diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index 3f91dbecc..b84ca881f 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -34,6 +34,8 @@ import { Big } from 'big.js'; @Injectable() export class GhostfolioService { + private readonly logger = new Logger(GhostfolioService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly dataProviderService: DataProviderService, @@ -99,7 +101,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -141,7 +143,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -183,7 +185,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -271,7 +273,7 @@ export class GhostfolioService { return results; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -348,7 +350,7 @@ export class GhostfolioService { return results; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } diff --git a/apps/api/src/app/health/health.controller.ts b/apps/api/src/app/health/health.controller.ts index 35f3fa348..4f88a03f0 100644 --- a/apps/api/src/app/health/health.controller.ts +++ b/apps/api/src/app/health/health.controller.ts @@ -24,6 +24,8 @@ import { HealthService } from './health.service'; @Controller('health') export class HealthController { + private readonly logger = new Logger(HealthController.name); + public constructor( private readonly aiService: AiService, private readonly healthService: HealthService @@ -61,7 +63,7 @@ export class HealthController { .json({ status: getReasonPhrase(StatusCodes.OK) }); } } catch (error) { - Logger.error(error, 'HealthController'); + this.logger.error(error); } return response diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 521be56f7..c3e79a29f 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -31,6 +31,8 @@ import { ImportService } from './import.service'; @Controller('import') export class ImportController { + private readonly logger = new Logger(ImportController.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly importService: ImportService, @@ -81,7 +83,7 @@ export class ImportController { return { activities }; } catch (error) { - Logger.error(error, ImportController); + this.logger.error(error); throw new HttpException( { diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index d57b85d8c..ab3f76703 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -62,6 +62,8 @@ import { isNumber, sortBy, sum, uniqBy } from 'lodash'; export abstract class PortfolioCalculator { protected static readonly ENABLE_LOGGING = false; + protected readonly logger = new Logger(PortfolioCalculator.name); + protected accountBalanceItems: HistoricalDataItem[]; protected activities: PortfolioOrder[]; @@ -1119,12 +1121,11 @@ export abstract class PortfolioCalculator { if (cachedPortfolioSnapshot) { this.snapshot = cachedPortfolioSnapshot; - Logger.debug( + this.logger.debug( `Fetched portfolio snapshot from cache in ${( (performance.now() - startTimeTotal) / 1000 - ).toFixed(3)} seconds`, - 'PortfolioCalculator' + ).toFixed(3)} seconds` ); if (isCachedPortfolioSnapshotExpired) { diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts index 2841e9975..d5efc4bf2 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts @@ -11,7 +11,6 @@ import { PortfolioSnapshot, TimelinePosition } from '@ghostfolio/common/models'; import { DateRange } from '@ghostfolio/common/types'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; -import { Logger } from '@nestjs/common'; import { Big } from 'big.js'; import { addMilliseconds, @@ -96,9 +95,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { currentPosition.timeWeightedInvestmentWithCurrencyEffect ); } else if (!currentPosition.quantity.eq(0)) { - Logger.warn( - `Missing historical market data for ${currentPosition.symbol} (${currentPosition.dataSource})`, - 'PortfolioCalculator' + this.logger.warn( + `Missing historical market data for ${currentPosition.symbol} (${currentPosition.dataSource})` ); hasErrors = true; diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 37d76bcfa..4feb0f77a 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -108,6 +108,8 @@ const europeMarkets = require('../../assets/countries/europe-markets.json'); @Injectable() export class PortfolioService { + private readonly logger = new Logger(PortfolioService.name); + public constructor( private readonly accountBalanceService: AccountBalanceService, private readonly accountService: AccountService, @@ -619,9 +621,8 @@ export class PortfolioService { symbolProfileMap[getAssetProfileIdentifier({ dataSource, symbol })]; if (!assetProfile) { - Logger.warn( - `Asset profile not found for ${symbol} (${dataSource})`, - 'PortfolioService' + this.logger.warn( + `Asset profile not found for ${symbol} (${dataSource})` ); continue; diff --git a/apps/api/src/app/redis-cache/redis-cache.service.ts b/apps/api/src/app/redis-cache/redis-cache.service.ts index 619d23fc5..b87740f8c 100644 --- a/apps/api/src/app/redis-cache/redis-cache.service.ts +++ b/apps/api/src/app/redis-cache/redis-cache.service.ts @@ -10,6 +10,8 @@ import { createHash, randomUUID } from 'node:crypto'; @Injectable() export class RedisCacheService { + private readonly logger = new Logger(RedisCacheService.name); + private client: Keyv; public constructor( @@ -27,7 +29,7 @@ export class RedisCacheService { }; this.client.on('error', (error) => { - Logger.error(error, 'RedisCacheService'); + this.logger.error(error); }); } @@ -101,7 +103,7 @@ export class RedisCacheService { return true; } catch (error) { - Logger.error(error?.message, 'RedisCacheService'); + this.logger.error(error?.message); return false; } finally { diff --git a/apps/api/src/app/subscription/subscription.controller.ts b/apps/api/src/app/subscription/subscription.controller.ts index 3e6316ec6..074a9db0e 100644 --- a/apps/api/src/app/subscription/subscription.controller.ts +++ b/apps/api/src/app/subscription/subscription.controller.ts @@ -33,6 +33,8 @@ import { SubscriptionService } from './subscription.service'; @Controller('subscription') export class SubscriptionController { + private readonly logger = new Logger(SubscriptionController.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly propertyService: PropertyService, @@ -80,9 +82,8 @@ export class SubscriptionController { value: JSON.stringify(coupons) }); - Logger.log( - `Subscription for user '${this.request.user.id}' has been created with a coupon for ${coupon.duration}`, - 'SubscriptionController' + this.logger.log( + `Subscription for user '${this.request.user.id}' has been created with a coupon for ${coupon.duration}` ); return { @@ -101,9 +102,8 @@ export class SubscriptionController { ); if (userId) { - Logger.log( - `Subscription for user '${userId}' has been created via Stripe`, - 'SubscriptionController' + this.logger.log( + `Subscription for user '${userId}' has been created via Stripe` ); } @@ -126,7 +126,7 @@ export class SubscriptionController { user: this.request.user }); } catch (error) { - Logger.error(error, 'SubscriptionController'); + this.logger.error(error); throw new HttpException( getReasonPhrase(StatusCodes.BAD_REQUEST), diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 557d81976..a811d2243 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -24,6 +24,8 @@ import Stripe from 'stripe'; @Injectable() export class SubscriptionService { + private readonly logger = new Logger(SubscriptionService.name); + private stripe: Stripe; public constructor( @@ -166,9 +168,8 @@ export class SubscriptionService { error instanceof Prisma.PrismaClientKnownRequestError && error.code === 'P2002' ) { - Logger.log( - `Stripe Checkout Session '${session.id}' has already been redeemed`, - 'SubscriptionService' + this.logger.log( + `Stripe Checkout Session '${session.id}' has already been redeemed` ); } else { throw error; @@ -177,7 +178,7 @@ export class SubscriptionService { return session.client_reference_id; } catch (error) { - Logger.error(error, 'SubscriptionService'); + this.logger.error(error); } } diff --git a/apps/api/src/app/symbol/symbol.service.ts b/apps/api/src/app/symbol/symbol.service.ts index 15498e80d..fdbc7f84c 100644 --- a/apps/api/src/app/symbol/symbol.service.ts +++ b/apps/api/src/app/symbol/symbol.service.ts @@ -15,6 +15,8 @@ import { format, subDays } from 'date-fns'; @Injectable() export class SymbolService { + private readonly logger = new Logger(SymbolService.name); + public constructor( private readonly dataProviderService: DataProviderService, private readonly marketDataService: MarketDataService @@ -119,7 +121,7 @@ export class SymbolService { results.items = items; return results; } catch (error) { - Logger.error(error, 'SymbolService'); + this.logger.error(error); throw error; } diff --git a/apps/api/src/events/asset-profile-changed.listener.ts b/apps/api/src/events/asset-profile-changed.listener.ts index cc70edad6..e2aea382e 100644 --- a/apps/api/src/events/asset-profile-changed.listener.ts +++ b/apps/api/src/events/asset-profile-changed.listener.ts @@ -15,6 +15,8 @@ import { AssetProfileChangedEvent } from './asset-profile-changed.event'; @Injectable() export class AssetProfileChangedListener { + private readonly logger = new Logger(AssetProfileChangedListener.name); + private static readonly DEBOUNCE_DELAY = ms('5 seconds'); private debounceTimers = new Map(); @@ -67,10 +69,7 @@ export class AssetProfileChangedListener { dataSource: DataSource; symbol: string; }) { - Logger.log( - `Asset profile of ${symbol} (${dataSource}) has changed`, - 'AssetProfileChangedListener' - ); + this.logger.log(`Asset profile of ${symbol} (${dataSource}) has changed`); if ( this.configurationService.get( @@ -84,10 +83,7 @@ export class AssetProfileChangedListener { const existingCurrencies = this.exchangeRateDataService.getCurrencies(); if (!existingCurrencies.includes(currency)) { - Logger.log( - `New currency ${currency} has been detected`, - 'AssetProfileChangedListener' - ); + this.logger.log(`New currency ${currency} has been detected`); await this.exchangeRateDataService.initialize(); } diff --git a/apps/api/src/events/portfolio-changed.listener.ts b/apps/api/src/events/portfolio-changed.listener.ts index f8e2a9229..12441517b 100644 --- a/apps/api/src/events/portfolio-changed.listener.ts +++ b/apps/api/src/events/portfolio-changed.listener.ts @@ -8,6 +8,8 @@ import { PortfolioChangedEvent } from './portfolio-changed.event'; @Injectable() export class PortfolioChangedListener { + private readonly logger = new Logger(PortfolioChangedListener.name); + private static readonly DEBOUNCE_DELAY = ms('5 seconds'); private debounceTimers = new Map(); @@ -35,10 +37,7 @@ export class PortfolioChangedListener { } private async processPortfolioChanged({ userId }: { userId: string }) { - Logger.log( - `Portfolio of user '${userId}' has changed`, - 'PortfolioChangedListener' - ); + this.logger.log(`Portfolio of user '${userId}' has changed`); await this.redisCacheService.removePortfolioSnapshotsByUserId({ userId }); } diff --git a/apps/api/src/interceptors/performance-logging/performance-logging.service.ts b/apps/api/src/interceptors/performance-logging/performance-logging.service.ts index 1b1faf8e0..a07783cd9 100644 --- a/apps/api/src/interceptors/performance-logging/performance-logging.service.ts +++ b/apps/api/src/interceptors/performance-logging/performance-logging.service.ts @@ -2,6 +2,8 @@ import { Injectable, Logger } from '@nestjs/common'; @Injectable() export class PerformanceLoggingService { + private readonly logger = new Logger(PerformanceLoggingService.name); + public logPerformance({ className, methodName, @@ -13,7 +15,7 @@ export class PerformanceLoggingService { }) { const endTime = performance.now(); - Logger.debug( + this.logger.debug( `Completed execution of ${methodName}() in ${((endTime - startTime) / 1000).toFixed(3)} seconds`, className ); diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 94e389f6a..63185a48b 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -23,6 +23,8 @@ import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; +const logger = new Logger('Bootstrap'); + async function bootstrap() { // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY for outbound HTTP requests setGlobalDispatcher(new EnvHttpProxyAgent()); @@ -114,20 +116,20 @@ async function bootstrap() { address = `${host}:${addressObject.port}`; } - Logger.log(`Listening at http://${address}`); - Logger.log(''); + logger.log(`Listening at http://${address}`); + logger.log(''); }); } function logLogo() { - Logger.log(' ________ __ ____ ___'); - Logger.log(' / ____/ /_ ____ _____/ /_/ __/___ / (_)___'); - Logger.log(' / / __/ __ \\/ __ \\/ ___/ __/ /_/ __ \\/ / / __ \\'); - Logger.log('/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ /'); - Logger.log( + logger.log(' ________ __ ____ ___'); + logger.log(' / ____/ /_ ____ _____/ /_/ __/___ / (_)___'); + logger.log(' / / __/ __ \\/ __ \\/ ___/ __/ /_/ __ \\/ / / __ \\'); + logger.log('/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ /'); + logger.log( `\\____/_/ /_/\\____/____/\\__/_/ \\____/_/_/\\____/ ${environment.version}` ); - Logger.log(''); + logger.log(''); } bootstrap(); diff --git a/apps/api/src/middlewares/html-template.middleware.ts b/apps/api/src/middlewares/html-template.middleware.ts index 2b8820e81..c256ada56 100644 --- a/apps/api/src/middlewares/html-template.middleware.ts +++ b/apps/api/src/middlewares/html-template.middleware.ts @@ -92,6 +92,8 @@ const locales = { @Injectable() export class HtmlTemplateMiddleware implements NestMiddleware { + private readonly logger = new Logger(HtmlTemplateMiddleware.name); + private indexHtmlMap: { [languageCode: string]: string } = {}; public constructor(private readonly i18nService: I18nService) { @@ -107,11 +109,7 @@ export class HtmlTemplateMiddleware implements NestMiddleware { {} ); } catch (error) { - Logger.error( - 'Failed to initialize index HTML map', - error, - 'HTMLTemplateMiddleware' - ); + this.logger.error('Failed to initialize index HTML map', error); } } diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 4b1d9a65f..022a0e928 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -28,6 +28,8 @@ import { BenchmarkValue } from './interfaces/benchmark-value.interface'; @Injectable() export class BenchmarkService { + private readonly logger = new Logger(BenchmarkService.name); + private readonly CACHE_KEY_BENCHMARKS = 'BENCHMARKS'; public constructor( @@ -87,7 +89,7 @@ export class BenchmarkService { const { benchmarks, expiration }: BenchmarkValue = JSON.parse(cachedBenchmarkValue); - Logger.debug('Fetched benchmarks from cache', 'BenchmarkService'); + this.logger.debug('Fetched benchmarks from cache'); if (isAfter(new Date(), new Date(expiration))) { this.calculateAndCacheBenchmarks({ @@ -227,7 +229,7 @@ export class BenchmarkService { private async calculateAndCacheBenchmarks({ enableSharing = false }): Promise { - Logger.debug('Calculate benchmarks', 'BenchmarkService'); + this.logger.debug('Calculate benchmarks'); const benchmarkAssetProfiles = await this.getBenchmarkAssetProfiles({ enableSharing diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index b01ba177b..5d6ed79aa 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -29,6 +29,8 @@ import { format, fromUnixTime, getUnixTime } from 'date-fns'; @Injectable() export class CoinGeckoService implements DataProviderInterface, OnModuleInit { + private readonly logger = new Logger(CoinGeckoService.name); + private apiUrl: string; private headers: HeadersInit = {}; @@ -88,7 +90,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return response; @@ -214,7 +216,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return response; @@ -262,7 +264,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return { items }; diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index eeccf725e..a74aaeb46 100644 --- a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts @@ -11,6 +11,8 @@ import { countries } from 'countries-list'; @Injectable() export class TrackinsightDataEnhancerService implements DataEnhancerInterface { + private readonly logger = new Logger(TrackinsightDataEnhancerService.name); + private static baseUrl = 'https://www.trackinsight.com/data-api'; private static countriesMapping = { 'Russian Federation': 'Russia', @@ -209,9 +211,8 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { return undefined; }) .catch(({ message }) => { - Logger.error( - `Failed to search Trackinsight symbol for ${symbol} (${message})`, - 'TrackinsightDataEnhancerService' + this.logger.error( + `Failed to search Trackinsight symbol for ${symbol} (${message})` ); return undefined; diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index 30ad81c09..034916a5f 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -23,6 +23,8 @@ import type { Price } from 'yahoo-finance2/esm/src/modules/quoteSummary-iface'; @Injectable() export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { + private readonly logger = new Logger(YahooFinanceDataEnhancerService.name); + private readonly yahooFinance = new YahooFinance({ suppressNotices: ['yahooSurvey'] }); @@ -123,7 +125,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { response.url = url; } } catch (error) { - Logger.error(error, 'YahooFinanceDataEnhancerService'); + this.logger.error(error); } return response; @@ -266,7 +268,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { `No data found, ${aSymbol} (${this.getName()}) may be delisted` ); } else { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); } } diff --git a/apps/api/src/services/data-provider/data-provider.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 5f0a6928a..1ea2d6436 100644 --- a/apps/api/src/services/data-provider/data-provider.service.ts +++ b/apps/api/src/services/data-provider/data-provider.service.ts @@ -41,6 +41,8 @@ import { AssetProfileInvalidError } from './errors/asset-profile-invalid.error'; @Injectable() export class DataProviderService implements OnModuleInit { + private readonly logger = new Logger(DataProviderService.name); + private dataProviderMapping: { [dataProviderName: string]: string }; public constructor( @@ -129,7 +131,7 @@ export class DataProviderService implements OnModuleInit { ); } } catch (error) { - Logger.error(error, 'DataProviderService'); + this.logger.error(error); throw error; } @@ -391,7 +393,7 @@ export class DataProviderService implements OnModuleInit { return r; }, {}); } catch (error) { - Logger.error(error, 'DataProviderService'); + this.logger.error(error); } finally { return response; } @@ -503,7 +505,7 @@ export class DataProviderService implements OnModuleInit { result[symbol] = data; } } catch (error) { - Logger.error(error, 'DataProviderService'); + this.logger.error(error); throw error; } @@ -567,13 +569,12 @@ export class DataProviderService implements OnModuleInit { const numberOfItemsInCache = Object.keys(response)?.length; if (numberOfItemsInCache) { - Logger.debug( + this.logger.debug( `Fetched ${numberOfItemsInCache} quote${ numberOfItemsInCache > 1 ? 's' : '' } from cache in ${((performance.now() - startTimeTotal) / 1000).toFixed( 3 - )} seconds`, - 'DataProviderService' + )} seconds` ); } @@ -684,14 +685,13 @@ export class DataProviderService implements OnModuleInit { } } - Logger.debug( + this.logger.debug( `Fetched ${symbolsChunk.length} quote${ symbolsChunk.length > 1 ? 's' : '' } from ${dataSource} in ${( (performance.now() - startTimeDataSource) / 1000 - ).toFixed(3)} seconds`, - 'DataProviderService' + ).toFixed(3)} seconds` ); try { @@ -722,15 +722,18 @@ export class DataProviderService implements OnModuleInit { await Promise.all(promises); - Logger.debug('--------------------------------------------------------'); - Logger.debug( + this.logger.debug( + '--------------------------------------------------------' + ); + this.logger.debug( `Fetched ${items.length} quote${items.length > 1 ? 's' : ''} in ${( (performance.now() - startTimeTotal) / 1000 - ).toFixed(3)} seconds`, - 'DataProviderService' + ).toFixed(3)} seconds` + ); + this.logger.debug( + '========================================================' ); - Logger.debug('========================================================'); return response; } diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 3fa38842b..06173c25b 100644 --- a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts +++ b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts @@ -37,6 +37,8 @@ import { isNumber } from 'lodash'; export class EodHistoricalDataService implements DataProviderInterface, OnModuleInit { + private readonly logger = new Logger(EodHistoricalDataService.name); + private apiKey: string; private readonly URL = 'https://eodhistoricaldata.com/api'; @@ -127,12 +129,11 @@ export class EodHistoricalDataService return response; } catch (error) { - Logger.error( + this.logger.error( `Could not get dividends for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT - )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`, - 'EodHistoricalDataService' + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` ); return {}; @@ -172,9 +173,8 @@ export class EodHistoricalDataService marketPrice: adjusted_close }; } else { - Logger.error( - `Could not get historical market data for ${symbol} (${this.getName()}) at ${date}`, - 'EodHistoricalDataService' + this.logger.error( + `Could not get historical market data for ${symbol} (${this.getName()}) at ${date}` ); } @@ -292,9 +292,8 @@ export class EodHistoricalDataService dataSource: this.getName() }; } else { - Logger.error( - `Could not get quote for ${this.convertFromEodSymbol(code)} (${this.getName()})`, - 'EodHistoricalDataService' + this.logger.error( + `Could not get quote for ${this.convertFromEodSymbol(code)} (${this.getName()})` ); } } @@ -311,7 +310,7 @@ export class EodHistoricalDataService ).toFixed(3)} seconds`; } - Logger.error(message, 'EodHistoricalDataService'); + this.logger.error(message); } return {}; @@ -465,7 +464,7 @@ export class EodHistoricalDataService ).toFixed(3)} seconds`; } - Logger.error(message, 'EodHistoricalDataService'); + this.logger.error(message); } return searchResult; diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index fa36a0d17..80eeadeb0 100644 --- a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts +++ b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts @@ -49,6 +49,8 @@ import { uniqBy } from 'lodash'; export class FinancialModelingPrepService implements DataProviderInterface, OnModuleInit { + private readonly logger = new Logger(FinancialModelingPrepService.name); + private static countriesMapping = { 'Korea (the Republic of)': 'South Korea', 'Russian Federation': 'Russia', @@ -265,7 +267,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return response; @@ -325,12 +327,11 @@ export class FinancialModelingPrepService return response; } catch (error) { - Logger.error( + this.logger.error( `Could not get dividends for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT - )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`, - 'FinancialModelingPrepService' + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` ); return {}; @@ -518,7 +519,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return response; @@ -638,7 +639,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return { items }; diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 2f2601d5d..2b91855a6 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -33,6 +33,8 @@ import { StatusCodes } from 'http-status-codes'; @Injectable() export class GhostfolioService implements DataProviderInterface { + private readonly logger = new Logger(GhostfolioService.name); + private readonly URL = environment.production ? 'https://ghostfol.io/api' : `${this.configurationService.get('ROOT_URL')}/api`; @@ -89,7 +91,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return assetProfile; @@ -154,7 +156,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return dividends; @@ -211,7 +213,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(error.message, 'GhostfolioService'); + this.logger.error(error.message); throw new Error( `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( @@ -283,7 +285,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return quotes; @@ -338,7 +340,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return searchResult; diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index ba1e5bbe5..13f671bd4 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -24,6 +24,8 @@ import { GoogleSpreadsheet } from 'google-spreadsheet'; @Injectable() export class GoogleSheetsService implements DataProviderInterface { + private readonly logger = new Logger(GoogleSheetsService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly prismaService: PrismaService, @@ -144,7 +146,7 @@ export class GoogleSheetsService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'GoogleSheetsService'); + this.logger.error(error); } return {}; diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 11e0aae6a..87e116dda 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -31,6 +31,8 @@ import { addDays, format, isBefore } from 'date-fns'; @Injectable() export class ManualService implements DataProviderInterface { + private readonly logger = new Logger(ManualService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly fetchService: FetchService, @@ -181,9 +183,8 @@ export class ManualService implements DataProviderInterface { }); return { marketPrice, symbol }; } catch (error) { - Logger.error( - `Could not get quote for ${symbol} (${this.getName()}): [${error.name}] ${error.message}`, - 'ManualService' + this.logger.error( + `Could not get quote for ${symbol} (${this.getName()}): [${error.name}] ${error.message}` ); return { symbol, marketPrice: undefined }; } @@ -216,7 +217,7 @@ export class ManualService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'ManualService'); + this.logger.error(error); } return {}; diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index 22896cccc..9941ae9eb 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -26,6 +26,8 @@ import { format } from 'date-fns'; @Injectable() export class RapidApiService implements DataProviderInterface { + private readonly logger = new Logger(RapidApiService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly fetchService: FetchService @@ -122,7 +124,7 @@ export class RapidApiService implements DataProviderInterface { }; } } catch (error) { - Logger.error(error, 'RapidApiService'); + this.logger.error(error); } return {}; @@ -167,7 +169,7 @@ export class RapidApiService implements DataProviderInterface { ).toFixed(3)} seconds`; } - Logger.error(message, 'RapidApiService'); + this.logger.error(message); return undefined; } diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index de8807098..93949ebc0 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -41,6 +41,8 @@ import { SearchQuoteNonYahoo } from 'yahoo-finance2/esm/src/modules/search'; @Injectable() export class YahooFinanceService implements DataProviderInterface { + private readonly logger = new Logger(YahooFinanceService.name); + private readonly yahooFinance = new YahooFinance({ suppressNotices: ['yahooSurvey'] }); @@ -105,12 +107,11 @@ export class YahooFinanceService implements DataProviderInterface { return response; } catch (error) { - Logger.error( + this.logger.error( `Could not get dividends for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT - )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`, - 'YahooFinanceService' + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` ); return {}; @@ -198,12 +199,9 @@ export class YahooFinanceService implements DataProviderInterface { try { quotes = await this.yahooFinance.quote(yahooFinanceSymbols); } catch (error) { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); - Logger.warn( - 'Fallback to yahooFinance.quoteSummary()', - 'YahooFinanceService' - ); + this.logger.warn('Fallback to yahooFinance.quoteSummary()'); quotes = await this.getQuotesWithQuoteSummary(yahooFinanceSymbols); } @@ -229,7 +227,7 @@ export class YahooFinanceService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); return {}; } @@ -334,7 +332,7 @@ export class YahooFinanceService implements DataProviderInterface { }); } } catch (error) { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); } return { items }; @@ -365,10 +363,7 @@ export class YahooFinanceService implements DataProviderInterface { .filter( (result): result is PromiseFulfilledResult => { if (result.status === 'rejected') { - Logger.error( - `Could not get quote summary: ${result.reason}`, - 'YahooFinanceService' - ); + this.logger.error(`Could not get quote summary: ${result.reason}`); return false; } diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 024bdf4e1..708bfa591 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -30,6 +30,8 @@ import { ExchangeRatesByCurrency } from './interfaces/exchange-rate-data.interfa @Injectable() export class ExchangeRateDataService { + private readonly logger = new Logger(ExchangeRateDataService.name); + private currencies: string[] = []; private currencyPairs: DataGatheringItem[] = []; private derivedCurrencyFactors: { [currencyPair: string]: number } = {}; @@ -110,9 +112,8 @@ export class ExchangeRateDataService { previousExchangeRate; if (currency === DEFAULT_CURRENCY && isBefore(date, new Date())) { - Logger.error( - `No exchange rate has been found for ${currency}${targetCurrency} at ${dateString}`, - 'ExchangeRateDataService' + this.logger.error( + `No exchange rate has been found for ${currency}${targetCurrency} at ${dateString}` ); } } else { @@ -253,9 +254,8 @@ export class ExchangeRateDataService { } // Fallback with error, if currencies are not available - Logger.error( - `No exchange rate has been found for ${aFromCurrency}${aToCurrency}`, - 'ExchangeRateDataService' + this.logger.error( + `No exchange rate has been found for ${aFromCurrency}${aToCurrency}` ); return aValue; @@ -341,12 +341,11 @@ export class ExchangeRateDataService { return factor * aValue; } - Logger.error( + this.logger.error( `No exchange rate has been found for ${aFromCurrency}${aToCurrency} at ${format( aDate, DATE_FORMAT - )}`, - 'ExchangeRateDataService' + )}` ); return undefined; @@ -483,7 +482,7 @@ export class ExchangeRateDataService { errorMessage = `${errorMessage} and ${DEFAULT_CURRENCY}${currencyTo}`; } - Logger.error(`${errorMessage}.`, 'ExchangeRateDataService'); + this.logger.error(`${errorMessage}.`); } } } diff --git a/apps/api/src/services/fetch/fetch.service.ts b/apps/api/src/services/fetch/fetch.service.ts index f32e56a1c..31034f81c 100644 --- a/apps/api/src/services/fetch/fetch.service.ts +++ b/apps/api/src/services/fetch/fetch.service.ts @@ -15,6 +15,8 @@ import { WebFetchRoute } from './interfaces/web-fetch-route.interface'; @Injectable() export class FetchService implements OnModuleInit { + private readonly logger = new Logger(FetchService.name); + private static readonly REDACTED_QUERY_PARAM_NAMES = ['apikey', 'api_token']; private static readonly WEB_FETCH_TIMEOUT = ms('30 seconds'); @@ -39,7 +41,7 @@ export class FetchService implements OnModuleInit { const url = input instanceof Request ? input.url : input.toString(); const urlRedacted = this.redactUrl(url); - Logger.debug(`${method} ${urlRedacted}`, 'FetchService'); + this.logger.debug(`${method} ${urlRedacted}`); if (method === 'GET') { const webFetchRoute = this.getMatchingWebFetchRoute(url); @@ -60,15 +62,11 @@ export class FetchService implements OnModuleInit { return await globalThis.fetch(input, init); } catch (error) { if (error instanceof Error) { - Logger.error( - `${method} ${urlRedacted} failed: [${error.name}] ${error.message}`, - 'FetchService' + this.logger.error( + `${method} ${urlRedacted} failed: [${error.name}] ${error.message}` ); } else { - Logger.error( - `${method} ${urlRedacted} failed: ${String(error)}`, - 'FetchService' - ); + this.logger.error(`${method} ${urlRedacted} failed: ${String(error)}`); } throw error; @@ -145,10 +143,7 @@ export class FetchService implements OnModuleInit { } } - Logger.debug( - `Routed ${this.redactUrl(url)} via web fetch tool`, - 'FetchService' - ); + this.logger.debug(`Routed ${this.redactUrl(url)} via web fetch tool`); return new Response(body, { headers: webFetchRoute.responseContentType @@ -159,11 +154,10 @@ export class FetchService implements OnModuleInit { return undefined; } catch (error) { - Logger.error( + this.logger.error( `Web fetch tool failed for ${this.redactUrl(url)}: ${ error instanceof Error ? error.message : String(error) - }`, - 'FetchService' + }` ); return undefined; diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 1cdb811a9..65c51b2f0 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -7,6 +7,8 @@ import { join } from 'node:path'; @Injectable() export class I18nService implements OnModuleInit { + private readonly logger = new Logger(I18nService.name); + private localesPath = join(__dirname, 'assets', 'locales'); private translations: { [locale: string]: cheerio.CheerioAPI } = {}; @@ -26,7 +28,7 @@ export class I18nService implements OnModuleInit { const $ = this.translations[languageCode]; if (!$) { - Logger.warn(`Translation not found for locale '${languageCode}'`); + this.logger.warn(`Translation not found for locale '${languageCode}'`); } let translatedText = $( @@ -36,7 +38,7 @@ export class I18nService implements OnModuleInit { ).text(); if (!translatedText) { - Logger.warn( + this.logger.warn( `Translation not found for id '${id}' in locale '${languageCode}'` ); } @@ -60,7 +62,7 @@ export class I18nService implements OnModuleInit { this.parseXml(xmlData); } } catch (error) { - Logger.error(error, 'I18nService'); + this.logger.error(error); } } diff --git a/apps/api/src/services/prisma/prisma.service.ts b/apps/api/src/services/prisma/prisma.service.ts index cdbc1cdfd..ebbd3afd4 100644 --- a/apps/api/src/services/prisma/prisma.service.ts +++ b/apps/api/src/services/prisma/prisma.service.ts @@ -14,6 +14,8 @@ export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { + private readonly logger = new Logger(PrismaService.name); + public constructor(configService: ConfigService) { const adapter = new PrismaPg({ connectionString: configService.get('DATABASE_URL') @@ -43,7 +45,7 @@ export class PrismaService try { await this.$connect(); } catch (error) { - Logger.error(error, 'PrismaService'); + this.logger.error(error); } } diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts index 1a4038652..ee5cb838a 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.processor.ts @@ -32,6 +32,8 @@ import { DataGatheringService } from './data-gathering.service'; @Injectable() @Processor(DATA_GATHERING_QUEUE) export class DataGatheringProcessor { + private readonly logger = new Logger(DataGatheringProcessor.name); + public constructor( private readonly dataGatheringService: DataGatheringService, private readonly dataProviderService: DataProviderService, @@ -51,16 +53,14 @@ export class DataGatheringProcessor { const { dataSource, symbol } = job.data; try { - Logger.log( - `Asset profile data gathering has been started for ${symbol} (${dataSource})`, - `DataGatheringProcessor (${GATHER_ASSET_PROFILE_PROCESS_JOB_NAME})` + this.logger.log( + `Asset profile data gathering has been started for ${symbol} (${dataSource})` ); await this.dataGatheringService.gatherAssetProfiles([job.data]); - Logger.log( - `Asset profile data gathering has been completed for ${symbol} (${dataSource})`, - `DataGatheringProcessor (${GATHER_ASSET_PROFILE_PROCESS_JOB_NAME})` + this.logger.log( + `Asset profile data gathering has been completed for ${symbol} (${dataSource})` ); } catch (error) { if (error instanceof AssetProfileDelistedError) { @@ -74,18 +74,14 @@ export class DataGatheringProcessor { } ); - Logger.log( - `Asset profile data gathering has been discarded for ${symbol} (${dataSource})`, - `DataGatheringProcessor (${GATHER_ASSET_PROFILE_PROCESS_JOB_NAME})` + this.logger.log( + `Asset profile data gathering has been discarded for ${symbol} (${dataSource})` ); return job.discard(); } - Logger.error( - error, - `DataGatheringProcessor (${GATHER_ASSET_PROFILE_PROCESS_JOB_NAME})` - ); + this.logger.error(error); throw error; } @@ -105,12 +101,11 @@ export class DataGatheringProcessor { try { let currentDate = parseISO(date as unknown as string); - Logger.log( + this.logger.log( `Historical market data gathering has been started for ${symbol} (${dataSource}) at ${format( currentDate, DATE_FORMAT - )}${force ? ' (forced update)' : ''}`, - `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME})` + )}${force ? ' (forced update)' : ''}` ); const historicalData = await this.dataProviderService.getHistoricalRaw({ @@ -167,12 +162,11 @@ export class DataGatheringProcessor { await this.marketDataService.updateMany({ data }); } - Logger.log( + this.logger.log( `Historical market data gathering has been completed for ${symbol} (${dataSource}) at ${format( currentDate, DATE_FORMAT - )}`, - `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME})` + )}` ); } catch (error) { if (error instanceof AssetProfileDelistedError) { @@ -186,18 +180,14 @@ export class DataGatheringProcessor { } ); - Logger.log( - `Historical market data gathering has been discarded for ${symbol} (${dataSource})`, - `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME})` + this.logger.log( + `Historical market data gathering has been discarded for ${symbol} (${dataSource})` ); return job.discard(); } - Logger.error( - error, - `DataGatheringProcessor (${GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME})` - ); + this.logger.error(error); throw error; } diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index cec63c3eb..51f609d22 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -34,6 +34,8 @@ import ms, { StringValue } from 'ms'; @Injectable() export class DataGatheringService { + private readonly logger = new Logger(DataGatheringService.name); + public constructor( @Inject('DataEnhancers') private readonly dataEnhancers: DataEnhancerInterface[], @@ -145,7 +147,7 @@ export class DataGatheringService { }); } } catch (error) { - Logger.error(error, 'DataGatheringService'); + this.logger.error(error); } finally { return undefined; } @@ -187,12 +189,11 @@ export class DataGatheringService { symbol: symbolMapping?.[dataEnhancer.getName()] ?? symbol }); } catch (error) { - Logger.error( + this.logger.error( `Failed to enhance data for ${symbol} (${ assetProfile.dataSource }) by ${dataEnhancer.getName()}`, - error, - 'DataGatheringService' + error ); } } @@ -256,11 +257,7 @@ export class DataGatheringService { } }); } catch (error) { - Logger.error( - `${symbol}: ${error?.meta?.cause}`, - error, - 'DataGatheringService' - ); + this.logger.error(`${symbol}: ${error?.meta?.cause}`, error); if (assetProfileIdentifiers.length === 1) { throw error; diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts index f3aa6e77e..cf94a9d2b 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts @@ -21,6 +21,8 @@ import { PortfolioSnapshotQueueJob } from './interfaces/portfolio-snapshot-queue @Injectable() @Processor(PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE) export class PortfolioSnapshotProcessor { + private readonly logger = new Logger(PortfolioSnapshotProcessor.name); + public constructor( private readonly accountBalanceService: AccountBalanceService, private readonly activitiesService: ActivitiesService, @@ -41,9 +43,8 @@ export class PortfolioSnapshotProcessor { try { const startTime = performance.now(); - Logger.log( - `Portfolio snapshot calculation of user '${job.data.userId}' has been started`, - `PortfolioSnapshotProcessor (${PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME})` + this.logger.log( + `Portfolio snapshot calculation of user '${job.data.userId}' has been started` ); const { activities } = @@ -72,12 +73,11 @@ export class PortfolioSnapshotProcessor { const snapshot = await portfolioCalculator.computeSnapshot(); - Logger.log( + this.logger.log( `Portfolio snapshot calculation of user '${job.data.userId}' has been completed in ${( (performance.now() - startTime) / 1000 - ).toFixed(3)} seconds`, - `PortfolioSnapshotProcessor (${PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME})` + ).toFixed(3)} seconds` ); const expiration = addMilliseconds( @@ -101,10 +101,7 @@ export class PortfolioSnapshotProcessor { return snapshot; } catch (error) { - Logger.error( - error, - `PortfolioSnapshotProcessor (${PORTFOLIO_SNAPSHOT_PROCESS_JOB_NAME})` - ); + this.logger.error(error); throw new Error(error); } diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts index a523ef4f2..7eefc101f 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts @@ -27,6 +27,8 @@ import { format, subDays } from 'date-fns'; @Injectable() @Processor(STATISTICS_GATHERING_QUEUE) export class StatisticsGatheringProcessor { + private readonly logger = new Logger(StatisticsGatheringProcessor.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly fetchService: FetchService, @@ -35,10 +37,7 @@ export class StatisticsGatheringProcessor { @Process(GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME) public async gatherDockerHubPullsStatistics() { - Logger.log( - 'Docker Hub pulls statistics gathering has been started', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Docker Hub pulls statistics gathering has been started'); const dockerHubPulls = await this.countDockerHubPulls(); @@ -47,17 +46,13 @@ export class StatisticsGatheringProcessor { value: String(dockerHubPulls) }); - Logger.log( - 'Docker Hub pulls statistics gathering has been completed', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Docker Hub pulls statistics gathering has been completed'); } @Process(GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME) public async gatherGitHubContributorsStatistics() { - Logger.log( - 'GitHub contributors statistics gathering has been started', - 'StatisticsGatheringProcessor' + this.logger.log( + 'GitHub contributors statistics gathering has been started' ); const gitHubContributors = await this.countGitHubContributors(); @@ -67,18 +62,14 @@ export class StatisticsGatheringProcessor { value: String(gitHubContributors) }); - Logger.log( - 'GitHub contributors statistics gathering has been completed', - 'StatisticsGatheringProcessor' + this.logger.log( + 'GitHub contributors statistics gathering has been completed' ); } @Process(GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME) public async gatherGitHubStargazersStatistics() { - Logger.log( - 'GitHub stargazers statistics gathering has been started', - 'StatisticsGatheringProcessor' - ); + this.logger.log('GitHub stargazers statistics gathering has been started'); const gitHubStargazers = await this.countGitHubStargazers(); @@ -87,9 +78,8 @@ export class StatisticsGatheringProcessor { value: String(gitHubStargazers) }); - Logger.log( - 'GitHub stargazers statistics gathering has been completed', - 'StatisticsGatheringProcessor' + this.logger.log( + 'GitHub stargazers statistics gathering has been completed' ); } @@ -100,18 +90,14 @@ export class StatisticsGatheringProcessor { ); if (!monitorId) { - Logger.log( - `Uptime statistics gathering has been skipped as no ${PROPERTY_BETTER_UPTIME_MONITOR_ID} is configured`, - 'StatisticsGatheringProcessor' + this.logger.log( + `Uptime statistics gathering has been skipped as no ${PROPERTY_BETTER_UPTIME_MONITOR_ID} is configured` ); return; } - Logger.log( - 'Uptime statistics gathering has been started', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Uptime statistics gathering has been started'); const uptime = await this.getUptime(monitorId); @@ -120,10 +106,7 @@ export class StatisticsGatheringProcessor { value: String(uptime) }); - Logger.log( - 'Uptime statistics gathering has been completed', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Uptime statistics gathering has been completed'); } private async countDockerHubPulls(): Promise { @@ -139,7 +122,7 @@ export class StatisticsGatheringProcessor { return pull_count; } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - DockerHub'); + this.logger.error(error); throw error; } @@ -169,7 +152,7 @@ export class StatisticsGatheringProcessor { value }); } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + this.logger.error(error); throw error; } @@ -188,7 +171,7 @@ export class StatisticsGatheringProcessor { return stargazers_count; } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + this.logger.error(error); throw error; } @@ -217,7 +200,7 @@ export class StatisticsGatheringProcessor { return data.attributes.availability / 100; } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - Better Stack'); + this.logger.error(error); throw error; } diff --git a/apps/api/src/services/twitter-bot/twitter-bot.service.ts b/apps/api/src/services/twitter-bot/twitter-bot.service.ts index b424f7198..ffd0c5452 100644 --- a/apps/api/src/services/twitter-bot/twitter-bot.service.ts +++ b/apps/api/src/services/twitter-bot/twitter-bot.service.ts @@ -16,6 +16,8 @@ import { TwitterApi, TwitterApiReadWrite } from 'twitter-api-v2'; @Injectable() export class TwitterBotService implements OnModuleInit { + private readonly logger = new Logger(TwitterBotService.name); + private twitterClient: TwitterApiReadWrite; public constructor( @@ -71,13 +73,12 @@ export class TwitterBotService implements OnModuleInit { const { data: createdTweet } = await this.twitterClient.v2.tweet(status); - Logger.log( - `Fear & Greed Index has been posted: https://x.com/ghostfolio_/status/${createdTweet.id}`, - 'TwitterBotService' + this.logger.log( + `Fear & Greed Index has been posted: https://x.com/ghostfolio_/status/${createdTweet.id}` ); } } catch (error) { - Logger.error(error, 'TwitterBotService'); + this.logger.error(error); } } From c6a2741cb16dc46e00af7637755bb2476b0bee19 Mon Sep 17 00:00:00 2001 From: Punith R Date: Sat, 6 Jun 2026 13:05:55 +0530 Subject: [PATCH 25/37] Task/improve language localization for uk (#6978) * Update translations * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.uk.xlf | 94 ++++++++++++------------- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35ca028a3..6310292f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Refactored the backend logging to use the instance-based `Logger` +- Improved the language localization for Ukrainian (`uk`) ### Fixed diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index edc28f604..94dc7e52a 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -292,7 +292,7 @@ please - please + будь ласка apps/client/src/app/pages/pricing/pricing-page.html 333 @@ -360,7 +360,7 @@ with - with + з apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 87 @@ -1388,7 +1388,7 @@ By - By + До apps/client/src/app/pages/portfolio/fire/fire-page.html 139 @@ -1892,7 +1892,7 @@ Indonesia - Indonesia + Індонезія libs/ui/src/lib/i18n.ts 90 @@ -2108,7 +2108,7 @@ Code - Code + Код apps/client/src/app/components/admin-overview/admin-overview.html 159 @@ -2636,7 +2636,7 @@ Argentina - Argentina + Аргентина libs/ui/src/lib/i18n.ts 78 @@ -3204,7 +3204,7 @@ for - for + для apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 128 @@ -3560,7 +3560,7 @@ Duration - Duration + Тривалість apps/client/src/app/components/admin-overview/admin-overview.html 172 @@ -4897,7 +4897,7 @@ here - here + тут apps/client/src/app/pages/pricing/pricing-page.html 347 @@ -5113,7 +5113,7 @@ Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover operational costs for the hosting infrastructure and professional data providers, and to fund ongoing development. - Наша офіційна хмарна пропозиція Ghostfolio Premium - це найпростіший спосіб почати роботу. Завдяки економії часу, це буде найкращим варіантом для більшості людей. Доходи використовуються для покриття витрат на хостинг-інфраструктуру та фінансування постійної розробки. + Наша офіційна хмарна пропозиція Ghostfolio Premium - це найпростіший спосіб почати роботу. Завдяки економії часу, це буде найкращим варіантом для більшості людей. Доходи використовуються для покриття витрат на хостинг-інфраструктуру та фінансування постійної розробки. apps/client/src/app/pages/pricing/pricing-page.html 7 @@ -6392,7 +6392,7 @@ Loan - Loan + Позика libs/ui/src/lib/i18n.ts 58 @@ -6944,7 +6944,7 @@ Role - Role + Роль apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 39 @@ -7080,7 +7080,7 @@ Authentication - Authentication + Автентифікація apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 60 @@ -7476,7 +7476,7 @@ Lazy - Lazy + Лінивий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 235 @@ -7484,7 +7484,7 @@ Instant - Instant + Миттєвий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 239 @@ -7500,7 +7500,7 @@ Mode - Mode + Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 519 @@ -7508,7 +7508,7 @@ Selector - Selector + Селектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 535 @@ -7532,7 +7532,7 @@ real-time - real-time + реальний час apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts 239 @@ -7548,7 +7548,7 @@ Create - Create + Створити libs/ui/src/lib/tags-selector/tags-selector.component.html 50 @@ -7556,7 +7556,7 @@ Change - Change + Змінити libs/ui/src/lib/holdings-table/holdings-table.component.html 138 @@ -7568,7 +7568,7 @@ Performance - Performance + Дохідність apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html 6 @@ -7624,7 +7624,7 @@ Armenia - Armenia + Вірменія libs/ui/src/lib/i18n.ts 77 @@ -7640,7 +7640,7 @@ Singapore - Singapore + Сінгапур libs/ui/src/lib/i18n.ts 97 @@ -7672,7 +7672,7 @@ Continue - Continue + Продовжити apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 57 @@ -7732,7 +7732,7 @@ terms-of-service - terms-of-service + umovy-nadannia-posluh kebab-case libs/common/src/lib/routes/routes.ts @@ -7781,7 +7781,7 @@ Apply - Apply + Застосувати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 154 @@ -7837,7 +7837,7 @@ someone - someone + когось apps/client/src/app/pages/public/public-page.component.ts 62 @@ -7853,7 +7853,7 @@ Watchlist - Watchlist + Список спостереження apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7897,7 +7897,7 @@ changelog - changelog + zhurnal-zmin kebab-case libs/common/src/lib/routes/routes.ts @@ -8030,7 +8030,7 @@ personal-finance-tools - personal-finance-tools + instrumenty-osobystykh-finansiv kebab-case libs/common/src/lib/routes/routes.ts @@ -8047,7 +8047,7 @@ markets - markets + rynky kebab-case libs/common/src/lib/routes/routes.ts @@ -8108,7 +8108,7 @@ Available - Available + Доступно apps/client/src/app/components/data-provider-status/data-provider-status.component.html 3 @@ -8116,7 +8116,7 @@ Unavailable - Unavailable + Недоступно apps/client/src/app/components/data-provider-status/data-provider-status.component.html 5 @@ -8132,7 +8132,7 @@ new - new + новий apps/client/src/app/components/admin-settings/admin-settings.component.html 79 @@ -8140,7 +8140,7 @@ Investment - Investment + Інвестиція apps/client/src/app/pages/i18n/i18n-page.html 15 @@ -8164,7 +8164,7 @@ Equity - Equity + Акції apps/client/src/app/pages/i18n/i18n-page.html 41 @@ -8252,7 +8252,7 @@ Investment - Investment + Інвестиція apps/client/src/app/pages/i18n/i18n-page.html 95 @@ -8276,7 +8276,7 @@ start - start + pochatok kebab-case libs/common/src/lib/routes/routes.ts @@ -8297,7 +8297,7 @@ Generate - Generate + Згенерувати apps/client/src/app/components/user-account-access/user-account-access.html 45 @@ -8313,7 +8313,7 @@ Stocks - Stocks + Акції apps/client/src/app/components/markets/markets.component.ts 51 @@ -8325,7 +8325,7 @@ Cryptocurrencies - Cryptocurrencies + Криптовалюти apps/client/src/app/components/markets/markets.component.ts 52 @@ -8361,7 +8361,7 @@ Collectible - Collectible + Колекційний предмет libs/ui/src/lib/i18n.ts 55 @@ -8421,7 +8421,7 @@ Fees - Fees + Комісії apps/client/src/app/pages/i18n/i18n-page.html 161 @@ -8429,7 +8429,7 @@ Liquidity - Liquidity + Ліквідність apps/client/src/app/pages/i18n/i18n-page.html 70 @@ -8565,7 +8565,7 @@ Asia-Pacific - Asia-Pacific + Азіатсько-Тихоокеанський регіон apps/client/src/app/pages/i18n/i18n-page.html 165 @@ -8629,7 +8629,7 @@ Europe - Europe + Європа apps/client/src/app/pages/i18n/i18n-page.html 195 @@ -8661,7 +8661,7 @@ Japan - Japan + Японія apps/client/src/app/pages/i18n/i18n-page.html 209 From be874f62e3ad6626606cb9d86ad9bf40843ee4e7 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 6 Jun 2026 12:17:50 +0200 Subject: [PATCH 26/37] Task/centralize asset profile override logic (#6991) * Centralize asset profile logic * Update changelog --- CHANGELOG.md | 2 + apps/api/src/app/admin/admin.service.ts | 110 +++++++----------- .../data-gathering/data-gathering.service.ts | 29 +++-- .../symbol-profile/symbol-profile.service.ts | 60 +++------- libs/common/src/lib/helper.ts | 45 ++++++- 5 files changed, 124 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6310292f9..5f713f736 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,11 +13,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Centralized the asset profile override logic for manual adjustments - Refactored the backend logging to use the instance-based `Logger` - Improved the language localization for Ukrainian (`uk`) ### Fixed +- Fixed an issue where the asset profile override (asset class and asset sub class) was not applied to the data enhancers when gathering asset profiles - Fixed a layout issue in the asset profile dialog of the admin control by truncating long titles ## 3.7.0 - 2026-06-02 diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 0bf5c3925..948616d6c 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -14,6 +14,7 @@ import { PROPERTY_IS_USER_SIGNUP_ENABLED } from '@ghostfolio/common/config'; import { + applyAssetProfileOverrides, getAssetProfileIdentifier, getCurrencyFromSymbol, isCurrency @@ -29,7 +30,6 @@ import { EnhancedSymbolProfile, Filter } from '@ghostfolio/common/interfaces'; -import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; import { MarketDataPreset } from '@ghostfolio/common/types'; import { @@ -349,87 +349,61 @@ export class AdminService { } let marketData: AdminMarketDataItem[] = await Promise.all( - assetProfiles.map( - async ({ + assetProfiles.map(async (assetProfile) => { + const { _count, activities, - assetClass, - assetSubClass, comment, - countries, currency, dataSource, id, isActive, isUsedByUsersWithSubscription, - name, - sectors, - symbol, - SymbolProfileOverrides - }) => { - let countriesCount = countries ? Object.keys(countries).length : 0; + symbol + } = assetProfile; - const lastMarketPrice = lastMarketPriceMap.get( - getAssetProfileIdentifier({ dataSource, symbol }) + const { assetClass, assetSubClass, countries, name, sectors } = + applyAssetProfileOverrides( + assetProfile, + assetProfile.SymbolProfileOverrides ); - const marketDataItemCount = - marketDataItems.find((marketDataItem) => { - return ( - marketDataItem.dataSource === dataSource && - marketDataItem.symbol === symbol - ); - })?._count ?? 0; - - let sectorsCount = sectors ? Object.keys(sectors).length : 0; - - if (SymbolProfileOverrides) { - assetClass = SymbolProfileOverrides.assetClass ?? assetClass; - assetSubClass = - SymbolProfileOverrides.assetSubClass ?? assetSubClass; - - if ( - (SymbolProfileOverrides.countries as unknown as Prisma.JsonArray) - ?.length > 0 - ) { - countriesCount = ( - SymbolProfileOverrides.countries as unknown as Prisma.JsonArray - ).length; - } + const countriesCount = countries ? Object.keys(countries).length : 0; - name = SymbolProfileOverrides.name ?? name; + const lastMarketPrice = lastMarketPriceMap.get( + getAssetProfileIdentifier({ dataSource, symbol }) + ); - if ( - (SymbolProfileOverrides.sectors as unknown as Sector[])?.length > - 0 - ) { - sectorsCount = ( - SymbolProfileOverrides.sectors as unknown as Prisma.JsonArray - ).length; - } - } + const marketDataItemCount = + marketDataItems.find((marketDataItem) => { + return ( + marketDataItem.dataSource === dataSource && + marketDataItem.symbol === symbol + ); + })?._count ?? 0; - return { - assetClass, - assetSubClass, - comment, - countriesCount, - currency, - dataSource, - id, - isActive, - lastMarketPrice, - marketDataItemCount, - name, - sectorsCount, - symbol, - activitiesCount: _count.activities, - date: activities?.[0]?.date, - isUsedByUsersWithSubscription: await isUsedByUsersWithSubscription, - watchedByCount: _count.watchedBy - }; - } - ) + const sectorsCount = sectors ? Object.keys(sectors).length : 0; + + return { + assetClass, + assetSubClass, + comment, + countriesCount, + currency, + dataSource, + id, + isActive, + lastMarketPrice, + marketDataItemCount, + name, + sectorsCount, + symbol, + activitiesCount: _count.activities, + date: activities?.[0]?.date, + isUsedByUsersWithSubscription: await isUsedByUsersWithSubscription, + watchedByCount: _count.watchedBy + }; + }) ); if (presetId) { diff --git a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts index 51f609d22..b5b701fe4 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.service.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.service.ts @@ -178,14 +178,27 @@ export class DataGatheringService { ); for (const [symbol, assetProfile] of Object.entries(assetProfiles)) { - const symbolMapping = symbolProfiles.find((symbolProfile) => { - return symbolProfile.symbol === symbol; - })?.symbolMapping; + const symbolProfile = symbolProfiles.find( + ({ symbol: symbolProfileSymbol }) => { + return symbolProfileSymbol === symbol; + } + ); + + const symbolMapping = symbolProfile?.symbolMapping; + + let enhancedAssetProfile = symbolProfile + ? { + ...assetProfile, + assetClass: symbolProfile.assetClass ?? assetProfile.assetClass, + assetSubClass: + symbolProfile.assetSubClass ?? assetProfile.assetSubClass + } + : assetProfile; for (const dataEnhancer of this.dataEnhancers) { try { - assetProfiles[symbol] = await dataEnhancer.enhance({ - response: assetProfile, + enhancedAssetProfile = await dataEnhancer.enhance({ + response: enhancedAssetProfile, symbol: symbolMapping?.[dataEnhancer.getName()] ?? symbol }); } catch (error) { @@ -198,9 +211,9 @@ export class DataGatheringService { } } + const { assetClass, assetSubClass } = assetProfile; + const { - assetClass, - assetSubClass, countries, currency, cusip, @@ -213,7 +226,7 @@ export class DataGatheringService { name, sectors, url - } = assetProfile; + } = enhancedAssetProfile; try { await this.prismaService.symbolProfile.upsert({ diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 4c2c42589..413b7db03 100644 --- a/apps/api/src/services/symbol-profile/symbol-profile.service.ts +++ b/apps/api/src/services/symbol-profile/symbol-profile.service.ts @@ -1,5 +1,6 @@ import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; +import { applyAssetProfileOverrides } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, EnhancedSymbolProfile, @@ -192,21 +193,28 @@ export class SymbolProfileService { })[] ): EnhancedSymbolProfile[] { return symbolProfiles.map((symbolProfile) => { + const symbolProfileWithOverrides = applyAssetProfileOverrides( + symbolProfile, + symbolProfile.SymbolProfileOverrides + ); + const item = { - ...symbolProfile, + ...symbolProfileWithOverrides, activitiesCount: 0, countries: this.getCountries( - symbolProfile?.countries as unknown as Prisma.JsonArray + symbolProfileWithOverrides?.countries as unknown as Prisma.JsonArray ), dateOfFirstActivity: undefined as Date, holdings: this.getHoldings( - symbolProfile?.holdings as unknown as Prisma.JsonArray + symbolProfileWithOverrides?.holdings as unknown as Prisma.JsonArray + ), + scraperConfiguration: this.getScraperConfiguration( + symbolProfileWithOverrides ), - scraperConfiguration: this.getScraperConfiguration(symbolProfile), sectors: this.getSectors( - symbolProfile?.sectors as unknown as Prisma.JsonArray + symbolProfileWithOverrides?.sectors as unknown as Prisma.JsonArray ), - symbolMapping: this.getSymbolMapping(symbolProfile), + symbolMapping: this.getSymbolMapping(symbolProfileWithOverrides), watchedByCount: 0 }; @@ -217,45 +225,7 @@ export class SymbolProfileService { item.dateOfFirstActivity = symbolProfile.activities?.[0]?.date; delete item.activities; - if (item.SymbolProfileOverrides) { - item.assetClass = - item.SymbolProfileOverrides.assetClass ?? item.assetClass; - item.assetSubClass = - item.SymbolProfileOverrides.assetSubClass ?? item.assetSubClass; - - if ( - (item.SymbolProfileOverrides.countries as unknown as Prisma.JsonArray) - ?.length > 0 - ) { - item.countries = this.getCountries( - item.SymbolProfileOverrides.countries as unknown as Prisma.JsonArray - ); - } - - if ( - (item.SymbolProfileOverrides.holdings as unknown as Holding[]) - ?.length > 0 - ) { - item.holdings = this.getHoldings( - item.SymbolProfileOverrides.holdings as unknown as Prisma.JsonArray - ); - } - - item.name = item.SymbolProfileOverrides.name ?? item.name; - - if ( - (item.SymbolProfileOverrides.sectors as unknown as Sector[])?.length > - 0 - ) { - item.sectors = this.getSectors( - item.SymbolProfileOverrides.sectors as unknown as Prisma.JsonArray - ); - } - - item.url = item.SymbolProfileOverrides.url ?? item.url; - - delete item.SymbolProfileOverrides; - } + delete item.SymbolProfileOverrides; return item; }); diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index c5f6cbbb9..02bd26b90 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -1,5 +1,12 @@ import { NumberParser } from '@internationalized/number'; -import { Type as ActivityType, DataSource, MarketData } from '@prisma/client'; +import { + Type as ActivityType, + DataSource, + MarketData, + Prisma, + SymbolProfile, + SymbolProfileOverrides +} from '@prisma/client'; import { Big } from 'big.js'; import { isISO4217CurrencyCode } from 'class-validator'; import { @@ -47,6 +54,42 @@ export const DATE_FORMAT = 'yyyy-MM-dd'; export const DATE_FORMAT_MONTHLY = 'MMMM yyyy'; export const DATE_FORMAT_YEARLY = 'yyyy'; +export function applyAssetProfileOverrides>( + assetProfile: T, + assetProfileOverrides: SymbolProfileOverrides | null +): T { + if (!assetProfileOverrides) { + return assetProfile; + } + + const assetProfileWithOverrides = { ...assetProfile } as T; + + assetProfileWithOverrides.assetClass = + assetProfileOverrides.assetClass ?? assetProfile.assetClass; + + assetProfileWithOverrides.assetSubClass = + assetProfileOverrides.assetSubClass ?? assetProfile.assetSubClass; + + if ((assetProfileOverrides.countries as Prisma.JsonArray)?.length > 0) { + assetProfileWithOverrides.countries = assetProfileOverrides.countries; + } + + if ((assetProfileOverrides.holdings as Prisma.JsonArray)?.length > 0) { + assetProfileWithOverrides.holdings = assetProfileOverrides.holdings; + } + + assetProfileWithOverrides.name = + assetProfileOverrides.name ?? assetProfile.name; + + if ((assetProfileOverrides.sectors as Prisma.JsonArray)?.length > 0) { + assetProfileWithOverrides.sectors = assetProfileOverrides.sectors; + } + + assetProfileWithOverrides.url = assetProfileOverrides.url ?? assetProfile.url; + + return assetProfileWithOverrides; +} + export function calculateBenchmarkTrend({ days, historicalData From 37a70f23ce3e2df26beebc5266467c4fd17fc9e8 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 6 Jun 2026 12:39:58 +0200 Subject: [PATCH 27/37] Task/improve styling in user detail dialog of admin control (#6992) * Improve styling * Update changelog --- CHANGELOG.md | 3 ++- .../asset-profile-dialog/asset-profile-dialog.html | 4 ++-- .../user-detail-dialog/user-detail-dialog.component.scss | 4 ++++ .../app/components/user-detail-dialog/user-detail-dialog.html | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f713f736..b9b9f118d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,13 +14,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Centralized the asset profile override logic for manual adjustments +- Improved the styling in the user detail dialog of the admin control panel’s users section - Refactored the backend logging to use the instance-based `Logger` - Improved the language localization for Ukrainian (`uk`) ### Fixed - Fixed an issue where the asset profile override (asset class and asset sub class) was not applied to the data enhancers when gathering asset profiles -- Fixed a layout issue in the asset profile dialog of the admin control by truncating long titles +- Fixed a layout issue in the asset profile dialog of the admin control panel by truncating long titles ## 3.7.0 - 2026-06-02 diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index 61ca6a6da..ddcf96b3b 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -1,5 +1,5 @@
-

+
{{ assetProfile?.name ?? data.symbol }} @@ -87,7 +87,7 @@ Delete -

+
+
diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 8c42e37ea..e745decd0 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -157,6 +157,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { public SymbolProfile: EnhancedSymbolProfile; public tags: Tag[]; public tagsAvailable: Tag[]; + public translate = translate; public user: User; public value: number; @@ -442,7 +443,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { if (SymbolProfile?.sectors?.length > 0) { for (const sector of SymbolProfile.sectors) { this.sectors[sector.name] = { - name: sector.name, + name: translate(sector.name), value: sector.weight }; } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index 4b04a0986..478a8e5a3 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -262,7 +262,7 @@ i18n size="medium" [locale]="data.locale" - [value]="SymbolProfile.sectors[0].name" + [value]="translate(SymbolProfile.sectors[0].name)" >Sector
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index f48b551bb..792f32bf5 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -442,7 +442,7 @@ export class GfAllocationsPageComponent implements OnInit { : position.valueInPercentage); } else { this.sectors[name] = { - name, + name: translate(name), value: weight * (isNumber(position.valueInBaseCurrency) diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index f52639db6..52a7864ac 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -9,6 +9,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Market } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table/activities-table.component'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table/holdings-table.component'; +import { translate } from '@ghostfolio/ui/i18n'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.component'; import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -232,7 +233,7 @@ export class GfPublicPageComponent implements OnInit { weight * (position.valueInBaseCurrency ?? 0); } else { this.sectors[name] = { - name, + name: translate(name), value: weight * (this.publicPortfolioDetails.holdings[symbol] diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 28d902d71..5f2dd9a1c 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -282,6 +282,21 @@ export const REPLACE_NAME_PARTS = [ 'Xtrackers (IE) Plc -' ]; +export const SECTORS = [ + 'Basic Materials', + 'Communication Services', + 'Consumer Cyclical', + 'Consumer Defensive', + 'Energy', + 'Financial Services', + 'Healthcare', + 'Industrials', + 'Other', + 'Real Estate', + 'Technology', + 'Utilities' +] as const; + export const STORYBOOK_PATH = '/development/storybook'; export const SUPPORTED_LANGUAGE_CODES = [ diff --git a/libs/common/src/lib/types/index.ts b/libs/common/src/lib/types/index.ts index 781e50c55..b6e513a51 100644 --- a/libs/common/src/lib/types/index.ts +++ b/libs/common/src/lib/types/index.ts @@ -17,6 +17,7 @@ import type { MarketState } from './market-state.type'; import type { Market } from './market.type'; import type { OrderWithAccount } from './order-with-account.type'; import type { RequestWithUser } from './request-with-user.type'; +import type { SectorName } from './sector-name.type'; import type { SubscriptionOfferKey } from './subscription-offer-key.type'; import type { UserWithSettings } from './user-with-settings.type'; import type { ViewMode } from './view-mode.type'; @@ -41,6 +42,7 @@ export type { MarketState, OrderWithAccount, RequestWithUser, + SectorName, SubscriptionOfferKey, UserWithSettings, ViewMode diff --git a/libs/common/src/lib/types/sector-name.type.ts b/libs/common/src/lib/types/sector-name.type.ts new file mode 100644 index 000000000..0d9ea9cee --- /dev/null +++ b/libs/common/src/lib/types/sector-name.type.ts @@ -0,0 +1,3 @@ +import type { SECTORS } from '../config'; + +export type SectorName = (typeof SECTORS)[number]; diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index c7d8b7c8b..f6f1e8ff9 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -1,3 +1,5 @@ +import type { SectorName } from '@ghostfolio/common/types'; + import '@angular/localize/init'; const locales = { @@ -107,8 +109,22 @@ const locales = { EXTREME_GREED: $localize`Extreme Greed`, FEAR: $localize`Fear`, GREED: $localize`Greed`, - NEUTRAL: $localize`Neutral` -}; + NEUTRAL: $localize`Neutral`, + + // Sectors + 'Basic Materials': $localize`Basic Materials`, + 'Communication Services': $localize`Communication Services`, + 'Consumer Cyclical': $localize`Consumer Cyclical`, + 'Consumer Defensive': $localize`Consumer Defensive`, + Energy: $localize`Energy`, + 'Financial Services': $localize`Financial Services`, + Healthcare: $localize`Healthcare`, + Industrials: $localize`Industrials`, + Other: $localize`Other`, + 'Real Estate': $localize`Real Estate`, + Technology: $localize`Technology`, + Utilities: $localize`Utilities` +} satisfies Record & Record; export function translate(aKey: string): string { return locales[aKey] ?? aKey; From 363684526f9cfddd3e5e097fcde5591134ff309b Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:17:52 +0200 Subject: [PATCH 31/37] Task/localize country names (#6995) * Localize country names * Update changelog --- CHANGELOG.md | 1 + .../asset-profile-dialog.component.ts | 6 ++-- .../asset-profile-dialog.html | 7 ++++- .../holding-detail-dialog.component.ts | 12 ++++++-- .../holding-detail-dialog.html | 7 ++++- .../allocations/allocations-page.component.ts | 11 ++++--- .../app/pages/public/public-page.component.ts | 8 ++--- libs/common/src/lib/helper.ts | 14 +++++++++ libs/ui/src/lib/i18n.ts | 29 ------------------- .../portfolio-proportion-chart.component.ts | 6 ++-- .../world-map-chart.component.ts | 16 ++++++++-- 11 files changed, 68 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e13d948b..5f17f1288 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Harmonized the sector names across the data providers +- Localized the country names - Localized the sector names - Centralized the asset profile override logic for manual adjustments - Improved the styling in the user detail dialog of the admin control panel’s users section diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index fc08c3680..ce997cf27 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -8,6 +8,7 @@ import { UpdateAssetProfileDto } from '@ghostfolio/common/dtos'; import { canDeleteAssetProfile, DATE_FORMAT, + getCountryName, getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; @@ -224,6 +225,7 @@ export class GfAssetProfileDialogComponent implements OnInit { value: 'max' } ]; + protected readonly getCountryName = getCountryName; protected historicalDataItems: LineChartItem[]; protected isBenchmark = false; protected isDataGatheringEnabled: boolean; @@ -369,9 +371,9 @@ export class GfAssetProfileDialogComponent implements OnInit { this.assetProfile?.countries && this.assetProfile.countries.length > 0 ) { - for (const { code, name, weight } of this.assetProfile.countries) { + for (const { code, weight } of this.assetProfile.countries) { this.countries[code] = { - name, + name: getCountryName({ code, locale: this.data.locale }), value: weight }; } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index 474fff3ca..d9a5354e5 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -269,7 +269,12 @@ i18n size="medium" [locale]="data.locale" - [value]="assetProfile?.countries[0].name" + [value]=" + getCountryName({ + code: assetProfile?.countries[0].code, + locale: data.locale + }) + " >Country
diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index e745decd0..68bb1215a 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -6,7 +6,11 @@ import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { CreateOrderDto } from '@ghostfolio/common/dtos'; -import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; +import { + DATE_FORMAT, + downloadAsFile, + getCountryName +} from '@ghostfolio/common/helper'; import { Activity, DataProviderInfo, @@ -121,6 +125,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { public dividendInBaseCurrencyPrecision = 2; public dividendYieldPercentWithCurrencyEffect: number; public feeInBaseCurrency: number; + public getCountryName = getCountryName; public hasPermissionToCreateOwnTag: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public historicalDataItems: LineChartItem[]; @@ -434,7 +439,10 @@ export class GfHoldingDetailDialogComponent implements OnInit { if (SymbolProfile?.countries?.length > 0) { for (const country of SymbolProfile.countries) { this.countries[country.code] = { - name: country.name, + name: getCountryName({ + code: country.code, + locale: this.data.locale + }), value: country.weight }; } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index 478a8e5a3..609eec3c0 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -272,7 +272,12 @@ i18n size="medium" [locale]="data.locale" - [value]="SymbolProfile.countries[0].name" + [value]=" + getCountryName({ + code: SymbolProfile.countries[0].code, + locale: data.locale + }) + " >Country
diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index 792f32bf5..d0eb3788b 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -3,7 +3,7 @@ import { AccountDetailDialogParams } from '@ghostfolio/client/components/account import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { prettifySymbol } from '@ghostfolio/common/helper'; +import { getCountryName, prettifySymbol } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, HoldingWithParents, @@ -353,7 +353,7 @@ export class GfAllocationsPageComponent implements OnInit { if (position.assetProfile.countries.length > 0) { for (const country of position.assetProfile.countries) { - const { code, continent, name, weight } = country; + const { code, continent, weight } = country; if (this.continents[continent]?.value) { this.continents[continent].value += @@ -363,7 +363,7 @@ export class GfAllocationsPageComponent implements OnInit { : position.valueInPercentage); } else { this.continents[continent] = { - name: continent, + name: translate(continent), value: weight * (isNumber(position.valueInBaseCurrency) @@ -380,7 +380,10 @@ export class GfAllocationsPageComponent implements OnInit { : position.valueInPercentage); } else { this.countries[code] = { - name, + name: getCountryName({ + code, + locale: this.user?.settings?.locale + }), value: weight * (isNumber(position.valueInBaseCurrency) diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 52a7864ac..43d961c1d 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -1,5 +1,5 @@ import { UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { prettifySymbol } from '@ghostfolio/common/helper'; +import { getCountryName, prettifySymbol } from '@ghostfolio/common/helper'; import { InfoItem, PortfolioPosition, @@ -186,14 +186,14 @@ export class GfPublicPageComponent implements OnInit { if (position.assetProfile.countries.length > 0) { for (const country of position.assetProfile.countries) { - const { code, continent, name, weight } = country; + const { code, continent, weight } = country; if (this.continents[continent]?.value) { this.continents[continent].value += weight * (position.valueInBaseCurrency ?? 0); } else { this.continents[continent] = { - name: continent, + name: translate(continent), value: weight * (this.publicPortfolioDetails.holdings[symbol] @@ -206,7 +206,7 @@ export class GfPublicPageComponent implements OnInit { weight * (position.valueInBaseCurrency ?? 0); } else { this.countries[code] = { - name, + name: getCountryName({ code }), value: weight * (this.publicPortfolioDetails.holdings[symbol] diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 02bd26b90..db320c7cb 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -258,6 +258,20 @@ export function getCurrencyFromSymbol(aSymbol = '') { return aSymbol.replace(DEFAULT_CURRENCY, ''); } +export function getCountryName({ + code, + locale = getLocale() +}: { + code: string; + locale?: string; +}) { + try { + return new Intl.DisplayNames([locale], { type: 'region' }).of(code) ?? code; + } catch { + return code; + } +} + export function getDateFnsLocale(aLanguageCode?: string) { if (aLanguageCode === 'ca') { return ca; diff --git a/libs/ui/src/lib/i18n.ts b/libs/ui/src/lib/i18n.ts index f6f1e8ff9..2c037c7d1 100644 --- a/libs/ui/src/lib/i18n.ts +++ b/libs/ui/src/lib/i18n.ts @@ -75,35 +75,6 @@ const locales = { Oceania: $localize`Oceania`, 'South America': $localize`South America`, - // Countries - Armenia: $localize`Armenia`, - Argentina: $localize`Argentina`, - Australia: $localize`Australia`, - Austria: $localize`Austria`, - Belgium: $localize`Belgium`, - 'British Virgin Islands': $localize`British Virgin Islands`, - Bulgaria: $localize`Bulgaria`, - Canada: $localize`Canada`, - 'Czech Republic': $localize`Czech Republic`, - Finland: $localize`Finland`, - France: $localize`France`, - Germany: $localize`Germany`, - India: $localize`India`, - Indonesia: $localize`Indonesia`, - Italy: $localize`Italy`, - Japan: $localize`Japan`, - Netherlands: $localize`Netherlands`, - 'New Zealand': $localize`New Zealand`, - Poland: $localize`Poland`, - Romania: $localize`Romania`, - Singapore: $localize`Singapore`, - 'South Africa': $localize`South Africa`, - Switzerland: $localize`Switzerland`, - Thailand: $localize`Thailand`, - Ukraine: $localize`Ukraine`, - 'United Kingdom': $localize`United Kingdom`, - 'United States': $localize`United States`, - // Fear and Greed Index EXTREME_FEAR: $localize`Extreme Fear`, EXTREME_GREED: $localize`Extreme Greed`, diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 4021bf97f..7c17b587c 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts @@ -37,8 +37,6 @@ import Color from 'color'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import OpenColor from 'open-color'; -import { translate } from '../i18n'; - const { blue, cyan, @@ -390,7 +388,7 @@ export class GfPortfolioProportionChartComponent return value > 0 ? isUUID(symbol) - ? (translate(this.data[symbol]?.name) ?? symbol) + ? (this.data[symbol]?.name ?? symbol) : symbol : ''; }, @@ -453,7 +451,7 @@ export class GfPortfolioProportionChartComponent symbol = $localize`No data available`; } - const name = translate(this.data[symbol]?.name); + const name = this.data[symbol]?.name; let sum = 0; diff --git a/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts b/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts index f86d4d010..0d5eb7387 100644 --- a/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts +++ b/libs/ui/src/lib/world-map-chart/world-map-chart.component.ts @@ -1,4 +1,8 @@ -import { getLocale, getNumberFormatGroup } from '@ghostfolio/common/helper'; +import { + getCountryName, + getLocale, + getNumberFormatGroup +} from '@ghostfolio/common/helper'; import { ChangeDetectionStrategy, @@ -25,7 +29,7 @@ export class GfWorldMapChartComponent implements OnChanges, OnDestroy { @Input() locale = getLocale(); public isLoading = true; - public svgMapElement; + public svgMapElement: any; public constructor(private changeDetectorRef: ChangeDetectorRef) {} @@ -88,6 +92,14 @@ export class GfWorldMapChartComponent implements OnChanges, OnDestroy { targetElementID: 'svgMap' }); + this.svgMapElement.options.countryNames = Object.keys( + this.svgMapElement.countries + ).reduce<{ [code: string]: string }>((names, code) => { + names[code] = getCountryName({ code, locale: this.locale }); + + return names; + }, {}); + setTimeout(() => { this.isLoading = false; From b3f20e175c822dd410c3ec035aaf7b5e54f93862 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 6 Jun 2026 20:20:35 +0200 Subject: [PATCH 32/37] Task/update locales (#6902) Update locales --- apps/client/src/locales/messages.ca.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.de.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.es.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.fr.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.it.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.ko.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.nl.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.pl.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.pt.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.tr.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.uk.xlf | 770 ++++++++++-------------- apps/client/src/locales/messages.xlf | 734 ++++++++++------------ apps/client/src/locales/messages.zh.xlf | 770 ++++++++++-------------- 13 files changed, 4189 insertions(+), 5785 deletions(-) diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 10fa62f11..9a181613d 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -10,7 +10,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -34,11 +34,11 @@ Iniciar sessió apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -403,7 +403,7 @@ Balanç de Caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -427,7 +427,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -467,11 +467,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -499,7 +499,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -563,7 +563,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -643,7 +643,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -695,7 +695,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -719,7 +719,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -871,7 +871,7 @@ Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -879,7 +879,7 @@ Divises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -891,7 +891,7 @@ ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -899,7 +899,7 @@ ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -907,7 +907,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -927,7 +927,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -991,7 +991,7 @@ Realment vol eliminar el perfil d’aquest actiu? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -999,7 +999,7 @@ Realment vol eliminar aquests perfils? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -1007,7 +1007,7 @@ Oooh! No s’han pogut eliminar els perfils apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -1018,12 +1018,20 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + The current market price is El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -1067,7 +1075,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -1075,7 +1083,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1087,15 +1095,15 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -1107,15 +1115,15 @@ Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1123,7 +1131,15 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -1139,7 +1155,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -1147,7 +1163,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -1155,11 +1171,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1175,7 +1191,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1183,7 +1199,7 @@ Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1210,6 +1226,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Afegir manualment @@ -1238,6 +1262,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? Està segur qeu vol eliminar aquest cupó? @@ -1315,7 +1347,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1395,7 +1427,7 @@ Està segur que vol eliminar aquesta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1427,7 +1459,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1475,7 +1507,7 @@ Està segur que vol eliminar aquesta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -1499,7 +1531,7 @@ Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1515,7 +1547,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1567,11 +1599,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1595,15 +1627,15 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1619,11 +1651,11 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1639,7 +1671,7 @@ Millora la teva Subscripció apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -1667,7 +1699,7 @@ Renova la teva Subscripció apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -1683,7 +1715,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1695,11 +1727,11 @@ Oooh! El testimoni de seguretat és incorrecte. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1739,7 +1771,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1762,14 +1794,6 @@ 92 - - Indonesia - Indonèsia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Activitat @@ -1783,7 +1807,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1831,7 +1855,7 @@ Por apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1839,7 +1863,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1847,7 +1871,7 @@ Cobdícia apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1855,7 +1879,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1955,7 +1979,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2074,6 +2098,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Manteniu la sessió iniciada @@ -2095,7 +2127,7 @@ Les dades del mercat s’han retardat apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -2371,7 +2403,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -2383,7 +2415,7 @@ 1 any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -2395,7 +2427,7 @@ 5 anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2415,7 +2447,7 @@ Màx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2427,15 +2459,7 @@ Vaja! No s’ha pogut concedir l’accés. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -2502,6 +2526,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed El codi del cupó s’ha bescanviat @@ -2595,7 +2627,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -2606,6 +2638,14 @@ 328 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista del presentador @@ -2651,7 +2691,7 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2779,7 +2819,7 @@ Aquesta funció no està disponible actualment. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2787,15 +2827,15 @@ Si us plau, torna-ho a provar més tard. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2803,7 +2843,7 @@ Aquesta acció no està permesa. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -2811,11 +2851,11 @@ Vaja! Alguna cosa va fallar. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2827,11 +2867,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2839,7 +2879,7 @@ Ups! Sembla que esteu fent massa sol·licituds. Si us plau, aneu una mica més lent. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -2851,11 +2891,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -2959,15 +2999,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2991,7 +3031,7 @@ Vaja, la transferència del saldo en efectiu ha fallat. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -3047,11 +3087,11 @@ Control d’administració apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -3071,7 +3111,7 @@ Dades de mercat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3123,7 +3163,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3263,11 +3303,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -3468,7 +3508,7 @@ Comença apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3540,7 +3580,7 @@ Mercats apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -3548,7 +3588,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3719,6 +3759,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Utilitza Ghostfolio de manera anònima i sigues propietari de les teves dades financeres. @@ -4072,7 +4120,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -4176,7 +4224,7 @@ Activitats d’importació apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4192,7 +4240,7 @@ Importar dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4208,7 +4256,7 @@ S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -4216,7 +4264,7 @@ La importació s’ha completat apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -4232,7 +4280,7 @@ S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4416,7 +4464,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4548,11 +4596,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4568,11 +4616,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -4592,7 +4640,7 @@ Mensualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4600,7 +4648,7 @@ Anualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -4608,7 +4656,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -4656,7 +4704,7 @@ A baix apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4664,7 +4712,7 @@ Evolució de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4672,7 +4720,7 @@ Cronologia de la inversió apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4680,7 +4728,7 @@ Ratxa actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4688,7 +4736,7 @@ Ratxa més llarga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4696,7 +4744,7 @@ Cronologia de dividends apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4724,15 +4772,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -4904,11 +4952,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -5055,10 +5103,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5069,7 +5113,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5313,11 +5357,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -5365,7 +5409,7 @@ El meu Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -5489,7 +5533,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5509,7 +5553,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -5529,7 +5573,7 @@ any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5549,7 +5593,7 @@ anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -5597,7 +5641,7 @@ Tendència de 50 dies libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5605,7 +5649,7 @@ Tendència de 200 dies libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5621,7 +5665,7 @@ Darrer tot el temps libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5629,7 +5673,7 @@ Canvi des del màxim històric libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5645,7 +5689,7 @@ de l’ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -5653,7 +5697,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5729,7 +5773,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5749,7 +5793,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5765,7 +5809,7 @@ Mostra-ho tot libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5781,7 +5825,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5793,7 +5837,7 @@ Àsia-Pacífic libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5809,7 +5853,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5821,11 +5865,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -5841,7 +5885,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5853,7 +5897,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5861,7 +5905,7 @@ Comprar i vendre libs/ui/src/lib/i18n.ts - 8 + 10 @@ -5869,7 +5913,7 @@ Bàsic libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5877,7 +5921,7 @@ Canvia fàcilment a Ghostfolio Premium o Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5885,7 +5929,7 @@ Canvia fàcilment a Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5901,7 +5945,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5909,7 +5953,7 @@ Subvenció libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5917,7 +5961,7 @@ Risc Alt libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5925,15 +5969,7 @@ Aquesta activitat ja existeix. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - Japó - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5941,7 +5977,7 @@ Risc Baix libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5949,7 +5985,7 @@ Mes libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5957,7 +5993,7 @@ Mesos libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5965,11 +6001,15 @@ Altres libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -5977,7 +6017,7 @@ Predefinit libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5985,7 +6025,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5993,7 +6033,7 @@ Provisió de jubilació libs/ui/src/lib/i18n.ts - 27 + 29 @@ -6009,7 +6049,7 @@ Satèl·lit libs/ui/src/lib/i18n.ts - 28 + 30 @@ -6033,11 +6073,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -6045,11 +6085,11 @@ Etiqueta libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -6057,7 +6097,7 @@ Any libs/ui/src/lib/i18n.ts - 31 + 33 @@ -6077,7 +6117,7 @@ Anys libs/ui/src/lib/i18n.ts - 32 + 34 @@ -6097,7 +6137,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -6113,7 +6153,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -6121,7 +6161,7 @@ Valuós libs/ui/src/lib/i18n.ts - 42 + 44 @@ -6129,7 +6169,7 @@ Passiu libs/ui/src/lib/i18n.ts - 40 + 42 @@ -6141,7 +6181,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -6153,7 +6193,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -6161,7 +6201,7 @@ Mercaderia libs/ui/src/lib/i18n.ts - 46 + 48 @@ -6173,7 +6213,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -6181,7 +6221,7 @@ Ingressos Fixos libs/ui/src/lib/i18n.ts - 48 + 50 @@ -6189,7 +6229,7 @@ Liquiditat libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6197,7 +6237,11 @@ Immobiliari libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -6213,7 +6257,7 @@ Bona libs/ui/src/lib/i18n.ts - 53 + 55 @@ -6221,7 +6265,7 @@ Criptomoneda libs/ui/src/lib/i18n.ts - 56 + 58 @@ -6229,7 +6273,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -6237,7 +6281,7 @@ Fons d’inversió libs/ui/src/lib/i18n.ts - 59 + 61 @@ -6245,7 +6289,7 @@ Metall preciós libs/ui/src/lib/i18n.ts - 60 + 62 @@ -6253,7 +6297,7 @@ Capital privat libs/ui/src/lib/i18n.ts - 61 + 63 @@ -6261,7 +6305,7 @@ Acció libs/ui/src/lib/i18n.ts - 62 + 64 @@ -6269,7 +6313,7 @@ Àfrica libs/ui/src/lib/i18n.ts - 69 + 71 @@ -6277,7 +6321,15 @@ Àsia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -6285,7 +6337,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -6293,7 +6345,7 @@ Amèrica del Nord libs/ui/src/lib/i18n.ts - 72 + 74 @@ -6309,7 +6361,7 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 @@ -6317,7 +6369,7 @@ Amèrica del Sud libs/ui/src/lib/i18n.ts - 74 + 76 @@ -6325,7 +6377,7 @@ Por extrema libs/ui/src/lib/i18n.ts - 106 + 79 @@ -6333,7 +6385,7 @@ Avarícia extrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -6341,7 +6393,7 @@ Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -6377,15 +6429,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6572,38 +6624,6 @@ 100 - - Australia - Australia - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Austria - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Belgium - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgaria - - libs/ui/src/lib/i18n.ts - 83 - - View Holding View Holding @@ -6612,124 +6632,12 @@ 474 - - Canada - Canada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Czech Republic - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finland - - libs/ui/src/lib/i18n.ts - 86 - - - - France - France - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Germany - - libs/ui/src/lib/i18n.ts - 88 - - - - India - India - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Italy - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Netherlands - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - New Zealand - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Poland - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Romania - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - South Africa - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Thailand - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - United States - - libs/ui/src/lib/i18n.ts - 103 - - Error Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6661,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6781,7 +6689,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6733,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6741,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6873,7 +6781,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6797,7 @@ Yes libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7040,6 +6948,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -7157,15 +7073,7 @@ Get access to 80’000+ tickers from over 50 exchanges libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ukraine - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7371,7 +7279,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,11 +7327,11 @@ Me apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7463,7 +7371,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Armenia - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - British Virgin Islands - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapore - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Terms and Conditions @@ -7691,11 +7575,11 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Terms of Service @@ -7768,7 +7644,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ someone apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Collectible libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index bfff88889..504dc107a 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -110,7 +110,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -150,11 +150,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -214,7 +214,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -294,7 +294,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -334,7 +334,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -402,7 +402,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -498,7 +498,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -646,7 +646,7 @@ Möchtest du diesen Benutzer wirklich löschen? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -662,7 +662,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -706,7 +706,7 @@ Über Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -718,7 +718,7 @@ Registrieren apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -750,11 +750,11 @@ Einloggen apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -774,11 +774,11 @@ Ups! Falsches Sicherheits-Token. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -885,6 +885,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Eingeloggt bleiben @@ -978,15 +986,15 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -998,15 +1006,15 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1030,7 +1038,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1042,7 +1050,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1058,7 +1066,7 @@ Alle anzeigen libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1078,7 +1086,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1090,7 +1098,7 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1102,7 +1110,7 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -1122,7 +1130,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -1138,11 +1146,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -1154,11 +1162,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -1190,7 +1198,7 @@ Mein Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -1213,6 +1221,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Gutscheincode wurde eingelöst @@ -1273,6 +1289,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Präsentationsansicht @@ -1294,7 +1318,7 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1382,15 +1406,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1434,7 +1458,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1502,11 +1526,11 @@ Administration apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -1670,7 +1694,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1698,7 +1722,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1726,7 +1750,7 @@ Märkte apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -1734,7 +1758,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1870,7 +1894,7 @@ Zeitstrahl der Investitionen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1886,7 +1910,7 @@ Verlierer apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1946,7 +1970,7 @@ Aktuelle Woche apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1970,7 +1994,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1993,6 +2017,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Anzahl @@ -2010,7 +2042,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2030,7 +2062,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2074,7 +2106,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2098,7 +2130,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2106,7 +2138,7 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2126,15 +2158,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -2154,15 +2186,15 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -2238,11 +2270,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -2290,7 +2322,7 @@ Aktivitäten importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2354,7 +2386,7 @@ Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2370,7 +2402,7 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -2402,7 +2434,7 @@ Diese Funktion ist derzeit nicht verfügbar. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2410,15 +2442,15 @@ Bitte versuche es später noch einmal. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2426,11 +2458,11 @@ Ups! Es ist etwas schief gelaufen. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2466,7 +2498,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -2474,7 +2506,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2490,7 +2522,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2550,7 +2582,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2586,7 +2618,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2618,7 +2650,7 @@ Angst apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -2626,7 +2658,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2634,7 +2666,7 @@ Gier apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -2642,7 +2674,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2650,7 +2682,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2686,11 +2718,11 @@ Das Formular konnte nicht validiert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -2706,11 +2738,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -2778,7 +2810,7 @@ Portfolio Wertentwicklung apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2810,7 +2842,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2830,7 +2862,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2842,11 +2874,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2870,11 +2902,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2882,11 +2914,11 @@ Tag libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -2898,7 +2930,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2906,7 +2938,7 @@ Rohstoff libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2918,7 +2950,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2926,7 +2958,7 @@ Feste Einkünfte libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2934,7 +2966,11 @@ Immobilien libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2950,7 +2986,7 @@ Anleihe libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2958,7 +2994,7 @@ Kryptowährung libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2966,7 +3002,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2974,7 +3010,7 @@ Investmentfonds libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2982,7 +3018,7 @@ Edelmetall libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2990,7 +3026,7 @@ Privates Beteiligungskapital libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2998,7 +3034,7 @@ Aktie libs/ui/src/lib/i18n.ts - 62 + 64 @@ -3014,7 +3050,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3022,11 +3058,15 @@ Andere libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -3042,15 +3082,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3062,7 +3102,7 @@ Nordamerika libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3070,7 +3110,7 @@ Afrika libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3078,7 +3118,15 @@ Asien libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3086,7 +3134,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3102,7 +3150,7 @@ Ozeanien libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3110,7 +3158,7 @@ Südamerika libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3154,7 +3202,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 @@ -3162,7 +3210,7 @@ Zeitstrahl der Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3198,11 +3246,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3218,7 +3266,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3230,7 +3278,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3246,7 +3294,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3270,7 +3318,7 @@ Marktdaten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3326,7 +3374,7 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3334,7 +3382,7 @@ Dividenden importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3362,7 +3410,7 @@ Kern libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3370,7 +3418,7 @@ Zuwendung libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3378,7 +3426,7 @@ Höheres Risiko libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3386,7 +3434,7 @@ Geringeres Risiko libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3394,7 +3442,7 @@ Keine Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3402,7 +3450,7 @@ Altersvorsorge libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3418,7 +3466,7 @@ Satellit libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3542,7 +3590,7 @@ Mitgliedschaft abschliessen apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3670,11 +3718,11 @@ Das Anlageprofil konnte nicht gespeichert werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -3742,7 +3790,7 @@ Einfacher Wechsel zu Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3766,7 +3814,7 @@ Einfacher Wechsel zu Ghostfolio Premium oder Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3774,7 +3822,7 @@ Darlehen libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3826,7 +3874,7 @@ Mitgliedschaft erneuern apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3906,7 +3954,7 @@ Aktuelles Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3922,11 +3970,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3942,7 +3990,7 @@ Das Anlageprofil wurde gespeichert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -3950,7 +3998,7 @@ Möchtest du diese Plattform wirklich löschen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -4022,7 +4070,7 @@ Diese Aktivität existiert bereits. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4086,7 +4134,7 @@ Aktueller Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4094,7 +4142,7 @@ Längster Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4102,7 +4150,7 @@ Monate libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4110,7 +4158,7 @@ Jahre libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4118,7 +4166,7 @@ Monat libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4126,7 +4174,7 @@ Jahr libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4286,7 +4334,15 @@ Verbindlichkeit libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4302,7 +4358,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -4530,7 +4586,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4538,7 +4594,7 @@ Wertsache libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4546,7 +4602,7 @@ ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4554,7 +4610,7 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4570,7 +4626,7 @@ Filtervorlage libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4586,15 +4642,7 @@ Asien-Pazifik libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japan - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4790,7 +4838,7 @@ Währungen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -4842,11 +4890,11 @@ Die Scraper Konfiguration konnte nicht geparsed werden apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -4937,6 +4985,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Nutze Ghostfolio ganz anonym und behalte deine Finanzdaten. @@ -5402,10 +5458,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5416,7 +5468,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5516,7 +5568,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5540,7 +5592,7 @@ Möchtest du diesen Tag wirklich löschen? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5648,7 +5700,7 @@ Möchtest du dieses Anlageprofil wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5659,6 +5711,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Manuell hinzufügen @@ -5688,7 +5748,7 @@ Letztes Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5732,7 +5792,7 @@ Ups, der Cash-Bestand Transfer ist fehlgeschlagen. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5740,7 +5800,7 @@ Extreme Angst libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5748,7 +5808,7 @@ Extreme Gier libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5756,7 +5816,7 @@ Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5767,6 +5827,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? Möchtest du diese Systemmeldung wirklich löschen? @@ -5780,7 +5848,7 @@ 50 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5788,7 +5856,7 @@ 200 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5796,7 +5864,7 @@ Cash-Bestände apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5832,7 +5900,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5840,7 +5908,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5880,15 +5948,7 @@ Ups! Der Zugang konnte nicht gewährt werden. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentinien - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5912,7 +5972,7 @@ Die Marktdaten sind verzögert für apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5928,11 +5988,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5952,7 +6012,7 @@ Position abschliessen apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -6000,7 +6060,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -6020,7 +6080,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6068,7 +6128,7 @@ Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6088,7 +6148,7 @@ Jahre apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6108,7 +6168,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6173,7 +6233,7 @@ Ups! Es sieht so aus, als würdest du zu viele Anfragen senden. Bitte geh es ein bisschen langsamer an. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6200,14 +6260,6 @@ 62 - - Indonesia - Indonesien - - libs/ui/src/lib/i18n.ts - 90 - - Activity Aktivität @@ -6245,7 +6297,7 @@ Diese Aktion ist nicht zulässig. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6253,7 +6305,7 @@ Liquidität libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6269,7 +6321,7 @@ Kauf und Verkauf libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6349,7 +6401,7 @@ Berücksichtigen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6373,7 +6425,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6389,7 +6441,7 @@ Möchtest du diese Profile wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6397,7 +6449,7 @@ Ups! Die Profile konnten nicht gelöscht werden. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6596,38 +6648,6 @@ 100 - - Australia - Australien - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Österreich - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Belgien - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgarien - - libs/ui/src/lib/i18n.ts - 83 - - View Holding Position ansehen @@ -6636,124 +6656,12 @@ 474 - - Canada - Kanada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Tschechien - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finnland - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Frankreich - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Deutschland - - libs/ui/src/lib/i18n.ts - 88 - - - - India - Indien - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Italien - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Niederlande - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Neuseeland - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polen - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Rumänien - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Südafrika - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Thailand - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - USA - - libs/ui/src/lib/i18n.ts - 103 - - Error Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6777,7 +6685,7 @@ Ups! Der Zugang konnte nicht bearbeitet werden. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6805,7 +6713,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6849,7 +6757,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6857,7 +6765,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6897,7 +6805,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6913,7 +6821,7 @@ Ja libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7064,6 +6972,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year um unseren Empfehlungslink zu verwenden und eine Ghostfolio Premium-Mitgliedschaft für ein Jahr zu erhalten @@ -7181,15 +7097,7 @@ Erhalte Zugang zu 80’000+ Tickern von über 50 Handelsplätzen libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ukraine - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7395,7 +7303,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7443,11 +7351,11 @@ Ich apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7487,7 +7395,7 @@ KI-Anweisung wurde in die Zwischenablage kopiert apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7503,7 +7411,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7511,7 +7419,7 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7519,7 +7427,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7527,7 +7435,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7535,7 +7443,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7543,7 +7451,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7551,7 +7459,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7559,7 +7467,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7567,7 +7475,7 @@ Öffne Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7583,7 +7491,7 @@ Änderung libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7599,11 +7507,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7646,30 +7554,6 @@ 94 - - Armenia - Armenien - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Britische Jungferninseln - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapur - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Nutzungsbedingungen @@ -7715,11 +7599,11 @@ Sicherheits-Token apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7727,7 +7611,7 @@ Möchtest du für diesen Benutzer wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7738,14 +7622,6 @@ 239 - - United Kingdom - Vereinigtes Königreich - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Allgemeine Geschäftsbedingungen @@ -7792,7 +7668,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7800,7 +7676,7 @@ Bei der Änderung zu () ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ jemand apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Möchtest du diesen Eintrag wirklich löschen? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Ausloggen apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Aktueller Monat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Möchtest du wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Anlageprofil verwalten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Alternative Investition libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Sammlerobjekt libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Ø Preis pro Einheit apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index c99924de8..e475b9c2c 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -111,7 +111,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -151,11 +151,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -215,7 +215,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -295,7 +295,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -335,7 +335,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -403,7 +403,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -499,7 +499,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -631,7 +631,7 @@ ¿Seguro que quieres eliminar este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -647,7 +647,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -691,7 +691,7 @@ Sobre Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -703,7 +703,7 @@ Empezar apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -735,11 +735,11 @@ Iniciar sesión apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -759,11 +759,11 @@ ¡Vaya! Token de seguridad incorrecto. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -870,6 +870,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Seguir conectado @@ -963,15 +971,15 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -983,15 +991,15 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1015,7 +1023,7 @@ Reportar anomalía en los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1027,7 +1035,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1043,7 +1051,7 @@ Mostrar todos libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1063,7 +1071,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1075,7 +1083,7 @@ 1 año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1087,7 +1095,7 @@ 5 años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -1107,7 +1115,7 @@ Máximo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -1123,11 +1131,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -1139,11 +1147,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -1175,7 +1183,7 @@ Mi Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -1198,6 +1206,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed El código del cupón ha sido canjeado @@ -1258,6 +1274,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista del presentador @@ -1279,7 +1303,7 @@ Configuración regional apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1367,15 +1391,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1419,7 +1443,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1487,11 +1511,11 @@ Control de administrador apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -1655,7 +1679,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1683,7 +1707,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1711,7 +1735,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -1719,7 +1743,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1855,7 +1879,7 @@ Cronología de la inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1871,7 +1895,7 @@ Peores apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1931,7 +1955,7 @@ Semana actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1955,7 +1979,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1978,6 +2002,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Cantidad @@ -1995,7 +2027,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2015,7 +2047,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2059,7 +2091,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2083,7 +2115,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2091,7 +2123,7 @@ La importación se ha completado apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2111,15 +2143,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -2139,15 +2171,15 @@ Cartera apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -2223,11 +2255,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -2275,7 +2307,7 @@ Importar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2339,7 +2371,7 @@ Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2355,7 +2387,7 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -2387,7 +2419,7 @@ Esta funcionalidad no está disponible actualmente. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2395,11 +2427,11 @@ ¡Vaya! Algo no funcionó bien. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2407,15 +2439,15 @@ Por favor, prueba más tarde. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2427,7 +2459,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2499,7 +2531,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -2507,7 +2539,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2555,7 +2587,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2579,7 +2611,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2603,7 +2635,7 @@ Miedo apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -2611,7 +2643,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2619,7 +2651,7 @@ Codicia apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -2627,7 +2659,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2635,7 +2667,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2671,11 +2703,11 @@ Índice de referencia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -2683,11 +2715,11 @@ No se pudo validar el formulario apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -2763,7 +2795,7 @@ Evolución de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2795,7 +2827,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2815,7 +2847,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2827,11 +2859,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2855,11 +2887,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2867,11 +2899,11 @@ Etiqueta libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -2883,7 +2915,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2891,7 +2923,7 @@ Materia prima libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2903,7 +2935,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2911,7 +2943,7 @@ Renta fija libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2919,7 +2951,11 @@ Propiedad inmobiliaria libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2935,7 +2971,7 @@ Bono libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2943,7 +2979,7 @@ Criptomoneda libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2951,7 +2987,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2959,7 +2995,7 @@ Fondo de inversión libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2967,7 +3003,7 @@ Metal precioso libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2975,7 +3011,7 @@ Capital riesgo libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2983,7 +3019,7 @@ Acción libs/ui/src/lib/i18n.ts - 62 + 64 @@ -2999,7 +3035,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3007,11 +3043,15 @@ Otros libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -3027,15 +3067,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3047,7 +3087,7 @@ América del Norte libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3055,7 +3095,7 @@ África libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3063,7 +3103,15 @@ Asia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3071,7 +3119,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3087,7 +3135,7 @@ Oceanía libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3095,7 +3143,7 @@ América del Sur libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3139,7 +3187,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 @@ -3175,11 +3223,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3187,7 +3235,7 @@ Calendario de dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3203,7 +3251,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3215,7 +3263,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3231,7 +3279,7 @@ Validando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3255,7 +3303,7 @@ Datos del mercado apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3311,7 +3359,7 @@ Anual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3319,7 +3367,7 @@ Importar dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3347,7 +3395,7 @@ Núcleo libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3355,7 +3403,7 @@ Conceder libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3363,7 +3411,7 @@ Mayor riesgo libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3371,7 +3419,7 @@ Menor riesgo libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3379,7 +3427,7 @@ Sin operaciones apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3387,7 +3435,7 @@ Provisión de jubilación libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3403,7 +3451,7 @@ Satélite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3527,7 +3575,7 @@ Mejorar plan apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3655,11 +3703,11 @@ No se pudo guardar el perfil del activo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -3727,7 +3775,7 @@ Cambia a Ghostfolio Premium fácilmente libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3751,7 +3799,7 @@ Cambia a Ghostfolio Premium o Ghostfolio Open Source fácilmente libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3759,7 +3807,7 @@ Préstamo libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3803,7 +3851,7 @@ Renovar Plan apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3883,7 +3931,7 @@ Año actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3899,11 +3947,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3919,7 +3967,7 @@ Perfil del activo guardado apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -3927,7 +3975,7 @@ ¿Seguro que quieres eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -3999,7 +4047,7 @@ Esta operación ya existe. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4063,7 +4111,7 @@ Racha actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4071,7 +4119,7 @@ Racha más larga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4079,7 +4127,7 @@ Meses libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4087,7 +4135,7 @@ Años libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4095,7 +4143,7 @@ Mes libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4103,7 +4151,7 @@ Año libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4263,7 +4311,15 @@ Pasivo libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4279,7 +4335,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -4507,7 +4563,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4515,7 +4571,7 @@ Activo de valor libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4523,7 +4579,7 @@ ETFs sin países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4531,7 +4587,7 @@ ETFs sin sectores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4547,7 +4603,7 @@ Preestablecido libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4563,15 +4619,7 @@ Asia-Pacífico libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japón - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4767,7 +4815,7 @@ Divisas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -4819,11 +4867,11 @@ No se pudo analizar la configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -4914,6 +4962,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Usa Ghostfolio de forma anónima y sé dueño de tus datos financieros. @@ -5379,10 +5435,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5393,7 +5445,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5493,7 +5545,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5517,7 +5569,7 @@ ¿Seguro que quieres eliminar esta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5625,7 +5677,7 @@ ¿Seguro que quieres eliminar este perfil de activo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5636,6 +5688,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Añadir manualmente @@ -5665,7 +5725,7 @@ Último máximo histórico libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5709,7 +5769,7 @@ ¡Vaya! La transferencia del saldo de efectivo ha fallado. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5717,7 +5777,7 @@ Miedo extremo libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5725,7 +5785,7 @@ Codicia extrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5733,7 +5793,7 @@ Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5744,6 +5804,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? ¿Seguro que quieres eliminar este mensaje del sistema? @@ -5757,7 +5825,7 @@ Tendencia de 50 días libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5765,7 +5833,7 @@ Tendencia de 200 días libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5773,7 +5841,7 @@ Saldos de efectivo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5809,7 +5877,7 @@ El precio actual de mercado es apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5817,7 +5885,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5857,15 +5925,7 @@ ¡Vaya! No se pudo otorgar acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5889,7 +5949,7 @@ Los datos del mercado tienen un retraso de apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5905,11 +5965,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5929,7 +5989,7 @@ Cerrar posición apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5977,7 +6037,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5997,7 +6057,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6045,7 +6105,7 @@ año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6065,7 +6125,7 @@ años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6085,7 +6145,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6150,7 +6210,7 @@ ¡Vaya! Parece que estás haciendo demasiadas solicitudes. Por favor, reduce la velocidad un poco. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6177,14 +6237,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Operación @@ -6222,7 +6274,7 @@ Esta acción no está permitida. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6230,7 +6282,7 @@ Liquidez libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6246,7 +6298,7 @@ Comprar y vender libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6326,7 +6378,7 @@ Incluir en apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6350,7 +6402,7 @@ Índices de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6366,7 +6418,7 @@ ¿Seguro que quieres eliminar estos perfiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6374,7 +6426,7 @@ ¡Vaya! No se pudieron eliminar los perfiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6573,38 +6625,6 @@ 100 - - Australia - Australia - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Austria - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Bélgica - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgaria - - libs/ui/src/lib/i18n.ts - 83 - - View Holding Ver posición @@ -6613,124 +6633,12 @@ 474 - - Canada - Canadá - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - República Checa - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finlandia - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Francia - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Alemania - - libs/ui/src/lib/i18n.ts - 88 - - - - India - India - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Italia - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Países Bajos - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Nueva Zelanda - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polonia - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Rumanía - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Sudáfrica - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Tailandia - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Estados Unidos - - libs/ui/src/lib/i18n.ts - 103 - - Error Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6754,7 +6662,7 @@ ¡Vaya! No se pudo actualizar el acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6782,7 +6690,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6826,7 +6734,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6834,7 +6742,7 @@ Cerrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6874,7 +6782,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6890,7 +6798,7 @@ libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7041,6 +6949,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year para utilizar nuestro enlace de recomendación y obtener una membresía de Ghostfolio Premium por un año @@ -7158,15 +7074,7 @@ Accede a más de 80.000 tickers de más de 50 bolsas libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ucrania - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7372,7 +7280,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7420,11 +7328,11 @@ Me apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7464,7 +7372,7 @@ El prompt para la IA ha sido copiado al portapapeles apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7480,7 +7388,7 @@ Bajo demanda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7488,7 +7396,7 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7496,7 +7404,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7504,7 +7412,7 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7512,7 +7420,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7520,7 +7428,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7528,7 +7436,7 @@ final del día apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7536,7 +7444,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7544,7 +7452,7 @@ Abrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7560,7 +7468,7 @@ Cambio libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7576,11 +7484,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7623,30 +7531,6 @@ 94 - - Armenia - Armenia - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Islas Vírgenes Británicas - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapur - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Términos y Condiciones @@ -7692,11 +7576,11 @@ Token de seguridad apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7704,7 +7588,7 @@ ¿Seguro que quieres generar un nuevo token de seguridad para este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7715,14 +7599,6 @@ 239 - - United Kingdom - Reino Unido - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Términos de servicio @@ -7769,7 +7645,7 @@ () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7777,7 +7653,7 @@ Ocurrió un error al actualizar a (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7841,7 +7717,7 @@ alguien apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7749,7 @@ ¿Seguro que quieres eliminar este elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7757,7 @@ Cerrar sesión apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8004,7 @@ Mes actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8293,7 +8169,7 @@ ¿Seguro que quieres generar un nuevo token de seguridad? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8349,7 +8225,7 @@ Gestionar perfil de activo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8357,7 +8233,7 @@ Inversión alternativa libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8241,7 @@ Coleccionable libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8249,7 @@ Precio medio por unidad apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 11d7d0577..2cbba3820 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -118,7 +118,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -158,11 +158,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -190,7 +190,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -270,7 +270,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -350,7 +350,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -382,7 +382,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -458,7 +458,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -542,7 +542,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -562,7 +562,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -638,7 +638,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -646,7 +646,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -658,15 +658,15 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -678,15 +678,15 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -694,7 +694,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 @@ -702,7 +702,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -842,7 +842,7 @@ Voulez-vous vraiment supprimer cet·te utilisateur·rice ? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -858,7 +858,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -894,11 +894,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -914,15 +914,15 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -938,11 +938,11 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -958,7 +958,7 @@ À propos de Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -970,11 +970,11 @@ Se connecter apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -994,11 +994,11 @@ Oups! Jeton de Sécurité Incorrect. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1018,7 +1018,7 @@ Peur apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1026,7 +1026,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1034,7 +1034,7 @@ Avidité apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1042,7 +1042,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1161,6 +1161,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Rester connecté @@ -1290,7 +1298,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1298,7 +1306,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1318,7 +1326,7 @@ CDA apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1330,7 +1338,7 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1342,7 +1350,7 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -1362,7 +1370,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -1374,7 +1382,7 @@ Cette fonctionnalité est momentanément indisponible. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -1382,15 +1390,15 @@ Veuillez réessayer plus tard. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -1398,11 +1406,11 @@ Oups! Quelque chose s’est mal passé. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -1414,11 +1422,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -1430,11 +1438,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -1466,7 +1474,7 @@ Mon Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -1501,6 +1509,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Le code promotionnel a été appliqué @@ -1561,6 +1577,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vue de Présentation @@ -1590,7 +1614,7 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1710,15 +1734,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1766,7 +1790,7 @@ Données du marché apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -1778,11 +1802,11 @@ Contrôle Admin apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -1958,7 +1982,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -2014,7 +2038,7 @@ Marchés apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -2022,7 +2046,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -2090,7 +2114,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2122,7 +2146,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2146,7 +2170,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -2169,6 +2193,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Unit Price Prix Unitaire @@ -2186,7 +2218,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2194,7 +2226,7 @@ L’import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2210,7 +2242,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -2350,7 +2382,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2442,11 +2474,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -2470,7 +2502,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2486,7 +2518,7 @@ Bas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -2494,7 +2526,7 @@ Évolution du Portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2502,7 +2534,7 @@ Historique des Investissements apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -2510,7 +2542,7 @@ Historique des Dividendes apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -2538,15 +2570,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -2598,7 +2630,7 @@ Démarrer apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -2686,11 +2718,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -2742,7 +2774,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2778,7 +2810,7 @@ Importer Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2842,7 +2874,7 @@ Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2858,7 +2890,7 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -2894,7 +2926,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2914,7 +2946,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2930,7 +2962,7 @@ Montrer tout libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -2946,7 +2978,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2966,7 +2998,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2978,11 +3010,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2998,7 +3030,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3010,7 +3042,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3026,7 +3058,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3034,11 +3066,15 @@ Autre libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -3062,11 +3098,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -3074,11 +3110,11 @@ Étiquette libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -3090,7 +3126,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3098,7 +3134,7 @@ Marchandise libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3110,7 +3146,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3118,7 +3154,7 @@ Revenu Fixe libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3126,7 +3162,11 @@ Immobilier libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -3142,7 +3182,7 @@ Obligation libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3150,7 +3190,7 @@ Cryptomonnaie libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3158,7 +3198,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3166,7 +3206,7 @@ SICAV libs/ui/src/lib/i18n.ts - 59 + 61 @@ -3174,7 +3214,7 @@ Métal Précieux libs/ui/src/lib/i18n.ts - 60 + 62 @@ -3182,7 +3222,7 @@ Capital Propre libs/ui/src/lib/i18n.ts - 61 + 63 @@ -3190,7 +3230,7 @@ Action libs/ui/src/lib/i18n.ts - 62 + 64 @@ -3198,7 +3238,7 @@ Afrique libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3206,7 +3246,15 @@ Asie libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3214,7 +3262,7 @@ Europe libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3222,7 +3270,7 @@ Amérique du Nord libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3238,7 +3286,7 @@ Océanie libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3246,7 +3294,7 @@ Amérique du Sud libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3270,15 +3318,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3310,7 +3358,7 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3318,7 +3366,7 @@ Importer Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3346,7 +3394,7 @@ Core libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3354,7 +3402,7 @@ Donner libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3362,7 +3410,7 @@ Risque élevé libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3370,7 +3418,7 @@ Risque faible libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3378,7 +3426,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3386,7 +3434,7 @@ Réserve pour retraite libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3402,7 +3450,7 @@ Satellite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3526,7 +3574,7 @@ Mettre à niveau l’Abonnement apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3654,11 +3702,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -3726,7 +3774,7 @@ Passez à Ghostfolio Premium facilement libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3750,7 +3798,7 @@ Passez à Ghostfolio Premium ou Ghostfolio Open Source facilement libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3758,7 +3806,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3802,7 +3850,7 @@ Renouveler l’Abonnement apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3882,7 +3930,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3898,11 +3946,11 @@ Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3918,7 +3966,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -3926,7 +3974,7 @@ Voulez-vous vraiment supprimer cette plateforme ? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -3998,7 +4046,7 @@ Cette activité existe déjà. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4062,7 +4110,7 @@ Série en cours apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4070,7 +4118,7 @@ Série la plus longue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4078,7 +4126,7 @@ Mois libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4086,7 +4134,7 @@ Années libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4094,7 +4142,7 @@ Mois libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4102,7 +4150,7 @@ Année libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4262,7 +4310,15 @@ Dette libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4278,7 +4334,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -4506,7 +4562,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4514,7 +4570,7 @@ Actifs libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4522,7 +4578,7 @@ ETF sans Pays apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4530,7 +4586,7 @@ ETF sans Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4546,7 +4602,7 @@ Configuration par défaut libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4562,15 +4618,7 @@ Asie-Pacifique libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japon - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4766,7 +4814,7 @@ Devises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -4818,11 +4866,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -4913,6 +4961,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Utilisez Ghostfolio de manière anonyme et soyez propriétaire de vos données financières. @@ -5378,10 +5434,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5392,7 +5444,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5492,7 +5544,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5568,7 @@ Confirmez la suppression de ce tag ? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5624,7 +5676,7 @@ Confirmez la suppressoion de ce profil d’actif? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5635,6 +5687,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Ajouter manuellement @@ -5664,7 +5724,7 @@ Dernier All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5708,7 +5768,7 @@ Oops, échec du transfert de la cash balance. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5776,7 @@ Extreme Peur libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5784,7 @@ Extreme Cupidité libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5792,7 @@ Neutre libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5803,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? Confirmer la suppresion de ce message système? @@ -5756,7 +5824,7 @@ Tendance 50 jours libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5832,7 @@ Tendance 200 jours libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5840,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5808,7 +5876,7 @@ Le prix actuel du marché est apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5816,7 +5884,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5856,15 +5924,7 @@ Oops! Impossible d’accorder l’accès. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5888,7 +5948,7 @@ Les données du marché sont retardées de apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,11 +5964,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5928,7 +5988,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5976,7 +6036,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5996,7 +6056,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6044,7 +6104,7 @@ année apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6064,7 +6124,7 @@ années apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6084,7 +6144,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6149,7 +6209,7 @@ Oops! Il semble que vous fassiez trop de requêtes. Veuillez ralentir un peu. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6176,14 +6236,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Activitées @@ -6221,7 +6273,7 @@ Cette action n’est pas autorisée. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6281,7 @@ Liquiditées libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6297,7 @@ Achat et Vente libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6325,7 +6377,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6349,7 +6401,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6365,7 +6417,7 @@ Confirmer la suppression de ces Profils? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6373,7 +6425,7 @@ Oops! Echec de la suppression de Profils. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6572,38 +6624,6 @@ 100 - - Australia - Australie - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Autriche - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Belgique - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgarie - - libs/ui/src/lib/i18n.ts - 83 - - View Holding View Holding @@ -6612,124 +6632,12 @@ 474 - - Canada - Canada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - République Tchèque - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finlande - - libs/ui/src/lib/i18n.ts - 86 - - - - France - France - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Allemagne - - libs/ui/src/lib/i18n.ts - 88 - - - - India - Inde - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Italie - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Pays-Bas - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Nouvelle-Zélande - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Pologne - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Roumanie - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Afrique du Sud - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Thaïlande - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Etats-Unis - - libs/ui/src/lib/i18n.ts - 103 - - Error Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6661,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6781,7 +6689,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6733,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6741,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6873,7 +6781,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6797,7 @@ Oui libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7040,6 +6948,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -7157,15 +7073,7 @@ Accédez à plus de 80 000 symboles financiers issus de plus de 50 marchés boursiers. libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ukraine - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7371,7 +7279,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,11 +7327,11 @@ Moi apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7463,7 +7371,7 @@ Le prompt IA a été copié dans le presse-papiers apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ fin de journée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Ouvrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Variation libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Arménie - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Îles Vierges britanniques - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapour - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Conditions générales @@ -7691,11 +7575,11 @@ Jeton de sécurité apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité pour cet utilisateur ? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - Royaume-Uni - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Conditions d’utilisation @@ -7768,7 +7644,7 @@ () est déjà utilisé. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ Une erreur s’est produite lors de la mise à jour vers (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ quelqu’un apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Voulez-vous vraiment supprimer cet élément? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Se déconnecter apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Gérer le profil d’actif apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Investissement alternatif libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Objet de collection libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index 7496bb8f9..82844588f 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -111,7 +111,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -151,11 +151,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -215,7 +215,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -295,7 +295,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -335,7 +335,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -403,7 +403,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -499,7 +499,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -631,7 +631,7 @@ Vuoi davvero eliminare questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -647,7 +647,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -691,7 +691,7 @@ Informazioni su Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -703,7 +703,7 @@ Inizia apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -735,11 +735,11 @@ Accedi apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -759,11 +759,11 @@ Ops! Token di sicurezza errato. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -870,6 +870,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Rimani connesso @@ -963,15 +971,15 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -983,15 +991,15 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1015,7 +1023,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1027,7 +1035,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1043,7 +1051,7 @@ Mostra tutti libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1063,7 +1071,7 @@ anno corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1075,7 +1083,7 @@ 1 anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1087,7 +1095,7 @@ 5 anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -1107,7 +1115,7 @@ Massimo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -1123,11 +1131,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -1139,11 +1147,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -1175,7 +1183,7 @@ Il mio Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -1198,6 +1206,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Il codice del buono è stato riscattato @@ -1258,6 +1274,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista presentatore @@ -1279,7 +1303,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1367,15 +1391,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1419,7 +1443,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1487,11 +1511,11 @@ Controllo amministrativo apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -1655,7 +1679,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1683,7 +1707,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1711,7 +1735,7 @@ Mercati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -1719,7 +1743,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1855,7 +1879,7 @@ Cronologia degli investimenti apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1871,7 +1895,7 @@ In basso apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1931,7 +1955,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1955,7 +1979,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1978,6 +2002,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Quantità @@ -1995,7 +2027,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2015,7 +2047,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2059,7 +2091,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2083,7 +2115,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2091,7 +2123,7 @@ L’importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2111,15 +2143,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -2139,15 +2171,15 @@ Portafoglio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -2223,11 +2255,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -2275,7 +2307,7 @@ Importa le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2339,7 +2371,7 @@ Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2355,7 +2387,7 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -2387,7 +2419,7 @@ Questa funzionalità non è attualmente disponibile. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2395,11 +2427,11 @@ Ops! Qualcosa è andato storto. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2407,15 +2439,15 @@ Riprova più tardi. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2427,7 +2459,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2499,7 +2531,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -2507,7 +2539,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2555,7 +2587,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2579,7 +2611,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2603,7 +2635,7 @@ Paura apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -2611,7 +2643,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2619,7 +2651,7 @@ Avidità apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -2627,7 +2659,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2635,7 +2667,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2671,11 +2703,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -2683,11 +2715,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -2763,7 +2795,7 @@ Evoluzione del portafoglio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2795,7 +2827,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2815,7 +2847,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2827,11 +2859,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2855,11 +2887,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2867,11 +2899,11 @@ Etichetta libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -2883,7 +2915,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2891,7 +2923,7 @@ Materia prima libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2903,7 +2935,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2911,7 +2943,7 @@ Reddito fisso libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2919,7 +2951,11 @@ Immobiliare libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2935,7 +2971,7 @@ Obbligazioni libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2943,7 +2979,7 @@ Criptovaluta libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2951,7 +2987,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2959,7 +2995,7 @@ Fondo comune di investimento libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2967,7 +3003,7 @@ Metalli preziosi libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2975,7 +3011,7 @@ Azione ordinaria privata libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2983,7 +3019,7 @@ Azione libs/ui/src/lib/i18n.ts - 62 + 64 @@ -2999,7 +3035,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3007,11 +3043,15 @@ Altro libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -3027,15 +3067,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3047,7 +3087,7 @@ Nord America libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3055,7 +3095,7 @@ Africa libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3063,7 +3103,15 @@ Asia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3071,7 +3119,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3087,7 +3135,7 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3095,7 +3143,7 @@ Sud America libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3139,7 +3187,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 @@ -3175,11 +3223,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3187,7 +3235,7 @@ Cronologia dei dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3203,7 +3251,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3215,7 +3263,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3231,7 +3279,7 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3255,7 +3303,7 @@ Dati del mercato apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3311,7 +3359,7 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3319,7 +3367,7 @@ Importa i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3347,7 +3395,7 @@ Nucleo libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3355,7 +3403,7 @@ Sovvenzione libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3363,7 +3411,7 @@ Rischio più elevato libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3371,7 +3419,7 @@ Rischio inferiore libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3379,7 +3427,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3387,7 +3435,7 @@ Fondo pensione libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3403,7 +3451,7 @@ Satellite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3527,7 +3575,7 @@ Aggiorna il piano apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3655,11 +3703,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -3727,7 +3775,7 @@ Passa facilmente a Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3751,7 +3799,7 @@ Passa facilmente a Ghostfolio Premium o Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3759,7 +3807,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3803,7 +3851,7 @@ Rinnova il piano apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3883,7 +3931,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3899,11 +3947,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3919,7 +3967,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -3927,7 +3975,7 @@ Vuoi davvero eliminare questa piattaforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -3999,7 +4047,7 @@ Questa attività esiste già. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4063,7 +4111,7 @@ Serie attuale apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4071,7 +4119,7 @@ Serie più lunga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4079,7 +4127,7 @@ Mesi libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4087,7 +4135,7 @@ Anni libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4095,7 +4143,7 @@ Mese libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4103,7 +4151,7 @@ Anno libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4263,7 +4311,15 @@ Passività libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4279,7 +4335,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -4507,7 +4563,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4515,7 +4571,7 @@ Prezioso libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4523,7 +4579,7 @@ ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4531,7 +4587,7 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4547,7 +4603,7 @@ Preimpostato libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4563,15 +4619,7 @@ Asia e Pacifico libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Giappone - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4767,7 +4815,7 @@ Valute apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -4819,11 +4867,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -4914,6 +4962,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Usa Ghostfolio in modo anonimo e possiedi i tuoi dati finanziari. @@ -5379,10 +5435,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5393,7 +5445,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5493,7 +5545,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5517,7 +5569,7 @@ Sei sicuro di voler eliminare questo tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5625,7 +5677,7 @@ Vuoi veramente eliminare il profilo di questo asset? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5636,6 +5688,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Aggiungi manualmente @@ -5665,7 +5725,7 @@ Ultimo massimo storico libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5709,7 +5769,7 @@ Ops, il trasferimento del saldo di cassa è fallito. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5717,7 +5777,7 @@ Paura estrema libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5725,7 +5785,7 @@ Avidità estrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5733,7 +5793,7 @@ Neutrale libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5744,6 +5804,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? Confermi di voler cancellare questo messaggio di sistema? @@ -5757,7 +5825,7 @@ Trend a 50 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5765,7 +5833,7 @@ Trend a 200 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5773,7 +5841,7 @@ Saldi di cassa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5809,7 +5877,7 @@ L’attuale prezzo di mercato è apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5817,7 +5885,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5857,15 +5925,7 @@ Ops! Impossibile abilitare l’accesso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5889,7 +5949,7 @@ I dati di mercato sono ritardati di apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5905,11 +5965,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5929,7 +5989,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5977,7 +6037,7 @@ Settimana corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5997,7 +6057,7 @@ Mese corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6045,7 +6105,7 @@ anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6065,7 +6125,7 @@ anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6085,7 +6145,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6150,7 +6210,7 @@ Ops! Sembra tu stia facendo troppe richieste. Rallenta un po’ per favore. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6177,14 +6237,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Attività @@ -6222,7 +6274,7 @@ Questa azione non è permessa. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6230,7 +6282,7 @@ Liquidità libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6246,7 +6298,7 @@ Compra e vendi libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6326,7 +6378,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6350,7 +6402,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6366,7 +6418,7 @@ Confermi di voler eliminare questi profili? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6374,7 +6426,7 @@ Ops! Impossibile eliminare i profili. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6573,38 +6625,6 @@ 100 - - Australia - Australia - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Austria - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Belgio - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgaria - - libs/ui/src/lib/i18n.ts - 83 - - View Holding View Holding @@ -6613,124 +6633,12 @@ 474 - - Canada - Canada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Repubblica Ceca - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finlandia - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Francia - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Germania - - libs/ui/src/lib/i18n.ts - 88 - - - - India - India - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Italia - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Olanda - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Nuova Zelanda - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polonia - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Romania - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Sud Africa - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Tailandia - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Stati Uniti - - libs/ui/src/lib/i18n.ts - 103 - - Error Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6754,7 +6662,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6782,7 +6690,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6826,7 +6734,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6834,7 +6742,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6874,7 +6782,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6890,7 +6798,7 @@ Si libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7041,6 +6949,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -7158,15 +7074,7 @@ Ottieni accesso a oltre 80’000+ titoli da oltre 50 borse libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ucraina - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7372,7 +7280,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7420,11 +7328,11 @@ Me apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7464,7 +7372,7 @@ L’AI prompt è stato copiato negli appunti apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7480,7 +7388,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7488,7 +7396,7 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7496,7 +7404,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7504,7 +7412,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7512,7 +7420,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7520,7 +7428,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7528,7 +7436,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7536,7 +7444,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7544,7 +7452,7 @@ Apri Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7560,7 +7468,7 @@ Cambia libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7576,11 +7484,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7623,30 +7531,6 @@ 94 - - Armenia - Armenia - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Isole Vergini Britanniche - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapore - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Termini e condizioni @@ -7692,11 +7576,11 @@ Token di sicurezza apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7704,7 +7588,7 @@ Vuoi davvero generare un nuovo token di sicurezza per questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7715,14 +7599,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Termini e condizioni @@ -7769,7 +7645,7 @@ () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7777,7 +7653,7 @@ Si è verificato un errore durante l’aggiornamento di (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7841,7 +7717,7 @@ qualcuno apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7749,7 @@ Vuoi davvero eliminare questo elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7757,7 @@ Esci apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8004,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8293,7 +8169,7 @@ Vuoi davvero generare un nuovo token di sicurezza? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8349,7 +8225,7 @@ Gestisci profilo risorsa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8357,7 +8233,7 @@ Investimenti alternativi libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8241,7 @@ Da collezione libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8249,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index c0e3501a5..07a6daa1d 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -340,7 +340,7 @@ 현금 잔액 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -364,7 +364,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,11 +404,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -436,7 +436,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -500,7 +500,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -580,7 +580,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -608,7 +608,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -632,7 +632,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -768,7 +768,7 @@ 통화 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -780,7 +780,7 @@ 국가 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -788,7 +788,7 @@ 섹터 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -796,7 +796,7 @@ 이 자산 프로필을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -804,7 +804,7 @@ 다음 기준으로 필터... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -824,7 +824,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -899,6 +899,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh 새로고침 @@ -948,7 +956,7 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -956,7 +964,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -968,15 +976,15 @@ 섹터 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -988,15 +996,15 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1004,7 +1012,15 @@ 심볼 매핑 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -1020,7 +1036,7 @@ 스크래퍼 설정 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -1028,7 +1044,7 @@ 메모 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1055,6 +1071,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually 수동 추가 @@ -1083,6 +1107,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? 이 쿠폰을 정말 삭제하시겠습니까? @@ -1220,11 +1252,11 @@ 링크 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1240,7 +1272,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1248,7 +1280,7 @@ 정말로 이 플랫폼을 삭제하시겠습니까? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1280,7 +1312,7 @@ 올해 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1328,7 +1360,7 @@ 이 태그를 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -1352,7 +1384,7 @@ 이 사용자를 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1368,7 +1400,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1420,11 +1452,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1448,15 +1480,15 @@ 포트폴리오 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1472,11 +1504,11 @@ 기준 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1492,7 +1524,7 @@ 고스트폴리오 소개 apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1504,11 +1536,11 @@ 로그인 apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1528,11 +1560,11 @@ 이런! 잘못된 보안 토큰. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1552,7 +1584,7 @@ 두려움 apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1560,7 +1592,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1568,7 +1600,7 @@ 탐욕 apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1576,7 +1608,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1676,7 +1708,7 @@ 이번주 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1795,6 +1827,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in 로그인 상태 유지 @@ -1956,7 +1996,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1964,7 +2004,7 @@ 데이터 결함 보고 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -2112,7 +2152,7 @@ 업그레이드 계획 apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2152,7 +2192,7 @@ 연초 대비 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -2164,7 +2204,7 @@ 1년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -2176,7 +2216,7 @@ 5년 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2196,7 +2236,7 @@ 맥스 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2243,6 +2283,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed 쿠폰 코드가 사용되었습니다. @@ -2315,6 +2363,14 @@ 279 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View 발표자 보기 @@ -2352,7 +2408,7 @@ 장소 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2480,7 +2536,7 @@ 이 기능은 현재 사용할 수 없습니다. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2488,15 +2544,15 @@ 나중에 다시 시도해 주세요. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2504,11 +2560,11 @@ 이런! 문제가 발생했습니다. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2520,11 +2576,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2536,11 +2592,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -2644,15 +2700,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2676,7 +2732,7 @@ 죄송합니다. 현금 잔액 이체가 실패했습니다. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2732,11 +2788,11 @@ 관리자 제어 apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -2748,7 +2804,7 @@ 시장 데이터 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -2800,7 +2856,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2940,11 +2996,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -3000,7 +3056,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -3120,7 +3176,7 @@ 시작하기 apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3192,7 +3248,7 @@ 시장 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -3200,7 +3256,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3363,6 +3419,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. 익명으로 Ghostfolio를 사용하고 금융 데이터를 소유하세요. @@ -3708,7 +3772,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3820,7 +3884,7 @@ 활동 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3836,7 +3900,7 @@ 배당금 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3852,7 +3916,7 @@ 데이터 가져오는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3860,7 +3924,7 @@ 가져오기가 완료되었습니다. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3876,7 +3940,7 @@ 데이터 유효성을 검사하는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4060,7 +4124,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4176,11 +4240,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4204,7 +4268,7 @@ 월간 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4212,7 +4276,7 @@ 매년 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -4228,7 +4292,7 @@ 하위 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4236,7 +4300,7 @@ 포트폴리오 진화 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4244,7 +4308,7 @@ 투자 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4252,7 +4316,7 @@ 현재 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4260,7 +4324,7 @@ 최장 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4268,7 +4332,7 @@ 배당 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4296,15 +4360,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -4468,7 +4532,7 @@ 플랜 갱신 apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4492,11 +4556,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -4867,10 +4931,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -4881,7 +4941,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4893,11 +4953,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -4945,7 +5005,7 @@ 나의 고스트폴리오 apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -5057,7 +5117,7 @@ 50일 추세 libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5065,7 +5125,7 @@ 200일 추세 libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5081,7 +5141,7 @@ 마지막 역대 최고치 libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5089,7 +5149,7 @@ 역대 최고치에서 변화 libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5105,7 +5165,7 @@ ATH에서 libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -5113,7 +5173,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5173,7 +5233,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5193,7 +5253,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5209,7 +5269,7 @@ 모두 표시 libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5225,7 +5285,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5237,7 +5297,7 @@ 아시아·태평양 libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5253,7 +5313,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5265,11 +5325,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -5285,7 +5345,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5297,7 +5357,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5305,7 +5365,7 @@ 핵심 libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5313,7 +5373,7 @@ Ghostfolio 프리미엄 또는 Ghostfolio Open Source로 쉽게 전환하세요 libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5321,7 +5381,7 @@ Ghostfolio 프리미엄으로 쉽게 전환하세요 libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5337,7 +5397,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5345,7 +5405,7 @@ 승인하다 libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5353,7 +5413,7 @@ 더 높은 위험 libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5361,15 +5421,7 @@ 이 활동은 이미 존재합니다. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - 일본 - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5377,7 +5429,7 @@ 위험 감소 libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5385,7 +5437,7 @@ libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5393,7 +5445,7 @@ 개월 libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5401,11 +5453,15 @@ 다른 libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -5413,7 +5469,7 @@ 프리셋 libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5421,7 +5477,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5429,7 +5485,7 @@ 퇴직금 libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5445,7 +5501,7 @@ 위성 libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5469,11 +5525,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5481,11 +5537,11 @@ 꼬리표 libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -5493,7 +5549,7 @@ 년도 libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5513,7 +5569,7 @@ 연령 libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5533,7 +5589,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5549,7 +5605,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5557,7 +5613,7 @@ 귀중한 libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5565,7 +5621,7 @@ 책임 libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5577,7 +5633,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5589,7 +5645,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5597,7 +5653,7 @@ 상품 libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5609,7 +5665,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5617,7 +5673,7 @@ 채권 libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5625,7 +5681,11 @@ 부동산 libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5641,7 +5701,7 @@ 노예 libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5649,7 +5709,7 @@ 암호화폐 libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5657,7 +5717,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5665,7 +5725,7 @@ 뮤추얼 펀드 libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5673,7 +5733,7 @@ 귀금속 libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5681,7 +5741,7 @@ 사모펀드 libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5689,7 +5749,7 @@ 재고 libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5697,7 +5757,7 @@ 아프리카 libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5705,7 +5765,15 @@ 아시아 libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5713,7 +5781,7 @@ 유럽 libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5721,7 +5789,7 @@ 북미 libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5737,7 +5805,7 @@ 오세아니아 libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5745,7 +5813,7 @@ 남아메리카 libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5753,7 +5821,7 @@ 극심한 공포 libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5761,7 +5829,7 @@ 극도의 탐욕 libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5769,7 +5837,7 @@ 중립적 libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5805,15 +5873,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5841,7 +5909,7 @@ 현재 시장가격은 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5849,7 +5917,7 @@ 시험 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5857,15 +5925,7 @@ 이런! 액세스 권한을 부여할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - 아르헨티나 - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5913,7 +5973,7 @@ 시장 데이터가 지연됩니다. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5929,7 +5989,7 @@ 닫기 보유 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5953,11 +6013,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -6017,7 +6077,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6029,7 +6089,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -6069,7 +6129,7 @@ 년도 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6089,7 +6149,7 @@ 연령 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6134,7 +6194,7 @@ 데이터 수집 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6174,7 +6234,7 @@ 이런! 요청을 너무 많이 하시는 것 같습니다. 조금 천천히 해주세요. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6201,14 +6261,6 @@ 61 - - Indonesia - 인도네시아 공화국 - - libs/ui/src/lib/i18n.ts - 90 - - Activity 활동 @@ -6238,7 +6290,7 @@ 이 작업은 허용되지 않습니다. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6254,7 +6306,7 @@ 유동성 libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6262,7 +6314,7 @@ 구매 및 판매 libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6350,7 +6402,7 @@ 포함 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6374,7 +6426,7 @@ 이 프로필을 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6390,7 +6442,7 @@ 이런! 프로필을 삭제할 수 없습니다. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6398,7 +6450,7 @@ 벤치마크 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6493,46 +6545,6 @@ 86 - - Thailand - 태국 - - libs/ui/src/lib/i18n.ts - 100 - - - - India - 인도 - - libs/ui/src/lib/i18n.ts - 89 - - - - Austria - 오스트리아 - - libs/ui/src/lib/i18n.ts - 80 - - - - Poland - 폴란드 - - libs/ui/src/lib/i18n.ts - 95 - - - - Italy - 이탈리아 - - libs/ui/src/lib/i18n.ts - 91 - - User Experience 사용자 경험 @@ -6581,30 +6593,6 @@ 474 - - Canada - 캐나다 - - libs/ui/src/lib/i18n.ts - 84 - - - - New Zealand - 뉴질랜드 - - libs/ui/src/lib/i18n.ts - 94 - - - - Netherlands - 네덜란드 - - libs/ui/src/lib/i18n.ts - 93 - - Alternative 대안 @@ -6641,30 +6629,6 @@ 96 - - Romania - 루마니아 - - libs/ui/src/lib/i18n.ts - 96 - - - - Germany - 독일 - - libs/ui/src/lib/i18n.ts - 88 - - - - United States - 미국 - - libs/ui/src/lib/i18n.ts - 103 - - Budgeting 예산 편성 @@ -6673,14 +6637,6 @@ 85 - - Belgium - 벨기에 - - libs/ui/src/lib/i18n.ts - 81 - - Open Source 오픈 소스 @@ -6693,38 +6649,6 @@ 91 - - Czech Republic - 체코 - - libs/ui/src/lib/i18n.ts - 85 - - - - Australia - 호주 - - libs/ui/src/lib/i18n.ts - 79 - - - - South Africa - 남아프리카 - - libs/ui/src/lib/i18n.ts - 98 - - - - Bulgaria - 불가리아 - - libs/ui/src/lib/i18n.ts - 83 - - Privacy 은둔 @@ -6733,28 +6657,12 @@ 94 - - Finland - 핀란드 - - libs/ui/src/lib/i18n.ts - 86 - - - - France - 프랑스 - - libs/ui/src/lib/i18n.ts - 87 - - Error 오류 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6766,7 +6674,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6810,7 +6718,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6826,7 +6734,7 @@ libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6850,7 +6758,7 @@ 닫다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6890,7 +6798,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6906,7 +6814,7 @@ 이런! 액세스를 업데이트할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -7057,6 +6965,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year 추천 링크를 사용하고 1년 동안 Ghostfolio 프리미엄 멤버십을 얻으려면 @@ -7161,14 +7077,6 @@ 40 - - Ukraine - 우크라이나 - - libs/ui/src/lib/i18n.ts - 101 - - Set API key API 키 설정 @@ -7182,7 +7090,7 @@ 50개 이상의 거래소에서 80,000개 이상의 티커에 접근하세요 libs/ui/src/lib/i18n.ts - 25 + 27 @@ -7396,7 +7304,7 @@ 구하다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7460,11 +7368,11 @@ apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7488,7 +7396,7 @@ AI 프롬프트가 클립보드에 복사되었습니다. apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7504,7 +7412,7 @@ 방법 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7512,7 +7420,7 @@ 기본 시장 가격 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7520,7 +7428,7 @@ 선택자 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7528,7 +7436,7 @@ 즉각적인 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7536,7 +7444,7 @@ 게으른 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7544,7 +7452,7 @@ HTTP 요청 헤더 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7552,7 +7460,7 @@ 실시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7560,7 +7468,7 @@ 하루의 끝 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7568,7 +7476,7 @@ 오픈 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7584,7 +7492,7 @@ 변화 libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7600,11 +7508,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7631,14 +7539,6 @@ 67 - - Singapore - 싱가포르 - - libs/ui/src/lib/i18n.ts - 97 - - Total amount Total amount @@ -7647,22 +7547,6 @@ 94 - - Armenia - 아르메니아 - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - 영국령 버진아일랜드 - - libs/ui/src/lib/i18n.ts - 82 - - Copy portfolio data to clipboard for AI prompt AI 프롬프트를 위해 포트폴리오 데이터를 클립보드에 복사 @@ -7716,7 +7600,7 @@ 정말로 이 사용자에 대한 새 보안 토큰을 생성하시겠습니까? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7724,11 +7608,11 @@ 보안 토큰 apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7739,14 +7623,6 @@ 239 - - United Kingdom - 영국 - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service 이용약관 @@ -7793,7 +7669,7 @@ ()은(는) 이미 사용 중입니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7801,7 +7677,7 @@ ()로 업데이트하는 동안 오류가 발생했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7841,7 +7717,7 @@ 누구 apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7749,7 @@ 이 항목을 정말로 삭제하시겠습니까? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7757,7 @@ 로그아웃 apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8004,7 @@ 이번 달 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8309,7 +8185,7 @@ 정말로 새로운 보안 토큰을 생성하시겠습니까? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8349,7 +8225,7 @@ 자산 프로필 관리 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8357,7 +8233,7 @@ 대체투자 libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8241,7 @@ 소장용 libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8249,7 @@ 평균단가 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b33aee404..eab63de12 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -110,7 +110,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -150,11 +150,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -214,7 +214,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -294,7 +294,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -334,7 +334,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -402,7 +402,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -498,7 +498,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -630,7 +630,7 @@ Wilt je deze gebruiker echt verwijderen? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -646,7 +646,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -690,7 +690,7 @@ Over Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -702,7 +702,7 @@ Aan de slag apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -734,11 +734,11 @@ Aanmelden apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -758,11 +758,11 @@ Oeps! Onjuiste beveiligingstoken. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -869,6 +869,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Aangemeld blijven @@ -962,15 +970,15 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -982,15 +990,15 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1014,7 +1022,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1026,7 +1034,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1042,7 +1050,7 @@ Toon alle libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1062,7 +1070,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1074,7 +1082,7 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1086,7 +1094,7 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -1106,7 +1114,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -1122,11 +1130,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -1138,11 +1146,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -1174,7 +1182,7 @@ Mijn Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -1197,6 +1205,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Je couponcode is ingewisseld @@ -1257,6 +1273,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Presentatie weergave @@ -1278,7 +1302,7 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1366,15 +1390,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1418,7 +1442,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1486,11 +1510,11 @@ Beheer apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -1654,7 +1678,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1682,7 +1706,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1710,7 +1734,7 @@ Markten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -1718,7 +1742,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1854,7 +1878,7 @@ Tijdlijn investeringen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1870,7 +1894,7 @@ Verliezers apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1930,7 +1954,7 @@ Huidige week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1954,7 +1978,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1977,6 +2001,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Hoeveelheid @@ -1994,7 +2026,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2014,7 +2046,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2058,7 +2090,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2082,7 +2114,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2090,7 +2122,7 @@ Importeren is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2110,15 +2142,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -2138,15 +2170,15 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -2222,11 +2254,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -2274,7 +2306,7 @@ Activiteiten importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2338,7 +2370,7 @@ Verandering van Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2354,7 +2386,7 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -2386,7 +2418,7 @@ Deze functie is momenteel niet beschikbaar. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2394,11 +2426,11 @@ Oeps! Er ging iets mis. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2406,15 +2438,15 @@ Probeer het later nog eens. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2426,7 +2458,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2498,7 +2530,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -2506,7 +2538,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2554,7 +2586,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2578,7 +2610,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2602,7 +2634,7 @@ Angst apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -2610,7 +2642,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2618,7 +2650,7 @@ Hebzucht apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -2626,7 +2658,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2634,7 +2666,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2670,11 +2702,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -2682,11 +2714,11 @@ Het formulier kon niet worden gevalideerd. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -2762,7 +2794,7 @@ Waardeontwikkeling van portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2794,7 +2826,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2814,7 +2846,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2826,11 +2858,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2854,11 +2886,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2866,11 +2898,11 @@ Label libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -2882,7 +2914,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2890,7 +2922,7 @@ Grondstof libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2902,7 +2934,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2910,7 +2942,7 @@ Vast inkomen libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2918,7 +2950,11 @@ Vastgoed libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2934,7 +2970,7 @@ Obligatie libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2942,7 +2978,7 @@ Cryptovaluta libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2950,7 +2986,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2958,7 +2994,7 @@ Beleggingsfonds libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2966,7 +3002,7 @@ Edelmetaal libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2974,7 +3010,7 @@ Private equity libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2982,7 +3018,7 @@ Aandeel libs/ui/src/lib/i18n.ts - 62 + 64 @@ -2998,7 +3034,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3006,11 +3042,15 @@ Anders libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -3026,15 +3066,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3046,7 +3086,7 @@ Noord-Amerika libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3054,7 +3094,7 @@ Afrika libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3062,7 +3102,15 @@ Azië libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3070,7 +3118,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3086,7 +3134,7 @@ Oceanië libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3094,7 +3142,7 @@ Zuid-Amerika libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3138,7 +3186,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 @@ -3174,11 +3222,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3186,7 +3234,7 @@ Tijdlijn dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3202,7 +3250,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3214,7 +3262,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3230,7 +3278,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3254,7 +3302,7 @@ Marktgegevens apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3310,7 +3358,7 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3318,7 +3366,7 @@ Importeer dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3346,7 +3394,7 @@ Kern libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3354,7 +3402,7 @@ Toelage libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3362,7 +3410,7 @@ Hoger risico libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3370,7 +3418,7 @@ Lager risico libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3378,7 +3426,7 @@ Geen activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3386,7 +3434,7 @@ Pensioen libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3402,7 +3450,7 @@ Satelliet libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3526,7 +3574,7 @@ Abonnement uitbreiden apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3654,11 +3702,11 @@ Kon het assetprofiel niet opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -3726,7 +3774,7 @@ Eenvoudig overstappen naar Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3750,7 +3798,7 @@ Eenvoudig overstappen naar Ghostfolio Premium of Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3758,7 +3806,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3802,7 +3850,7 @@ Abonnement Vernieuwen apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3882,7 +3930,7 @@ Huidig jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3898,11 +3946,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3918,7 +3966,7 @@ Het activaprofiel is opgeslagen. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -3926,7 +3974,7 @@ Wil je dit platform echt verwijderen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -3998,7 +4046,7 @@ Deze activiteit bestaat al. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4062,7 +4110,7 @@ Huidige reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4070,7 +4118,7 @@ Langste reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4078,7 +4126,7 @@ Maanden libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4086,7 +4134,7 @@ Jaren libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4094,7 +4142,7 @@ Maand libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4102,7 +4150,7 @@ Jaar libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4262,7 +4310,15 @@ Verplichtingen libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4278,7 +4334,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -4506,7 +4562,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4514,7 +4570,7 @@ Waardevol libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4522,7 +4578,7 @@ ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4530,7 +4586,7 @@ ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4546,7 +4602,7 @@ Voorinstelling libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4562,15 +4618,7 @@ Azië en de Stille Oceaan libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japan - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4766,7 +4814,7 @@ Valuta apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -4818,11 +4866,11 @@ De scraperconfiguratie kon niet worden geparseerd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -4913,6 +4961,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Gebruik Ghostfolio anoniem en bezit je financiële gegevens. @@ -5378,10 +5434,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5392,7 +5444,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5492,7 +5544,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5568,7 @@ Weet u zetker dat u dit label wilt verwijderen? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5624,7 +5676,7 @@ Weet u zeker dat u dit bezittingen profiel wilt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5635,6 +5687,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Voeg Handmatig Toe @@ -5664,7 +5724,7 @@ Laatste Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5708,7 +5768,7 @@ Oeps, geldoverdracht is mislukt. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5776,7 @@ Extreme Angst libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5784,7 @@ Extreme Hebzucht libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5792,7 @@ Neutraal libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5803,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? Wilt u dit systeembericht echt verwijderen? @@ -5756,7 +5824,7 @@ 50-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5832,7 @@ 200-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5840,7 @@ Contant Saldo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5808,7 +5876,7 @@ De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5816,7 +5884,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5856,15 +5924,7 @@ Oeps! Kan geen toegang verlenen. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentinië - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5888,7 +5948,7 @@ Markt data is vertraagd voor apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,11 +5964,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5928,7 +5988,7 @@ Sluit Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5976,7 +6036,7 @@ Week tot nu toe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5996,7 +6056,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6044,7 +6104,7 @@ jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6064,7 +6124,7 @@ jaren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6084,7 +6144,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6149,7 +6209,7 @@ Oeps! Het lijkt er op dat u te veel verzoeken indient. Doe het iets rustiger aan alstublieft. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6176,14 +6236,6 @@ 62 - - Indonesia - Indonesië - - libs/ui/src/lib/i18n.ts - 90 - - Activity Activiteit @@ -6221,7 +6273,7 @@ Deze actie is niet toegestaan. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6281,7 @@ Liquiditeit libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6297,7 @@ Aan- en Verkoop libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6325,7 +6377,7 @@ Opnemen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6349,7 +6401,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6365,7 +6417,7 @@ Wilt u deze profielen echt verwijderen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6373,7 +6425,7 @@ Oeps! Verwijderen van de profielen is mislukt. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6572,38 +6624,6 @@ 100 - - Australia - Australië - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Oostenrijk - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - België - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgarije - - libs/ui/src/lib/i18n.ts - 83 - - View Holding Bekijk Holding @@ -6612,124 +6632,12 @@ 474 - - Canada - Canada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Tsjechische Republiek - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finland - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Frankrijk - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Duitsland - - libs/ui/src/lib/i18n.ts - 88 - - - - India - India - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Italië - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Nederland - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Nieuw-Zeeland - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polen - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Roemenië - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Zuid-Afrika - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Thailand - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Verenigde Station - - libs/ui/src/lib/i18n.ts - 103 - - Error Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6661,7 @@ Oops! Kan de toegang niet updaten. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6781,7 +6689,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6733,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6741,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6873,7 +6781,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6797,7 @@ Ja libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7040,6 +6948,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -7157,15 +7073,7 @@ Krijg toegang tot meer dan 80.000 tickers van meer dan 50 beurzen libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Oekraïne - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7371,7 +7279,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,11 +7327,11 @@ Ik apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7463,7 +7371,7 @@ AI-prompt is naar het klembord gekopieerd apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Aanpassen libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Armenië - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Britse Maagdeneilanden - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapore - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Algemene Voorwaarden @@ -7691,11 +7575,11 @@ Beveiligingstoken apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - Verenigd Koninkrijk - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Servicevoorwaarden @@ -7768,7 +7644,7 @@ () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ Er is een fout opgetreden tijdens het updaten naar (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ iemand apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Wilt u dit item echt verwijderen? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Uitloggen apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Huidige maand apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Wilt u echt een nieuwe securitytoken genereren? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Beheer activaprofiel apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Alternatieve belegging libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Verzamelobject libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Gemiddelde eenheidsprijs apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index b48149e75..7dde9b9e0 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -355,7 +355,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -395,11 +395,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -427,7 +427,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -491,7 +491,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -571,7 +571,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -599,7 +599,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -623,7 +623,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -759,7 +759,7 @@ Waluty apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -771,7 +771,7 @@ ETF-y bez Krajów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -779,7 +779,7 @@ ETF-y bez Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -787,7 +787,7 @@ Czy na pewno chcesz usunąć ten profil aktywów? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -795,7 +795,7 @@ Filtruj według... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -815,7 +815,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -874,6 +874,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh Odśwież @@ -915,7 +923,7 @@ Kraj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -923,7 +931,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -935,15 +943,15 @@ Sektory apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -955,15 +963,15 @@ Kraje apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -971,7 +979,15 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -987,7 +1003,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -995,7 +1011,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1022,6 +1038,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Dodaj Ręcznie @@ -1050,6 +1074,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? Czy naprawdę chcesz usunąć ten kupon? @@ -1187,11 +1219,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1207,7 +1239,7 @@ Profil zasobu został zapisany apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1215,7 +1247,7 @@ Czy naprawdę chcesz usunąć tę platformę? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1247,7 +1279,7 @@ Obecny rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1295,7 +1327,7 @@ Czy naprawdę chcesz usunąć ten tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -1319,7 +1351,7 @@ Czy na pewno chcesz usunąć tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1335,7 +1367,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1387,11 +1419,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1415,15 +1447,15 @@ Portfel apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1439,11 +1471,11 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1459,7 +1491,7 @@ O Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1471,11 +1503,11 @@ Zaloguj się apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1495,11 +1527,11 @@ Ups! Nieprawidłowy token bezpieczeństwa. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1519,7 +1551,7 @@ Zagrożenie apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1527,7 +1559,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1535,7 +1567,7 @@ Zachłanność apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1543,7 +1575,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1643,7 +1675,7 @@ Obecny tydzień apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1762,6 +1794,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Pozostań zalogowany @@ -1923,7 +1963,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1931,7 +1971,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -2079,7 +2119,7 @@ Ulepsz Plan apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2119,7 +2159,7 @@ Liczony od początku roku (year-to-date) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -2131,7 +2171,7 @@ 1 rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -2143,7 +2183,7 @@ 5 lat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2163,7 +2203,7 @@ Maksimum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2210,6 +2250,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Kupon został zrealizowany @@ -2282,6 +2330,14 @@ 279 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Widok Prezentera @@ -2319,7 +2375,7 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2447,7 +2503,7 @@ Ta funkcja jest obecnie niedostępna. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2455,15 +2511,15 @@ Spróbuj ponownie później. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2471,11 +2527,11 @@ Ups! Coś poszło nie tak. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2487,11 +2543,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2503,11 +2559,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -2611,15 +2667,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2643,7 +2699,7 @@ Ups, transfer salda nie powiódł się. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2699,11 +2755,11 @@ Panel Administratora apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -2715,7 +2771,7 @@ Dane Rynkowe apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -2767,7 +2823,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2907,11 +2963,11 @@ Nie udało się przetworzyć konfiguracji scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -2967,7 +3023,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -3087,7 +3143,7 @@ Rozpocznij apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3159,7 +3215,7 @@ Rynki apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -3167,7 +3223,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3330,6 +3386,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Korzystaj z Ghostfolio anonimowo i zachowaj pełną kontrolę nad swoimi danymi finansowymi. @@ -3675,7 +3739,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3787,7 +3851,7 @@ Importuj Aktywności apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3803,7 +3867,7 @@ Impotruj Dywidendy apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3819,7 +3883,7 @@ Importowanie danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3827,7 +3891,7 @@ Importowanie zakończone apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3843,7 +3907,7 @@ Weryfikacja danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4027,7 +4091,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4143,11 +4207,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4171,7 +4235,7 @@ Miesięcznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4179,7 +4243,7 @@ Rocznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -4195,7 +4259,7 @@ Największy spadek apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4203,7 +4267,7 @@ Rozwój portfela apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4211,7 +4275,7 @@ Oś czasu inwestycji apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4219,7 +4283,7 @@ Obecna passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4227,7 +4291,7 @@ Najdłuższa passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4235,7 +4299,7 @@ Oś czasu dywidend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4263,15 +4327,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -4435,7 +4499,7 @@ Odnów Plan apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4459,11 +4523,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -4822,10 +4886,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -4836,7 +4896,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4848,11 +4908,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -4900,7 +4960,7 @@ Moje Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -5012,7 +5072,7 @@ Ostatni Najwyższy Punkt w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5020,7 +5080,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5036,7 +5096,7 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -5044,7 +5104,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5104,7 +5164,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5124,7 +5184,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5140,7 +5200,7 @@ Pokaż wszystko libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5156,7 +5216,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5168,7 +5228,7 @@ Azja-Pacyfik libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5184,7 +5244,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5196,11 +5256,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -5216,7 +5276,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5228,7 +5288,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5236,7 +5296,7 @@ Główny libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5244,7 +5304,7 @@ Przełącz się z łatwością na Ghostfolio Premium lub Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5252,7 +5312,7 @@ Przełącz się z łatwością na Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5268,7 +5328,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5276,7 +5336,7 @@ Dotacja libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5284,7 +5344,7 @@ Wyższe Ryzyko libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5292,15 +5352,7 @@ Ta działalność już istnieje. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - Japonia - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5308,7 +5360,7 @@ Niższe Ryzyko libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5316,7 +5368,7 @@ Miesiąc libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5324,7 +5376,7 @@ Miesiące libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5332,11 +5384,15 @@ Inne libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -5344,7 +5400,7 @@ Wstępnie ustawione libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5352,7 +5408,7 @@ Brak transakcji apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5360,7 +5416,7 @@ Świadczenia Emerytalne libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5376,7 +5432,7 @@ Satelita libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5400,11 +5456,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5412,11 +5468,11 @@ Tag libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -5424,7 +5480,7 @@ Rok libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5444,7 +5500,7 @@ Lata libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5464,7 +5520,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5480,7 +5536,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5488,7 +5544,7 @@ Kosztowności libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5496,7 +5552,7 @@ Zobowiązanie libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5508,7 +5564,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5520,7 +5576,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5528,7 +5584,7 @@ Towar libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5540,7 +5596,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5548,7 +5604,7 @@ Stały Dochód libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5556,7 +5612,11 @@ Nieruchomość libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5572,7 +5632,7 @@ Obligacja libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5580,7 +5640,7 @@ Kryptowaluta libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5588,7 +5648,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5596,7 +5656,7 @@ Fundusz Wzajemny libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5604,7 +5664,7 @@ Metal Szlachetny libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5612,7 +5672,7 @@ Prywatny Kapitał libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5620,7 +5680,7 @@ Akcje libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5628,7 +5688,7 @@ Afryka libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5636,7 +5696,15 @@ Azja libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5644,7 +5712,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5652,7 +5720,7 @@ Ameryka Północna libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5668,7 +5736,7 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5676,7 +5744,7 @@ Ameryka Południowa libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5684,7 +5752,7 @@ Skrajny Strach libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5692,7 +5760,7 @@ Skrajna Zachłanność libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5700,7 +5768,7 @@ Neutralny libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5736,15 +5804,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5756,7 +5824,7 @@ 50-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5832,7 @@ 200-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5840,7 @@ Salda Gotówkowe apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5808,7 +5876,7 @@ Obecna cena rynkowa wynosi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5816,7 +5884,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5856,15 +5924,7 @@ Ups! Nie udało się przyznać dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentyna - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5888,7 +5948,7 @@ Dane rynkowe są opóźnione o apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,11 +5964,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5928,7 +5988,7 @@ Zamknij pozycję apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5976,7 +6036,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5996,7 +6056,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6044,7 +6104,7 @@ rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6064,7 +6124,7 @@ lata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6084,7 +6144,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6149,7 +6209,7 @@ Ups! Wygląda na to, że wykonujesz zbyt wiele zapytań. Proszę, zwolnij trochę. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6176,14 +6236,6 @@ 62 - - Indonesia - Indonezja - - libs/ui/src/lib/i18n.ts - 90 - - Activity Aktywność @@ -6221,7 +6273,7 @@ To działanie jest niedozwolone. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6281,7 @@ Płynność środków finansowych libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6297,7 @@ Kupno i Sprzedaż libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6325,7 +6377,7 @@ Uwzględnij w apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6349,7 +6401,7 @@ Punkty Odniesienia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6365,7 +6417,7 @@ Czy na pewno chcesz usunąć te profile? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6373,7 +6425,7 @@ Ups! Nie udało się usunąć profili. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6572,38 +6624,6 @@ 100 - - Australia - Australia - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Austria - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Belgia - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bułgaria - - libs/ui/src/lib/i18n.ts - 83 - - View Holding Podgląd inwestycji @@ -6612,124 +6632,12 @@ 474 - - Canada - Kanada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Czechy - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finlandia - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Francja - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Niemcy - - libs/ui/src/lib/i18n.ts - 88 - - - - India - Indie - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Włochy - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Holandia - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Nowa Zelandia - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polska - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Rumunia - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Południowa Afryka - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Tajlandia - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Stany Zjednoczone - - libs/ui/src/lib/i18n.ts - 103 - - Error Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6661,7 @@ Ups! Nie udało się zaktualizować dostępu. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6781,7 +6689,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6733,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6741,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6873,7 +6781,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6797,7 @@ Tak libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7040,6 +6948,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year aby skorzystać z naszego linku polecającego i otrzymać roczną subskrypcję Ghostfolio Premium @@ -7157,15 +7073,7 @@ Uzyskaj dostęp do ponad 80 000 pasków notowań giełdowych z ponad 50 giełd libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ukraina - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7371,7 +7279,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,11 +7327,11 @@ Ja apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7463,7 +7371,7 @@ Prompt AI został skopiowany do schowka apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Otwórz Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Zmiana libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Armenia - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Brytyjskie Wyspy Dziewicze - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapur - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Zasady i Warunki użytkownia @@ -7691,11 +7575,11 @@ Token bezpieczeństwa apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Czy napewno chcesz wygenerować nowy token bezpieczeństwa dla tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - Wielka Brytania - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Warunki świadczenia usług @@ -7768,7 +7644,7 @@ () jest już w użyciu. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ Wystąpił błąd podczas aktualizacji do (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ ktoś apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Czy na pewno chcesz usunąć ten element? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Wyloguj się apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Bieżący miesiąc apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Czy na pewno chcesz wygenerować nowy token bezpieczeństwa? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Zarządzaj profilem aktywów apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Inwestycja alternatywna libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Kolekcjonerskie libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Średnia cena jednostkowa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 2588a73ab..65494b458 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -118,7 +118,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -158,11 +158,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -190,7 +190,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -270,7 +270,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -350,7 +350,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -382,7 +382,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -458,7 +458,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -542,7 +542,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -562,7 +562,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -710,7 +710,7 @@ Deseja realmente excluir este utilizador? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -726,7 +726,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -762,11 +762,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -782,15 +782,15 @@ Portefólio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -806,11 +806,11 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -826,7 +826,7 @@ Sobre o Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -838,11 +838,11 @@ Iniciar sessão apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -862,11 +862,11 @@ Oops! Token de Segurança Incorreto. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -886,7 +886,7 @@ Medo apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -894,7 +894,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -902,7 +902,7 @@ Ganância apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -910,7 +910,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1045,6 +1045,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Manter sessão iniciada @@ -1174,7 +1182,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1194,7 +1202,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -1202,7 +1210,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1214,15 +1222,15 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -1234,15 +1242,15 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1266,7 +1274,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1278,7 +1286,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1294,7 +1302,7 @@ Mostrar tudo libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1314,7 +1322,7 @@ AATD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1326,7 +1334,7 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1338,7 +1346,7 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -1358,7 +1366,7 @@ Máx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -1370,7 +1378,7 @@ Esta funcionalidade está atualmente indisponível. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -1378,15 +1386,15 @@ Por favor tente novamente mais tarde. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -1394,11 +1402,11 @@ Oops! Ocorreu um erro. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -1410,11 +1418,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -1426,11 +1434,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -1462,7 +1470,7 @@ O meu Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -1497,6 +1505,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Código de cupão foi resgatado @@ -1557,6 +1573,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista do Apresentador @@ -1598,7 +1622,7 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1718,15 +1742,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1774,11 +1798,11 @@ Controlo Administrativo apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -1942,7 +1966,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1970,7 +1994,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1998,7 +2022,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -2006,7 +2030,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -2074,7 +2098,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2106,7 +2130,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2130,7 +2154,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -2153,6 +2177,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Unit Price Preço por Unidade @@ -2170,7 +2202,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2186,7 +2218,7 @@ A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2194,7 +2226,7 @@ A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2326,7 +2358,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2390,7 +2422,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2406,7 +2438,7 @@ Fundo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -2414,7 +2446,7 @@ Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2422,7 +2454,7 @@ Cronograma de Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -2478,15 +2510,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -2538,7 +2570,7 @@ Começar apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -2626,11 +2658,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -2678,7 +2710,7 @@ Importar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -2742,7 +2774,7 @@ Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2758,7 +2790,7 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -2794,7 +2826,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2818,7 +2850,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2838,7 +2870,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2850,11 +2882,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2870,7 +2902,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -2878,11 +2910,15 @@ Outro libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -2906,11 +2942,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2918,11 +2954,11 @@ Marcador libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -2934,7 +2970,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2942,7 +2978,7 @@ Matéria-prima libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2954,7 +2990,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2962,7 +2998,7 @@ Rendimento Fixo libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2970,7 +3006,11 @@ Imobiliário libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2986,7 +3026,7 @@ Obrigação libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2994,7 +3034,7 @@ Criptomoedas libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3002,7 +3042,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3010,7 +3050,7 @@ Fundo de Investimento libs/ui/src/lib/i18n.ts - 59 + 61 @@ -3018,7 +3058,7 @@ Metal Precioso libs/ui/src/lib/i18n.ts - 60 + 62 @@ -3026,7 +3066,7 @@ Private Equity libs/ui/src/lib/i18n.ts - 61 + 63 @@ -3034,7 +3074,7 @@ Ação libs/ui/src/lib/i18n.ts - 62 + 64 @@ -3042,7 +3082,7 @@ África libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3050,7 +3090,15 @@ Ásia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3058,7 +3106,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3066,7 +3114,7 @@ América do Norte libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3082,7 +3130,7 @@ Oceânia libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3090,7 +3138,7 @@ América do Sul libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3114,15 +3162,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3150,7 +3198,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 @@ -3166,7 +3214,7 @@ Dados de Mercado apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3190,7 +3238,7 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3242,11 +3290,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3254,7 +3302,7 @@ Cronograma de Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3270,7 +3318,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3282,7 +3330,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3310,7 +3358,7 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3318,7 +3366,7 @@ Importar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3346,7 +3394,7 @@ Núcleo libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3354,7 +3402,7 @@ Conceder libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3362,7 +3410,7 @@ Risco mais Elevado libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3370,7 +3418,7 @@ Risco menos Elevado libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3378,7 +3426,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3386,7 +3434,7 @@ Provisão de Reforma libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3402,7 +3450,7 @@ Satélite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3526,7 +3574,7 @@ Atualizar Plano apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -3654,11 +3702,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -3726,7 +3774,7 @@ Mude para o Ghostfolio Premium facilmente libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3750,7 +3798,7 @@ Mude para o Ghostfolio Premium ou Ghostfolio Open Source facilmente libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3758,7 +3806,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3802,7 +3850,7 @@ Renovar Plano apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3882,7 +3930,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3898,11 +3946,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3918,7 +3966,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -3926,7 +3974,7 @@ Deseja mesmo eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -3998,7 +4046,7 @@ Essa atividade já existe. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4062,7 +4110,7 @@ Série Atual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4070,7 +4118,7 @@ Série mais Longa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4078,7 +4126,7 @@ Meses libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4086,7 +4134,7 @@ Anos libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4094,7 +4142,7 @@ Mês libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4102,7 +4150,7 @@ Ano libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4262,7 +4310,15 @@ Responsabilidade libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4278,7 +4334,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -4506,7 +4562,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4514,7 +4570,7 @@ De valor libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4522,7 +4578,7 @@ ETFs sem países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4530,7 +4586,7 @@ ETFs sem setores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4546,7 +4602,7 @@ Predefinição libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4562,15 +4618,7 @@ Ásia-Pacífico libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japão - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4766,7 +4814,7 @@ Moedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -4818,11 +4866,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -4913,6 +4961,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Use o Ghostfolio anonimamente e possua seus dados financeiros. @@ -5378,10 +5434,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5392,7 +5444,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5492,7 +5544,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5568,7 @@ Você realmente deseja excluir esta tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5624,7 +5676,7 @@ Você realmente deseja excluir este perfil de ativo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5635,6 +5687,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Adicionar manualmente @@ -5664,7 +5724,7 @@ Última alta de todos os tempos libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5708,7 +5768,7 @@ Ops, a transferência do saldo em dinheiro falhou. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5776,7 @@ Medo Extremo libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5784,7 @@ Ganância Extrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5792,7 @@ Neutro libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5803,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? Você realmente deseja excluir esta mensagem do sistema? @@ -5756,7 +5824,7 @@ Tendência de 50 dias libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5832,7 @@ Tendência de 200 dias libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5840,7 @@ Saldos de caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5808,7 +5876,7 @@ O preço de mercado atual é apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5816,7 +5884,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5856,15 +5924,7 @@ Ops! Não foi possível conceder acesso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5888,7 +5948,7 @@ Dados de mercado estão atrasados para apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,11 +5964,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5928,7 +5988,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5976,7 +6036,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5996,7 +6056,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6044,7 +6104,7 @@ ano apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6064,7 +6124,7 @@ anos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6084,7 +6144,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6149,7 +6209,7 @@ Ops! Parece que você está fazendo muitas solicitações. Por favor, diminua um pouco a velocidade. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6176,14 +6236,6 @@ 62 - - Indonesia - Indonésia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Atividade @@ -6221,7 +6273,7 @@ Esta ação não é permitida. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6281,7 @@ Liquidez libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6297,7 @@ Compre e venda libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6325,7 +6377,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6349,7 +6401,7 @@ Referências apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6365,7 +6417,7 @@ Você realmente deseja excluir esses perfis? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6373,7 +6425,7 @@ Ops! Não foi possível excluir perfis. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6572,38 +6624,6 @@ 100 - - Australia - Austrália - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Áustria - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Bélgica - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgária - - libs/ui/src/lib/i18n.ts - 83 - - View Holding View Holding @@ -6612,124 +6632,12 @@ 474 - - Canada - Canadá - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - República Tcheca - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finlândia - - libs/ui/src/lib/i18n.ts - 86 - - - - France - França - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Alemanha - - libs/ui/src/lib/i18n.ts - 88 - - - - India - Índia - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Itália - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Holanda - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Nova Zelândia - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polônia - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Romênia - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - África do Sul - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Tailândia - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Estados Unidos - - libs/ui/src/lib/i18n.ts - 103 - - Error Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6661,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6781,7 +6689,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6733,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6741,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6873,7 +6781,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6797,7 @@ Sim libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7040,6 +6948,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -7157,15 +7073,7 @@ Tenha acesso a mais de 80’000 tickers de mais de 50 bolsas libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ucrânia - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7371,7 +7279,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,11 +7327,11 @@ Me apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7463,7 +7371,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Mudar libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Armenia - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - British Virgin Islands - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapore - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Termos e Condições @@ -7691,11 +7575,11 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Termos de Serviço @@ -7768,7 +7644,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ someone apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Gerenciar perfil de ativos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Investimento Alternativo libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Colecionável libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Preço médio unitário apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index faae6b7e3..5935a0e0e 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -315,7 +315,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -355,11 +355,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -387,7 +387,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -451,7 +451,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -531,7 +531,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -563,7 +563,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -639,7 +639,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -723,7 +723,7 @@ Para Birimleri apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -735,7 +735,7 @@ Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -743,7 +743,7 @@ Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -751,7 +751,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -771,7 +771,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -847,7 +847,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -855,7 +855,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -867,15 +867,15 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -887,15 +887,15 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -903,7 +903,15 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -919,7 +927,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -927,7 +935,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -966,6 +974,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? Bu kuponu gerçekten silmek istiyor musunuz? @@ -1103,11 +1119,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1123,7 +1139,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1131,7 +1147,7 @@ Bu platformu silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1163,7 +1179,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1187,7 +1203,7 @@ Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1203,7 +1219,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1255,11 +1271,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1283,15 +1299,15 @@ Portföy apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1307,11 +1323,11 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1327,7 +1343,7 @@ Ghostfolio Hakkında apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1339,11 +1355,11 @@ Giriş apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1363,11 +1379,11 @@ Hay Allah! Güvenlik anahtarı yanlış. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1387,7 +1403,7 @@ Korku apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1395,7 +1411,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1403,7 +1419,7 @@ Açgözlülük apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1411,7 +1427,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1511,7 +1527,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1630,6 +1646,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Oturumu açık tut @@ -1779,7 +1803,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1799,7 +1823,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1947,7 +1971,7 @@ Üyeliğinizi Yükseltin apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -1987,7 +2011,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1999,7 +2023,7 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -2011,7 +2035,7 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2031,7 +2055,7 @@ Maks. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2043,7 +2067,7 @@ Bu özellik şu an için mevcut değil. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2051,15 +2075,15 @@ Daha sonra tekrar deneyiniz. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2067,11 +2091,11 @@ Hay Allah! Bir şeyler yanlış gitti. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2083,11 +2107,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2099,11 +2123,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -2207,15 +2231,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2263,11 +2287,11 @@ Yönetici Denetimleri apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -2279,7 +2303,7 @@ Piyasa Verileri apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -2331,7 +2355,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2471,11 +2495,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -2531,7 +2555,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -2663,7 +2687,7 @@ Başla apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -2735,7 +2759,7 @@ Piyasalar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -2743,7 +2767,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -2882,6 +2906,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Ghostfolio’yu anonim olarak kullanın ve finansal verilerinize sahip çıkın. @@ -3175,7 +3207,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3263,7 +3295,7 @@ İşlemleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3279,7 +3311,7 @@ Temettüleri İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3295,7 +3327,7 @@ Veri içe aktarılıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3303,7 +3335,7 @@ İçe aktarma tamamlandı apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3319,7 +3351,7 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3511,7 +3543,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -3627,11 +3659,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3655,7 +3687,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -3663,7 +3695,7 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3679,7 +3711,7 @@ Alt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -3687,7 +3719,7 @@ Portföyün Gelişimi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -3695,7 +3727,7 @@ Yatırım Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -3703,7 +3735,7 @@ Güncel Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -3711,7 +3743,7 @@ En Uzun Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -3719,7 +3751,7 @@ Temettü Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3747,15 +3779,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -3919,7 +3951,7 @@ Aboneliği Yenile apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -3943,11 +3975,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -4306,10 +4338,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -4320,7 +4348,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4332,11 +4360,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -4368,7 +4396,7 @@ Benim Ghostfolio’m apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -4403,6 +4431,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Kupon kodu kullanıldı @@ -4475,6 +4511,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Sunum Görünümü @@ -4512,7 +4556,7 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -4716,7 +4760,7 @@ Tüm Zamanların En Yüksek Seviyesinden (ATH) Değişim libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -4732,7 +4776,7 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -4740,7 +4784,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -4800,7 +4844,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -4820,7 +4864,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4836,7 +4880,7 @@ Tümünü göster libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -4852,7 +4896,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -4864,7 +4908,7 @@ Asya Pasifik libs/ui/src/lib/i18n.ts - 5 + 7 @@ -4880,7 +4924,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4892,11 +4936,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -4912,7 +4956,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4924,7 +4968,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -4932,7 +4976,7 @@ Temel libs/ui/src/lib/i18n.ts - 10 + 12 @@ -4940,7 +4984,7 @@ Ghostfolio Premium veya Ghostfolio Open Source’a kolayca geçin libs/ui/src/lib/i18n.ts - 12 + 14 @@ -4948,7 +4992,7 @@ Ghostfolio Premium’a kolayca geçin libs/ui/src/lib/i18n.ts - 13 + 15 @@ -4964,7 +5008,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -4972,7 +5016,7 @@ Hibe libs/ui/src/lib/i18n.ts - 18 + 20 @@ -4980,7 +5024,7 @@ Daha Yüksek Risk libs/ui/src/lib/i18n.ts - 19 + 21 @@ -4988,15 +5032,7 @@ Bu işlem zaten mevcut. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - Japonya - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5004,7 +5040,7 @@ Daha Düşük Risk libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5012,7 +5048,7 @@ Ay libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5020,7 +5056,7 @@ Ay libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5028,11 +5064,15 @@ Diğer libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -5040,7 +5080,7 @@ Önceden Ayarlanmış libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5048,7 +5088,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5056,7 +5096,7 @@ Yaşlılık Provizyonu libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5072,7 +5112,7 @@ Uydu libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5096,11 +5136,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5108,11 +5148,11 @@ Etiket libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -5120,7 +5160,7 @@ Yıl libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5140,7 +5180,7 @@ Yıl libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5160,7 +5200,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5168,7 +5208,7 @@ Kıymet libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5176,7 +5216,7 @@ Yükümlülük libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5188,7 +5228,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5200,7 +5240,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5208,7 +5248,7 @@ Emtia libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5220,7 +5260,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5228,7 +5268,7 @@ Sabit Gelir libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5236,7 +5276,11 @@ Gayrimenkul libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5252,7 +5296,7 @@ Bono libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5260,7 +5304,7 @@ Kriptopara libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5268,7 +5312,7 @@ Borsada İşlem Gören Fonlar (ETF) libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5276,7 +5320,7 @@ Borsada İşlem Görmeyen Fonlar (Mutual Fund) libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5284,7 +5328,7 @@ Kıymetli Metaller libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5292,7 +5336,7 @@ Özel Menkul Kıymetler libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5300,7 +5344,7 @@ Hisse Senetleri libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5308,7 +5352,7 @@ Afrika libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5316,7 +5360,15 @@ Asya libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5324,7 +5376,7 @@ Avrupa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5332,7 +5384,7 @@ Kuzey Amerika libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5348,7 +5400,7 @@ Okyanusya libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5356,7 +5408,7 @@ Güney Amerika libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5380,15 +5432,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5500,7 +5552,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5568,7 @@ Bu etiketi silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -5624,7 +5676,7 @@ Bu varlık profilini silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -5635,6 +5687,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Elle Giriş @@ -5664,7 +5724,7 @@ Son, ATH libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5708,7 +5768,7 @@ Hay Allah, Nakit bakiyesi tranferi başarısız oldu. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5776,7 @@ Aşırı Korku libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5784,7 @@ Aşırı Açgözlülük libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5792,7 @@ Nötr libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5803,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Do you really want to delete this system message? Bu sistem mesajını silmeyi gerçekten istiyor musunuz? @@ -5756,7 +5824,7 @@ 50 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5832,7 @@ 200 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5840,7 @@ Nakit Bakiyeleri apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5808,7 +5876,7 @@ Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5816,7 +5884,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5856,15 +5924,7 @@ Hay Allah! Erişim izni verilemedi. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5888,7 +5948,7 @@ Piyasa verileri gecikmeli apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,11 +5964,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5928,7 +5988,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5976,7 +6036,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5996,7 +6056,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6044,7 +6104,7 @@ Yıl apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6064,7 +6124,7 @@ Yıllar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6084,7 +6144,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6149,7 +6209,7 @@ Oops! Görünüşe göre çok fazla istekte bulunuyorsunuz. Lütfen biraz yavaşlayın. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6176,14 +6236,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Etkinlik @@ -6221,7 +6273,7 @@ Bu işlem izin verilmiyor. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6281,7 @@ Likidite libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6297,7 @@ Satın ve satın libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6325,7 +6377,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6349,7 +6401,7 @@ Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6365,7 +6417,7 @@ Bu profilleri silmek istediğinize emin misiniz? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6373,7 +6425,7 @@ Oops! Profilleri silmek mümkün olmadı. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6572,38 +6624,6 @@ 100 - - Australia - Avustralya - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Avusturya - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Belçika - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Bulgaristan - - libs/ui/src/lib/i18n.ts - 83 - - View Holding View Holding @@ -6612,124 +6632,12 @@ 474 - - Canada - Kanada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Çek Cumhuriyeti - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Finlandiya - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Fransa - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Almanya - - libs/ui/src/lib/i18n.ts - 88 - - - - India - Hindistan - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - İtalya - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - Hollanda - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Yeni Zelanda - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Polonya - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Romanya - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Güney Afrika - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Tayland - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - Amerika Birleşik Devletleri - - libs/ui/src/lib/i18n.ts - 103 - - Error Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6661,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6781,7 +6689,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6733,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6741,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6873,7 +6781,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6797,7 @@ Evet libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7040,6 +6948,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -7157,15 +7073,7 @@ 80’000+ sembolden 50’den fazla borsada erişim alın libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - Ukraine - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7371,7 +7279,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,11 +7327,11 @@ Ben apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7463,7 +7371,7 @@ Yapay zeka istemi panoya kopyalandı apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Duck.ai’yi aç apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Değişim libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Ermenistan - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - Britanya Virjin Adaları - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Singapur - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Hükümler ve Koşullar @@ -7691,11 +7575,11 @@ Güvenlik belirteci apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - Birleşik Krallık - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Hükümler ve Koşullar @@ -7768,7 +7644,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ birisi apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Bu öğeyi silmek istediğinize emin misiniz? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Oturumu kapat apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Collectible libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 94dc7e52a..551a3e9dc 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -10,7 +10,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -34,11 +34,11 @@ Увійти apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -419,7 +419,7 @@ Баланс готівки apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -443,7 +443,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -483,11 +483,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -515,7 +515,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -579,7 +579,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -659,7 +659,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -711,7 +711,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -743,7 +743,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -843,7 +843,7 @@ Порівняльні показники apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -851,7 +851,7 @@ Валюти apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -863,7 +863,7 @@ ETF без країн apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -871,7 +871,7 @@ ETF без секторів apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -879,7 +879,7 @@ Фільтрувати за... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -915,7 +915,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -979,7 +979,7 @@ Ви дійсно хочете видалити цей профіль активу? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -987,7 +987,7 @@ Упс! Не вдалося видалити профілі. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -995,7 +995,7 @@ Ви дійсно хочете видалити ці профілі? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -1003,7 +1003,7 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -1011,7 +1011,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -1039,7 +1039,7 @@ Країна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -1047,7 +1047,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1059,15 +1059,15 @@ Сектори apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -1079,15 +1079,15 @@ Країни apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -1095,7 +1095,15 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -1111,7 +1119,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -1119,7 +1127,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -1127,11 +1135,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1147,7 +1155,7 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1155,7 +1163,7 @@ Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1182,6 +1190,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Додати вручну @@ -1218,6 +1234,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Oops! Invalid currency. Упс! Невірна валюта. @@ -1295,7 +1319,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1375,7 +1399,7 @@ Ви дійсно хочете видалити цю платформу? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1407,7 +1431,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1575,7 +1599,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1591,7 +1615,7 @@ Ви дійсно хочете видалити цей тег? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -1615,7 +1639,7 @@ Ви дійсно хочете видалити цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1671,11 +1695,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1699,15 +1723,15 @@ Портфель apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1723,11 +1747,11 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1743,7 +1767,7 @@ Оновити план apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -1771,7 +1795,7 @@ Поновити план apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -1787,7 +1811,7 @@ Про Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1799,11 +1823,11 @@ Упс! Неправильний Секретний Токен. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1867,7 +1891,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1890,14 +1914,6 @@ 92 - - Indonesia - Індонезія - - libs/ui/src/lib/i18n.ts - 90 - - Activity Активність @@ -1911,7 +1927,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1959,7 +1975,7 @@ Страх apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1967,7 +1983,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1975,7 +1991,7 @@ Жадібність apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1983,7 +1999,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2083,7 +2099,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2158,6 +2174,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Залишатися в системі @@ -2179,7 +2203,7 @@ Ринкові дані затримуються для apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -2295,7 +2319,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2407,7 +2431,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -2575,7 +2599,7 @@ З початку року apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -2587,7 +2611,7 @@ 1 рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -2599,7 +2623,7 @@ 5 років apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2619,7 +2643,7 @@ Максимум apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2631,15 +2655,7 @@ Упс! Не вдалося надати доступ. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - Аргентина - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -2687,11 +2703,11 @@ Я apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -2735,11 +2751,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2774,6 +2790,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Код купона був обміняний @@ -2875,7 +2899,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -2886,6 +2910,14 @@ 328 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Режим доповідача @@ -2931,7 +2963,7 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -3059,7 +3091,7 @@ Ця функція наразі недоступна. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -3067,15 +3099,15 @@ Спробуйте ще раз пізніше. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -3083,7 +3115,7 @@ Ця дія заборонена. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -3091,11 +3123,11 @@ Упс! Щось пішло не так. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -3103,7 +3135,7 @@ Упс! Здається, ви робите занадто багато запитів. Будь ласка, пригальмуй трохи. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -3115,11 +3147,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -3223,15 +3255,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3255,7 +3287,7 @@ Упс, перенесення балансу готівки не вдалося. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -3311,11 +3343,11 @@ Управління адміністратором apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -3335,7 +3367,7 @@ Ринкові дані apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -3387,7 +3419,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3535,11 +3567,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -3740,7 +3772,7 @@ Почати apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3812,7 +3844,7 @@ Ринки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -3820,7 +3852,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3991,6 +4023,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Використовуйте Ghostfolio анонімно та володійте своїми фінансовими даними. @@ -4344,7 +4384,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -4476,7 +4516,7 @@ Імпортувати активності apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4492,7 +4532,7 @@ Імпорт дивідендів apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -4508,7 +4548,7 @@ Імпортуються дані... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -4516,7 +4556,7 @@ Імпорт завершено apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -4532,7 +4572,7 @@ Перевірка даних... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4732,7 +4772,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4864,11 +4904,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4884,11 +4924,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -4908,7 +4948,7 @@ Щомісячно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4916,7 +4956,7 @@ Щорічно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -4924,7 +4964,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -4972,7 +5012,7 @@ Низ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4980,7 +5020,7 @@ Еволюція портфеля apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4988,7 +5028,7 @@ Інвестиційний графік apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4996,7 +5036,7 @@ Поточна серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -5004,7 +5044,7 @@ Найдовша серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -5012,7 +5052,7 @@ Графік дивідендів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -5080,15 +5120,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -5260,11 +5300,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -5497,10 +5537,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -5511,7 +5547,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5898,6 +5934,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year to use our referral link and get a Ghostfolio Premium membership for one year @@ -6055,11 +6099,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -6107,7 +6151,7 @@ Мій Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -6231,7 +6275,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -6251,7 +6295,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6271,7 +6315,7 @@ рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6291,7 +6335,7 @@ роки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6339,7 +6383,7 @@ Тренд на 50 днів libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -6347,7 +6391,7 @@ Тренд на 200 днів libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -6363,7 +6407,7 @@ Останній рекордний максимум libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -6371,7 +6415,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -6387,7 +6431,7 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -6395,7 +6439,7 @@ Позика libs/ui/src/lib/i18n.ts - 58 + 60 @@ -6471,7 +6515,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -6498,6 +6542,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Allocation Розподіл @@ -6507,7 +6559,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6523,7 +6575,7 @@ Показати все libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -6539,7 +6591,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -6551,7 +6603,7 @@ Азія-Тихоокеанський регіон libs/ui/src/lib/i18n.ts - 5 + 7 @@ -6567,7 +6619,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6579,11 +6631,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -6599,7 +6651,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6611,7 +6663,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -6619,7 +6671,7 @@ Купівля та продаж libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6631,7 +6683,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6675,7 +6727,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6683,7 +6735,7 @@ Ядро libs/ui/src/lib/i18n.ts - 10 + 12 @@ -6691,7 +6743,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6731,7 +6783,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6739,7 +6791,7 @@ Переключитися на Ghostfolio Premium або Ghostfolio з відкритим вихідним кодом легко libs/ui/src/lib/i18n.ts - 12 + 14 @@ -6747,7 +6799,7 @@ Переключитися на Ghostfolio Premium легко libs/ui/src/lib/i18n.ts - 13 + 15 @@ -6763,7 +6815,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -6771,7 +6823,7 @@ Грант libs/ui/src/lib/i18n.ts - 18 + 20 @@ -6779,7 +6831,7 @@ Вищий ризик libs/ui/src/lib/i18n.ts - 19 + 21 @@ -6787,7 +6839,7 @@ Така активність вже існує. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -6795,7 +6847,7 @@ Нижчий ризик libs/ui/src/lib/i18n.ts - 21 + 23 @@ -6803,7 +6855,7 @@ Місяць libs/ui/src/lib/i18n.ts - 22 + 24 @@ -6811,7 +6863,7 @@ Місяців libs/ui/src/lib/i18n.ts - 23 + 25 @@ -6819,11 +6871,15 @@ Інші libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -6831,7 +6887,7 @@ Отримайте доступ до 80 000+ тікерів з понад 50 бірж libs/ui/src/lib/i18n.ts - 25 + 27 @@ -6839,7 +6895,7 @@ Пресет libs/ui/src/lib/i18n.ts - 26 + 28 @@ -6847,7 +6903,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -6855,7 +6911,7 @@ Пенсійне накопичення libs/ui/src/lib/i18n.ts - 27 + 29 @@ -6871,7 +6927,7 @@ Супутник libs/ui/src/lib/i18n.ts - 28 + 30 @@ -6895,11 +6951,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -6907,11 +6963,11 @@ Тег libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -6919,7 +6975,7 @@ Рік libs/ui/src/lib/i18n.ts - 31 + 33 @@ -6939,7 +6995,7 @@ Роки libs/ui/src/lib/i18n.ts - 32 + 34 @@ -6955,7 +7011,7 @@ Так libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6975,7 +7031,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -6991,7 +7047,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -6999,7 +7055,7 @@ Цінний libs/ui/src/lib/i18n.ts - 42 + 44 @@ -7007,7 +7063,7 @@ Зобов’язання libs/ui/src/lib/i18n.ts - 40 + 42 @@ -7019,7 +7075,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -7031,7 +7087,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -7039,7 +7095,7 @@ Товар libs/ui/src/lib/i18n.ts - 46 + 48 @@ -7051,7 +7107,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -7059,7 +7115,7 @@ Фіксований дохід libs/ui/src/lib/i18n.ts - 48 + 50 @@ -7067,7 +7123,7 @@ Ліквідність libs/ui/src/lib/i18n.ts - 49 + 51 @@ -7075,7 +7131,11 @@ Нерухомість libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -7091,7 +7151,7 @@ Облігація libs/ui/src/lib/i18n.ts - 53 + 55 @@ -7099,7 +7159,7 @@ Криптовалюта libs/ui/src/lib/i18n.ts - 56 + 58 @@ -7107,7 +7167,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -7115,7 +7175,7 @@ Взаємний фонд libs/ui/src/lib/i18n.ts - 59 + 61 @@ -7123,7 +7183,7 @@ Дорогоцінний метал libs/ui/src/lib/i18n.ts - 60 + 62 @@ -7131,7 +7191,7 @@ Приватний капітал libs/ui/src/lib/i18n.ts - 61 + 63 @@ -7139,7 +7199,7 @@ Акція libs/ui/src/lib/i18n.ts - 62 + 64 @@ -7147,7 +7207,7 @@ Африка libs/ui/src/lib/i18n.ts - 69 + 71 @@ -7155,7 +7215,15 @@ Азія libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -7163,7 +7231,7 @@ Європа libs/ui/src/lib/i18n.ts - 71 + 73 @@ -7171,7 +7239,7 @@ Північна Америка libs/ui/src/lib/i18n.ts - 72 + 74 @@ -7187,7 +7255,7 @@ Океанія libs/ui/src/lib/i18n.ts - 73 + 75 @@ -7195,39 +7263,7 @@ Південна Америка libs/ui/src/lib/i18n.ts - 74 - - - - Australia - Австралія - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - Австрія - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - Бельгія - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - Болгарія - - libs/ui/src/lib/i18n.ts - 83 + 76 @@ -7238,140 +7274,12 @@ 474 - - Canada - Канада - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Чеська Республіка - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - Фінляндія - - libs/ui/src/lib/i18n.ts - 86 - - - - France - Франція - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - Німеччина - - libs/ui/src/lib/i18n.ts - 88 - - - - India - Індія - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - Італія - - libs/ui/src/lib/i18n.ts - 91 - - - - Japan - Японія - - libs/ui/src/lib/i18n.ts - 92 - - - - Netherlands - Нідерланди - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - Нова Зеландія - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - Польща - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - Румунія - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - Південна Африка - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - Таїланд - - libs/ui/src/lib/i18n.ts - 100 - - - - Ukraine - Україна - - libs/ui/src/lib/i18n.ts - 101 - - - - United States - Сполучені Штати - - libs/ui/src/lib/i18n.ts - 103 - - Extreme Fear Екстремальний страх libs/ui/src/lib/i18n.ts - 106 + 79 @@ -7379,7 +7287,7 @@ Екстремальна жадібність libs/ui/src/lib/i18n.ts - 107 + 80 @@ -7387,7 +7295,7 @@ Нейтрально libs/ui/src/lib/i18n.ts - 110 + 83 @@ -7427,15 +7335,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7471,7 +7379,7 @@ Запит AI скопійовано в буфер обміну apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7387,7 @@ Лінивий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7395,7 @@ Миттєвий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7403,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7503,7 +7411,7 @@ Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7511,7 +7419,7 @@ Селектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7519,7 +7427,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7527,7 +7435,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7443,7 @@ реальний час apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7451,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,7 +7467,7 @@ Змінити libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7575,11 +7483,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7622,30 +7530,6 @@ 94 - - Armenia - Вірменія - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - British Virgin Islands - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - Сінгапур - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions Terms and Conditions @@ -7691,11 +7575,11 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7703,7 +7587,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7714,14 +7598,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Terms of Service @@ -7768,7 +7644,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7776,7 +7652,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7840,7 +7716,7 @@ когось apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7748,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7756,7 @@ Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8003,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8168,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8348,7 +8224,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,7 +8232,7 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8240,7 @@ Колекційний предмет libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8248,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 4c38d4f7d..c929a6765 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -316,7 +316,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -338,7 +338,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -378,11 +378,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -408,7 +408,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -471,7 +471,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -549,7 +549,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -574,7 +574,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -597,7 +597,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -719,7 +719,7 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -730,28 +730,28 @@ ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 Do you really want to delete this asset profile? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -770,7 +770,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -837,6 +837,13 @@ 284 + + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh @@ -881,7 +888,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -889,7 +896,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -900,15 +907,15 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -919,22 +926,29 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -948,14 +962,14 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -980,6 +994,13 @@ 16 + + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually @@ -1006,6 +1027,13 @@ 119 + + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? @@ -1126,11 +1154,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1145,14 +1173,14 @@ Asset profile has been saved apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 Do you really want to delete this platform? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1180,7 +1208,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1223,7 +1251,7 @@ Do you really want to delete this tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -1244,7 +1272,7 @@ Do you really want to delete this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1259,7 +1287,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1305,11 +1333,11 @@ Could not validate form apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1330,15 +1358,15 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1353,11 +1381,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1371,7 +1399,7 @@ About Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1382,11 +1410,11 @@ Sign in apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1405,11 +1433,11 @@ Oops! Incorrect Security Token. apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1427,7 +1455,7 @@ Fear apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1435,14 +1463,14 @@ libs/ui/src/lib/i18n.ts - 108 + 81 Greed apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1450,7 +1478,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1538,7 +1566,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1650,6 +1678,13 @@ 46 + + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in @@ -1794,14 +1829,14 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 Report Data Glitch apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -1938,7 +1973,7 @@ Upgrade Plan apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -1976,7 +2011,7 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -1987,7 +2022,7 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -1998,7 +2033,7 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2016,7 +2051,7 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2058,6 +2093,13 @@ 174 + + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed @@ -2123,6 +2165,13 @@ 279 + + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View @@ -2155,7 +2204,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2269,33 +2318,33 @@ This feature is currently unavailable. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 Please try again later. apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 Oops! Something went wrong. apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2306,11 +2355,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2321,11 +2370,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -2421,15 +2470,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2452,7 +2501,7 @@ Oops, cash balance transfer has failed. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2501,11 +2550,11 @@ Admin Control apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -2516,7 +2565,7 @@ Market Data apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -2565,7 +2614,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2703,11 +2752,11 @@ Could not parse scraper configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -2758,7 +2807,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -2864,7 +2913,7 @@ Get Started apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -2933,7 +2982,7 @@ Markets apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -2941,7 +2990,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3089,6 +3138,13 @@ 149 + + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. @@ -3402,7 +3458,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3503,7 +3559,7 @@ Import Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3518,7 +3574,7 @@ Import Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3533,14 +3589,14 @@ Importing data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 Import has been completed apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3554,7 +3610,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3718,7 +3774,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -3824,11 +3880,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3849,14 +3905,14 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -3870,42 +3926,42 @@ Bottom apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 Portfolio Evolution apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 Investment Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3930,15 +3986,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -4086,7 +4142,7 @@ Renew Plan apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4108,11 +4164,11 @@ Could not save asset profile apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -4447,10 +4503,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -4460,7 +4512,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4471,11 +4523,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -4519,7 +4571,7 @@ My Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -4619,14 +4671,14 @@ 50-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 200-Day Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -4640,14 +4692,14 @@ Last All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 Change from All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -4661,14 +4713,14 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -4722,7 +4774,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -4740,7 +4792,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4755,7 +4807,7 @@ Show all libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -4770,7 +4822,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -4781,7 +4833,7 @@ Asia-Pacific libs/ui/src/lib/i18n.ts - 5 + 7 @@ -4796,7 +4848,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4808,11 +4860,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -4827,7 +4879,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4839,28 +4891,28 @@ libs/ui/src/lib/i18n.ts - 7 + 9 Core libs/ui/src/lib/i18n.ts - 10 + 12 Switch to Ghostfolio Premium or Ghostfolio Open Source easily libs/ui/src/lib/i18n.ts - 12 + 14 Switch to Ghostfolio Premium easily libs/ui/src/lib/i18n.ts - 13 + 15 @@ -4875,95 +4927,92 @@ libs/ui/src/lib/i18n.ts - 15 + 17 Grant libs/ui/src/lib/i18n.ts - 18 + 20 Higher Risk libs/ui/src/lib/i18n.ts - 19 + 21 This activity already exists. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - - libs/ui/src/lib/i18n.ts - 92 + 22 Lower Risk libs/ui/src/lib/i18n.ts - 21 + 23 Month libs/ui/src/lib/i18n.ts - 22 + 24 Months libs/ui/src/lib/i18n.ts - 23 + 25 Other libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 Preset libs/ui/src/lib/i18n.ts - 26 + 28 No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 Retirement Provision libs/ui/src/lib/i18n.ts - 27 + 29 Satellite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -4986,29 +5035,29 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 Tag libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 Year libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5026,7 +5075,7 @@ Years libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5044,7 +5093,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5059,21 +5108,21 @@ libs/ui/src/lib/i18n.ts - 38 + 40 Valuable libs/ui/src/lib/i18n.ts - 42 + 44 Liability libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5084,7 +5133,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5095,14 +5144,14 @@ libs/ui/src/lib/i18n.ts - 54 + 56 Commodity libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5113,21 +5162,25 @@ libs/ui/src/lib/i18n.ts - 47 + 49 Fixed Income libs/ui/src/lib/i18n.ts - 48 + 50 Real Estate libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5141,77 +5194,84 @@ Bond libs/ui/src/lib/i18n.ts - 53 + 55 Cryptocurrency libs/ui/src/lib/i18n.ts - 56 + 58 ETF libs/ui/src/lib/i18n.ts - 57 + 59 Mutual Fund libs/ui/src/lib/i18n.ts - 59 + 61 Precious Metal libs/ui/src/lib/i18n.ts - 60 + 62 Private Equity libs/ui/src/lib/i18n.ts - 61 + 63 Stock libs/ui/src/lib/i18n.ts - 62 + 64 Africa libs/ui/src/lib/i18n.ts - 69 + 71 Asia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + + libs/ui/src/lib/i18n.ts + 87 Europe libs/ui/src/lib/i18n.ts - 71 + 73 North America libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5225,35 +5285,35 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 South America libs/ui/src/lib/i18n.ts - 74 + 76 Extreme Fear libs/ui/src/lib/i18n.ts - 106 + 79 Extreme Greed libs/ui/src/lib/i18n.ts - 107 + 80 Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5286,15 +5346,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5319,28 +5379,21 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 Oops! Could not grant access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5383,7 +5436,7 @@ Market data is delayed for apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5397,7 +5450,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5419,11 +5472,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5476,7 +5529,7 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -5487,7 +5540,7 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -5523,7 +5576,7 @@ year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5542,7 +5595,7 @@ years apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -5583,7 +5636,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5619,7 +5672,7 @@ Oops! It looks like you’re making too many requests. Please slow down a bit. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -5643,13 +5696,6 @@ 61 - - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity @@ -5675,7 +5721,7 @@ This action is not allowed. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -5689,14 +5735,14 @@ Liquidity libs/ui/src/lib/i18n.ts - 49 + 51 Buy and sell libs/ui/src/lib/i18n.ts - 8 + 10 @@ -5773,7 +5819,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -5794,7 +5840,7 @@ Do you really want to delete these profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -5808,14 +5854,14 @@ Oops! Could not delete profiles. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -5905,41 +5951,6 @@ 86 - - Thailand - - libs/ui/src/lib/i18n.ts - 100 - - - - India - - libs/ui/src/lib/i18n.ts - 89 - - - - Austria - - libs/ui/src/lib/i18n.ts - 80 - - - - Poland - - libs/ui/src/lib/i18n.ts - 95 - - - - Italy - - libs/ui/src/lib/i18n.ts - 91 - - User Experience @@ -5982,27 +5993,6 @@ 474 - - Canada - - libs/ui/src/lib/i18n.ts - 84 - - - - New Zealand - - libs/ui/src/lib/i18n.ts - 94 - - - - Netherlands - - libs/ui/src/lib/i18n.ts - 93 - - Alternative @@ -6035,27 +6025,6 @@ 96 - - Romania - - libs/ui/src/lib/i18n.ts - 96 - - - - Germany - - libs/ui/src/lib/i18n.ts - 88 - - - - United States - - libs/ui/src/lib/i18n.ts - 103 - - Budgeting @@ -6063,13 +6032,6 @@ 85 - - Belgium - - libs/ui/src/lib/i18n.ts - 81 - - Open Source @@ -6081,34 +6043,6 @@ 91 - - Czech Republic - - libs/ui/src/lib/i18n.ts - 85 - - - - Australia - - libs/ui/src/lib/i18n.ts - 79 - - - - South Africa - - libs/ui/src/lib/i18n.ts - 98 - - - - Bulgaria - - libs/ui/src/lib/i18n.ts - 83 - - Privacy @@ -6116,25 +6050,11 @@ 94 - - Finland - - libs/ui/src/lib/i18n.ts - 86 - - - - France - - libs/ui/src/lib/i18n.ts - 87 - - Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6145,7 +6065,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6189,7 +6109,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6203,7 +6123,7 @@ Yes libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6224,7 +6144,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6264,7 +6184,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6278,7 +6198,7 @@ Oops! Could not update access. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6412,6 +6332,13 @@ 174 + + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year @@ -6506,13 +6433,6 @@ 40 - - Ukraine - - libs/ui/src/lib/i18n.ts - 101 - - Set API key @@ -6524,7 +6444,7 @@ Get access to 80’000+ tickers from over 50 exchanges libs/ui/src/lib/i18n.ts - 25 + 27 @@ -6715,7 +6635,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6776,11 +6696,11 @@ Me apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -6801,7 +6721,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -6815,63 +6735,63 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -6885,7 +6805,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -6900,11 +6820,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -6929,13 +6849,6 @@ 67 - - Singapore - - libs/ui/src/lib/i18n.ts - 97 - - Total amount @@ -6943,20 +6856,6 @@ 94 - - Armenia - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - - libs/ui/src/lib/i18n.ts - 82 - - Copy portfolio data to clipboard for AI prompt @@ -7003,18 +6902,18 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7024,13 +6923,6 @@ 239 - - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service @@ -7072,14 +6964,14 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7114,7 +7006,7 @@ someone apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7143,14 +7035,14 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -7371,7 +7263,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -7530,7 +7422,7 @@ Do you really want to generate a new security token? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -7566,28 +7458,28 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 Collectible libs/ui/src/lib/i18n.ts - 55 + 57 Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index 991b5f8b3..ba44dae95 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -340,7 +340,7 @@ 现金余额 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -364,7 +364,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 315 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,11 +404,11 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 12 + 23 libs/ui/src/lib/holdings-table/holdings-table.component.html - 23 + 28 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -436,7 +436,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 322 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -500,7 +500,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -580,7 +580,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -608,7 +608,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 454 @@ -632,7 +632,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -768,7 +768,7 @@ 货币 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 130 + 135 apps/client/src/app/pages/public/public-page.html @@ -780,7 +780,7 @@ 没有国家的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -788,7 +788,7 @@ 无行业类别的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -796,7 +796,7 @@ 您确实要删除此资产配置文件吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 @@ -804,7 +804,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -824,7 +824,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -883,6 +883,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh 刷新 @@ -924,7 +932,7 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 278 apps/client/src/app/components/admin-users/admin-users.html @@ -932,7 +940,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 281 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -944,15 +952,15 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 284 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 403 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 287 apps/client/src/app/pages/public/public-page.html @@ -964,15 +972,15 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 294 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 414 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 299 @@ -980,7 +988,15 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 392 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -996,7 +1012,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 477 @@ -1004,7 +1020,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 438 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1031,6 +1047,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually 手动添加 @@ -1059,6 +1083,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? 您确实要删除此优惠券吗? @@ -1196,11 +1228,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 425 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 556 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1216,7 +1248,7 @@ 资产概况已保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1224,7 +1256,7 @@ 您真的要删除这个平台吗? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 115 @@ -1256,7 +1288,7 @@ 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1304,7 +1336,7 @@ 您真的要删除此标签吗? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 117 @@ -1328,7 +1360,7 @@ 您真的要删除该用户吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1344,7 +1376,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1396,11 +1428,11 @@ 无法验证表单 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 594 + 600 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 597 + 603 @@ -1424,15 +1456,15 @@ 投资组合 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 143 apps/client/src/app/components/header/header.component.html - 44 + 45 apps/client/src/app/components/header/header.component.html - 257 + 261 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1448,11 +1480,11 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 384 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 155 @@ -1468,7 +1500,7 @@ 关于 Ghostfolio apps/client/src/app/components/header/header.component.html - 322 + 327 apps/client/src/app/pages/about/overview/about-overview-page.html @@ -1480,11 +1512,11 @@ 登入 apps/client/src/app/components/header/header.component.html - 421 + 426 apps/client/src/app/components/header/header.component.ts - 296 + 305 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html @@ -1504,11 +1536,11 @@ 哎呀!安全令牌不正确。 apps/client/src/app/components/header/header.component.ts - 311 + 320 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 152 + 164 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1528,7 +1560,7 @@ 恐惧 apps/client/src/app/components/home-market/home-market.component.ts - 41 + 46 apps/client/src/app/components/markets/markets.component.ts @@ -1536,7 +1568,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1544,7 +1576,7 @@ 贪婪 apps/client/src/app/components/home-market/home-market.component.ts - 42 + 47 apps/client/src/app/components/markets/markets.component.ts @@ -1552,7 +1584,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1652,7 +1684,7 @@ 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1771,6 +1803,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in 保持登录 @@ -1932,7 +1972,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1940,7 +1980,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 457 @@ -2088,7 +2128,7 @@ 升级计划 apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2128,7 +2168,7 @@ 年初至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 libs/ui/src/lib/assistant/assistant.component.ts @@ -2140,7 +2180,7 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 libs/ui/src/lib/assistant/assistant.component.ts @@ -2152,7 +2192,7 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -2172,7 +2212,7 @@ 最大限度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 221 + 224 libs/ui/src/lib/assistant/assistant.component.ts @@ -2219,6 +2259,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed 优惠券代码已被兑换 @@ -2291,6 +2339,14 @@ 279 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View 演示者视图 @@ -2328,7 +2384,7 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 515 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2456,7 +2512,7 @@ 此功能目前无法使用。 apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2464,15 +2520,15 @@ 请稍后再试。 apps/client/src/app/core/http-response.interceptor.ts - 57 + 54 apps/client/src/app/core/http-response.interceptor.ts - 88 + 85 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 191 + 192 @@ -2480,11 +2536,11 @@ 哎呀!出了些问题。 apps/client/src/app/core/http-response.interceptor.ts - 86 + 83 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 189 + 190 @@ -2496,11 +2552,11 @@ apps/client/src/app/core/http-response.interceptor.ts - 89 + 86 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 192 + 193 @@ -2512,11 +2568,11 @@ apps/client/src/app/components/header/header.component.html - 124 + 125 apps/client/src/app/components/header/header.component.html - 370 + 375 apps/client/src/app/pages/about/overview/about-overview-page.routes.ts @@ -2620,15 +2676,15 @@ apps/client/src/app/components/header/header.component.html - 58 + 59 apps/client/src/app/components/header/header.component.html - 267 + 271 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 378 + 383 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2652,7 +2708,7 @@ 糟糕,现金余额转账失败。 apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2708,11 +2764,11 @@ 管理 apps/client/src/app/components/header/header.component.html - 74 + 75 apps/client/src/app/components/header/header.component.html - 287 + 291 libs/common/src/lib/routes/routes.ts @@ -2724,7 +2780,7 @@ 市场数据 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 405 libs/common/src/lib/routes/routes.ts @@ -2776,7 +2832,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2916,11 +2972,11 @@ 无法解析抓取器配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 545 + 551 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 548 + 554 @@ -2976,7 +3032,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -3096,7 +3152,7 @@ 立即开始 apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3168,7 +3224,7 @@ 市场 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 386 apps/client/src/app/components/footer/footer.component.html @@ -3176,7 +3232,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3339,6 +3395,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. 匿名使用 Ghostfolio 并拥有您的财务数据。 @@ -3692,7 +3756,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 347 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3804,7 +3868,7 @@ 导入活动记录 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 93 + 94 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3820,7 +3884,7 @@ 导入股息 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 132 + 133 libs/ui/src/lib/activities-table/activities-table.component.html @@ -3836,7 +3900,7 @@ 正在导入数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3844,7 +3908,7 @@ 导入已完成 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3860,7 +3924,7 @@ 验证数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4044,7 +4108,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4160,11 +4224,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4188,7 +4252,7 @@ 每月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4196,7 +4260,7 @@ 每年 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 @@ -4212,7 +4276,7 @@ 底部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4220,7 +4284,7 @@ 投资组合演变 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4228,7 +4292,7 @@ 投资时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4236,7 +4300,7 @@ 当前连胜 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4244,7 +4308,7 @@ 最长连续纪录 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4252,7 +4316,7 @@ 股息时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4280,15 +4344,15 @@ apps/client/src/app/components/header/header.component.html - 105 + 106 apps/client/src/app/components/header/header.component.html - 309 + 314 apps/client/src/app/components/header/header.component.html - 384 + 389 apps/client/src/app/pages/pricing/pricing-page.routes.ts @@ -4452,7 +4516,7 @@ 更新计划 apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4476,11 +4540,11 @@ 无法保存资产概况 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 628 + 634 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 631 + 637 @@ -4851,10 +4915,6 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts 58 - - libs/ui/src/lib/i18n.ts - 99 - Global @@ -4865,7 +4925,7 @@ libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4877,11 +4937,11 @@ apps/client/src/app/components/header/header.component.html - 88 + 89 apps/client/src/app/components/header/header.component.html - 297 + 301 apps/client/src/app/pages/resources/overview/resources-overview.component.html @@ -4929,7 +4989,7 @@ 我的 Ghostfolio apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -5041,7 +5101,7 @@ 50 天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5049,7 +5109,7 @@ 200天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5065,7 +5125,7 @@ 上次历史最高纪录 libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5073,7 +5133,7 @@ 较历史最高纪录涨跌 libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5089,7 +5149,7 @@ 从 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 @@ -5097,7 +5157,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5157,7 +5217,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5177,7 +5237,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5193,7 +5253,7 @@ 显示所有 libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5209,7 +5269,7 @@ libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5221,7 +5281,7 @@ 亚太 libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5237,7 +5297,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 332 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5249,11 +5309,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -5269,7 +5329,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 348 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5281,7 +5341,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5289,7 +5349,7 @@ 核心 libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5297,7 +5357,7 @@ 轻松切换到 Ghostfolio Premium 或 Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5305,7 +5365,7 @@ 轻松切换到 Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5321,7 +5381,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5329,7 +5389,7 @@ 授予 libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5337,7 +5397,7 @@ 风险较高 libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5345,15 +5405,7 @@ 这项活动已经存在。 libs/ui/src/lib/i18n.ts - 20 - - - - Japan - 日本 - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5361,7 +5413,7 @@ 降低风险 libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5369,7 +5421,7 @@ libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5377,7 +5429,7 @@ 几个月 libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5385,11 +5437,15 @@ 其他 libs/ui/src/lib/i18n.ts - 24 + 26 + + + libs/ui/src/lib/i18n.ts + 94 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 451 + 449 @@ -5397,7 +5453,7 @@ 预设 libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5405,7 +5461,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5413,7 +5469,7 @@ 退休金 libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5421,7 +5477,7 @@ 卫星 libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5445,11 +5501,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 319 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5457,11 +5513,11 @@ 标签 libs/ui/src/lib/i18n.ts - 30 + 32 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 53 + 54 @@ -5469,7 +5525,7 @@ libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5489,7 +5545,7 @@ libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5509,7 +5565,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5525,7 +5581,7 @@ libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5533,7 +5589,7 @@ 贵重物品 libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5541,7 +5597,7 @@ 负债 libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5553,7 +5609,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5565,7 +5621,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5573,7 +5629,7 @@ 商品 libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5585,7 +5641,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5593,7 +5649,7 @@ 固定收益 libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5601,7 +5657,11 @@ 房地产 libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5617,7 +5677,7 @@ 债券 libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5625,7 +5685,7 @@ 加密货币 libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5633,7 +5693,7 @@ 交易所交易基金 libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5641,7 +5701,7 @@ 共同基金 libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5649,7 +5709,7 @@ 贵金属 libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5657,7 +5717,7 @@ 私募股权 libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5665,7 +5725,7 @@ 股票 libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5673,7 +5733,7 @@ 非洲 libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5681,7 +5741,15 @@ 亚洲 libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5689,7 +5757,7 @@ 欧洲 libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5697,7 +5765,7 @@ 北美 libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5713,7 +5781,7 @@ 大洋洲 libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5721,7 +5789,7 @@ 南美洲 libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5729,7 +5797,7 @@ 极度恐惧 libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5737,7 +5805,7 @@ 极度贪婪 libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5745,7 +5813,7 @@ 中性的 libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5781,15 +5849,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 451 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 465 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5817,7 +5885,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5825,7 +5893,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 574 @@ -5833,15 +5901,7 @@ 哎呀!无法授予访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 144 - - - - Argentina - 阿根廷 - - libs/ui/src/lib/i18n.ts - 78 + 151 @@ -5889,7 +5949,7 @@ 市场数据延迟 apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5905,7 +5965,7 @@ 关闭持仓 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 447 @@ -5929,11 +5989,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 82 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 98 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5993,7 +6053,7 @@ 本月至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 libs/ui/src/lib/assistant/assistant.component.ts @@ -6005,7 +6065,7 @@ 本周至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 libs/ui/src/lib/assistant/assistant.component.ts @@ -6045,7 +6105,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 213 + 216 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6065,7 +6125,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 217 + 220 libs/ui/src/lib/assistant/assistant.component.ts @@ -6110,7 +6170,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 597 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6150,7 +6210,7 @@ 哎呀!看来您提出了太多要求。请慢一点。 apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6177,14 +6237,6 @@ 61 - - Indonesia - 印度尼西亚 - - libs/ui/src/lib/i18n.ts - 90 - - Activity 活动 @@ -6222,7 +6274,7 @@ 不允许执行此操作。 apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6230,7 +6282,7 @@ 流动性 libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6246,7 +6298,7 @@ 买入和卖出 libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6326,7 +6378,7 @@ 包含在 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 382 @@ -6350,7 +6402,7 @@ 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6366,7 +6418,7 @@ 您确定要删除这些配置文件吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 59 @@ -6374,7 +6426,7 @@ 哎呀!无法删除配置文件。 apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 47 @@ -6573,38 +6625,6 @@ 100 - - Australia - 澳大利亚 - - libs/ui/src/lib/i18n.ts - 79 - - - - Austria - 奥地利 - - libs/ui/src/lib/i18n.ts - 80 - - - - Belgium - 比利时 - - libs/ui/src/lib/i18n.ts - 81 - - - - Bulgaria - 保加利亚 - - libs/ui/src/lib/i18n.ts - 83 - - View Holding 查看持仓 @@ -6613,124 +6633,12 @@ 474 - - Canada - 加拿大 - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - 捷克共和国 - - libs/ui/src/lib/i18n.ts - 85 - - - - Finland - 芬兰 - - libs/ui/src/lib/i18n.ts - 86 - - - - France - 法国 - - libs/ui/src/lib/i18n.ts - 87 - - - - Germany - 德国 - - libs/ui/src/lib/i18n.ts - 88 - - - - India - 印度 - - libs/ui/src/lib/i18n.ts - 89 - - - - Italy - 意大利 - - libs/ui/src/lib/i18n.ts - 91 - - - - Netherlands - 荷兰 - - libs/ui/src/lib/i18n.ts - 93 - - - - New Zealand - 新西兰 - - libs/ui/src/lib/i18n.ts - 94 - - - - Poland - 波兰 - - libs/ui/src/lib/i18n.ts - 95 - - - - Romania - 罗马尼亚 - - libs/ui/src/lib/i18n.ts - 96 - - - - South Africa - 南非 - - libs/ui/src/lib/i18n.ts - 98 - - - - Thailand - 泰国 - - libs/ui/src/lib/i18n.ts - 100 - - - - United States - 美国 - - libs/ui/src/lib/i18n.ts - 103 - - Error 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6754,7 +6662,7 @@ 哎呀!无法更新访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6782,7 +6690,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 602 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6826,7 +6734,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6834,7 +6742,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 604 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6874,7 +6782,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6890,7 +6798,7 @@ libs/ui/src/lib/i18n.ts - 33 + 35 @@ -7041,6 +6949,14 @@ 174 + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 + + to use our referral link and get a Ghostfolio Premium membership for one year 使用我们的推荐链接并获得一年的Ghostfolio Premium会员资格 @@ -7158,15 +7074,7 @@ 获取来自 50 多个交易所的 80,000+ 股票代码访问权限 libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - 乌克兰 - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7372,7 +7280,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 613 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7420,11 +7328,11 @@ apps/client/src/app/components/header/header.component.html - 213 + 217 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 250 + 254 @@ -7464,7 +7372,7 @@ AI 提示已复制到剪贴板 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7480,7 +7388,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7488,7 +7396,7 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7496,7 +7404,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 @@ -7504,7 +7412,7 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 @@ -7512,7 +7420,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 540 @@ -7520,7 +7428,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 500 @@ -7528,7 +7436,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7536,7 +7444,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7544,7 +7452,7 @@ 打开 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7560,7 +7468,7 @@ 涨跌 libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7576,11 +7484,11 @@ apps/client/src/app/components/home-overview/home-overview.component.ts - 52 + 53 libs/ui/src/lib/holdings-table/holdings-table.component.html - 161 + 166 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7623,30 +7531,6 @@ 94 - - Armenia - 亚美尼亚 - - libs/ui/src/lib/i18n.ts - 77 - - - - British Virgin Islands - 英属维尔京群岛 - - libs/ui/src/lib/i18n.ts - 82 - - - - Singapore - 新加坡 - - libs/ui/src/lib/i18n.ts - 97 - - Terms and Conditions 条款和条件 @@ -7692,11 +7576,11 @@ 安全令牌 apps/client/src/app/components/admin-users/admin-users.component.ts - 235 + 256 apps/client/src/app/components/user-account-access/user-account-access.component.ts - 167 + 179 @@ -7704,7 +7588,7 @@ 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7715,14 +7599,6 @@ 239 - - United Kingdom - 英国 - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service 服务条款 @@ -7769,7 +7645,7 @@ () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7777,7 +7653,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7841,7 +7717,7 @@ 某人 apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7749,7 @@ 您确定要删除此项目吗? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7757,7 @@ 登出 apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8004,7 @@ 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8293,7 +8169,7 @@ 您真的想要生成一个新的安全令牌吗? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8349,7 +8225,7 @@ 管理资产概况 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8357,7 +8233,7 @@ 另类投资 libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8241,7 @@ 收藏品 libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8249,7 @@ 平均单位价格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 117 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html From 5177a1ee785ef9842b23fd31563f420723a856aa Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Jun 2026 09:12:03 +0200 Subject: [PATCH 33/37] Task/localize country names (part 2) (#6997) * Localize country names --- .../product-page.component.ts | 17 +- libs/common/src/lib/helper.ts | 2 +- libs/common/src/lib/personal-finance-tools.ts | 228 +++++++++--------- 3 files changed, 127 insertions(+), 120 deletions(-) diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index 14f9554d5..0dd14485f 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1,3 +1,4 @@ +import { getCountryName } from '@ghostfolio/common/helper'; import { Product } from '@ghostfolio/common/interfaces'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; @@ -32,6 +33,7 @@ export class GfProductPageComponent implements OnInit { ) {} public ngOnInit() { + const locale = document.documentElement.lang; const { subscriptionOffer } = this.dataService.fetchInfo(); this.price = subscriptionOffer?.price; @@ -55,18 +57,23 @@ export class GfProductPageComponent implements OnInit { 'Türkçe' ], name: 'Ghostfolio', - origin: $localize`Switzerland`, + origin: getCountryName({ locale, code: 'CH' }), regions: [$localize`Global`], slogan: 'Open Source Wealth Management', useAnonymously: true }; - this.product2 = personalFinanceTools.find(({ key }) => { - return key === this.route.snapshot.data['key']; - }); + this.product2 = { + ...personalFinanceTools.find(({ key }) => { + return key === this.route.snapshot.data['key']; + }) + }; if (this.product2.origin) { - this.product2.origin = translate(this.product2.origin); + this.product2.origin = getCountryName({ + locale, + code: this.product2.origin + }); } if (this.product2.regions) { diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index db320c7cb..ce7fca518 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -264,7 +264,7 @@ export function getCountryName({ }: { code: string; locale?: string; -}) { +}): string { try { return new Intl.DisplayNames([locale], { type: 'region' }).of(code) ?? code; } catch { diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 23697e63b..86cb1ca48 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -16,7 +16,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'allvue-systems', name: 'Allvue Systems', - origin: 'United States', + origin: 'US', slogan: 'Investment Software Suite', url: 'https://www.allvuesystems.com' }, @@ -33,7 +33,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'altoo', name: 'Altoo Wealth Platform', - origin: 'Switzerland', + origin: 'CH', slogan: 'Simplicity for Complex Wealth', url: 'https://altoo.io' }, @@ -43,7 +43,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'altruist', name: 'Altruist', - origin: 'United States', + origin: 'US', slogan: 'The wealth platform built for independent advisors', url: 'https://altruist.com' }, @@ -53,7 +53,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'amsflow', name: 'Amsflow Portfolio', - origin: 'Singapore', + origin: 'SG', pricingPerYear: '$228', slogan: 'Portfolio Visualizer', url: 'https://amsflow.com' @@ -65,7 +65,7 @@ export const personalFinanceTools: Product[] = [ key: 'anlage.app', languages: ['English'], name: 'Anlage.App', - origin: 'Austria', + origin: 'AT', pricingPerYear: '$120', slogan: 'Analyze and track your portfolio.', url: 'https://anlage.app' @@ -76,7 +76,7 @@ export const personalFinanceTools: Product[] = [ key: 'asseta', languages: ['English'], name: 'Asseta', - origin: 'United States', + origin: 'US', slogan: 'The Intelligent Family Office Suite', url: 'https://www.asseta.ai' }, @@ -84,7 +84,7 @@ export const personalFinanceTools: Product[] = [ founded: 2016, key: 'atominvest', name: 'Atominvest', - origin: 'United Kingdom', + origin: 'GB', slogan: 'Portfolio Management', url: 'https://www.atominvest.co' }, @@ -94,7 +94,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'balance-pro', name: 'Balance Pro', - origin: 'United States', + origin: 'US', pricingPerYear: '$47.99', slogan: 'The Smarter Way to Track Your Finances', url: 'https://www.balancepro.app' @@ -104,7 +104,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: true, key: 'banktivity', name: 'Banktivity', - origin: 'United States', + origin: 'US', pricingPerYear: '$59.99', slogan: 'Proactive money management app for macOS & iOS', url: 'https://www.banktivity.com' @@ -124,7 +124,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'beanvest', name: 'Beanvest', - origin: 'France', + origin: 'FR', pricingPerYear: '$100', slogan: 'Stock Portfolio Tracker for Smart Investors', url: 'https://beanvest.com' @@ -135,7 +135,7 @@ export const personalFinanceTools: Product[] = [ key: 'bluebudget', languages: ['Deutsch', 'English', 'Français', 'Italiano'], name: 'BlueBudget', - origin: 'Switzerland', + origin: 'CH', slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung', url: 'https://www.bluebudget.ch' }, @@ -146,7 +146,7 @@ export const personalFinanceTools: Product[] = [ key: 'boldin', name: 'Boldin', note: 'Originally named as NewRetirement', - origin: 'United States', + origin: 'US', pricingPerYear: '$144', slogan: 'Take control with retirement planning tools that begin with you', url: 'https://www.boldin.com' @@ -154,7 +154,7 @@ export const personalFinanceTools: Product[] = [ { key: 'budgetpulse', name: 'BudgetPulse', - origin: 'United States', + origin: 'US', slogan: 'Giving life to your finance!', url: 'https://www.budgetpulse.com' }, @@ -164,7 +164,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'buxfer', name: 'Buxfer', - origin: 'United States', + origin: 'US', pricingPerYear: '$48', regions: ['Global'], slogan: 'Take control of your financial future', @@ -175,7 +175,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'capitally', name: 'Capitally', - origin: 'Poland', + origin: 'PL', pricingPerYear: '€80', slogan: 'Optimize your investments performance', url: 'https://www.mycapitally.com' @@ -185,7 +185,7 @@ export const personalFinanceTools: Product[] = [ isArchived: true, key: 'capmon', name: 'CapMon.org', - origin: 'Germany', + origin: 'DE', note: 'CapMon.org was discontinued in 2023', slogan: 'Next Generation Assets Tracking' }, @@ -202,7 +202,7 @@ export const personalFinanceTools: Product[] = [ founded: 2011, key: 'cobalt', name: 'Cobalt', - origin: 'United States', + origin: 'US', slogan: 'Next-Level Portfolio Monitoring', url: 'https://www.cobalt.pe' }, @@ -212,7 +212,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'coinstats', name: 'CoinStats', - origin: 'Armenia', + origin: 'AM', pricingPerYear: '$168', slogan: 'Manage All Your Wallets & Exchanges From One Place', url: 'https://coinstats.app' @@ -224,7 +224,7 @@ export const personalFinanceTools: Product[] = [ key: 'cointracking', languages: ['Deutsch', 'English'], name: 'CoinTracking', - origin: 'Germany', + origin: 'DE', pricingPerYear: '$120', slogan: 'The leading Crypto Portfolio Tracker & Tax Calculator', url: 'https://cointracking.info' @@ -233,7 +233,7 @@ export const personalFinanceTools: Product[] = [ founded: 2019, key: 'compound-planning', name: 'Compound Planning', - origin: 'United States', + origin: 'US', slogan: 'Modern Wealth & Investment Management', url: 'https://compoundplanning.com' }, @@ -243,7 +243,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'copilot-money', name: 'Copilot Money', - origin: 'United States', + origin: 'US', pricingPerYear: '$95', slogan: 'Do money better with Copilot', url: 'https://www.copilot.money' @@ -253,7 +253,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: false, key: 'countabout', name: 'CountAbout', - origin: 'United States', + origin: 'US', pricingPerYear: '$9.99', slogan: 'Customizable and Secure Personal Finance App', url: 'https://countabout.com' @@ -263,7 +263,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: false, key: 'danti', name: 'Danti', - origin: 'United Kingdom', + origin: 'GB', slogan: 'Digitising Generational Wealth', url: 'https://danti.io' }, @@ -282,7 +282,7 @@ export const personalFinanceTools: Product[] = [ key: 'defi-portfolio-tracker-by-zerion', languages: ['English'], name: 'DeFi Portfolio Tracker by Zerion', - origin: 'United States', + origin: 'US', pricingPerYear: '$99', slogan: 'DeFi Portfolio Tracker for All Chains', url: 'https://zerion.io/defi-portfolio-tracker' @@ -294,7 +294,7 @@ export const personalFinanceTools: Product[] = [ key: 'degiro-portfolio-tracker-by-capitalyse', languages: ['English'], name: 'DEGIRO Portfolio Tracker by Capitalyse', - origin: 'Netherlands', + origin: 'NL', pricingPerYear: '€24', slogan: 'Democratizing Data Analytics', url: 'https://capitalyse.app/app/degiro' @@ -306,7 +306,7 @@ export const personalFinanceTools: Product[] = [ key: 'delta', name: 'Delta Investment Tracker', note: 'Acquired by eToro', - origin: 'Belgium', + origin: 'BE', pricingPerYear: '$150', slogan: 'The app to track all your investments. Make smart moves only.', url: 'https://delta.app' @@ -328,7 +328,7 @@ export const personalFinanceTools: Product[] = [ key: 'divvydiary', languages: ['Deutsch', 'English'], name: 'DivvyDiary', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€65', slogan: 'Your personal Dividend Calendar', url: 'https://divvydiary.com' @@ -339,7 +339,7 @@ export const personalFinanceTools: Product[] = [ key: 'empower', name: 'Empower', note: 'Originally named as Personal Capital', - origin: 'United States', + origin: 'US', slogan: 'Get answers to your money questions', url: 'https://www.empower.com' }, @@ -348,7 +348,7 @@ export const personalFinanceTools: Product[] = [ founded: 2022, key: 'eightfigures', name: '8FIGURES', - origin: 'United States', + origin: 'US', slogan: 'Portfolio Tracker Designed by Professional Investors', url: 'https://8figures.com' }, @@ -357,7 +357,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: false, key: 'etops', name: 'etops', - origin: 'Switzerland', + origin: 'CH', slogan: 'Your financial superpower', url: 'https://www.etops.com' }, @@ -367,7 +367,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'exirio', name: 'Exirio', - origin: 'United States', + origin: 'US', pricingPerYear: '$100', slogan: 'All your wealth, in one place.', url: 'https://www.exirio.com' @@ -378,7 +378,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'fey', name: 'Fey', - origin: 'Canada', + origin: 'CA', pricingPerYear: '$300', slogan: 'Make better investments.', url: 'https://fey.com' @@ -390,7 +390,7 @@ export const personalFinanceTools: Product[] = [ key: 'fina', languages: ['English'], name: 'Fina', - origin: 'United States', + origin: 'US', pricingPerYear: '$115', slogan: 'Flexible Financial Management', url: 'https://www.fina.money' @@ -401,7 +401,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'finanzfluss-copilot', name: 'Finanzfluss Copilot', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€69.99', slogan: 'Portfolio Tracker für dein Vermögen', url: 'https://www.finanzfluss.de/copilot' @@ -411,7 +411,7 @@ export const personalFinanceTools: Product[] = [ key: 'finary', languages: ['Deutsch', 'English', 'Français'], name: 'Finary', - origin: 'United States', + origin: 'US', slogan: 'Real-Time Portfolio Tracker & Stock Tracker', url: 'https://finary.com' }, @@ -422,7 +422,7 @@ export const personalFinanceTools: Product[] = [ key: 'finateka', languages: ['English'], name: 'FINATEKA', - origin: 'United States', + origin: 'US', slogan: 'The most convenient mobile application for personal finance accounting', url: 'https://finateka.com' @@ -431,7 +431,7 @@ export const personalFinanceTools: Product[] = [ founded: 2022, key: 'fincake', name: 'Fincake', - origin: 'British Virgin Islands', + origin: 'VG', slogan: 'Easy-to-use Portfolio Tracker', url: 'https://fincake.io' }, @@ -440,7 +440,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'finvest', name: 'Finvest', - origin: 'United States', + origin: 'US', slogan: 'Grow your wealth in a stress-free way', url: 'https://www.getfinvest.com' }, @@ -449,7 +449,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: true, key: 'finwise', name: 'FinWise', - origin: 'South Africa', + origin: 'ZA', pricingPerYear: '€69.99', slogan: 'Personal finances, simplified', url: 'https://finwiseapp.io' @@ -461,7 +461,7 @@ export const personalFinanceTools: Product[] = [ key: 'firekit', languages: ['English', 'українська мова'], name: 'FIREkit', - origin: 'Ukraine', + origin: 'UA', pricingPerYear: '$40', slogan: 'A simple solution to track your wealth online', url: 'https://firekit.space' @@ -472,7 +472,7 @@ export const personalFinanceTools: Product[] = [ key: 'folishare', languages: ['Deutsch', 'English'], name: 'folishare', - origin: 'Austria', + origin: 'AT', pricingPerYear: '$65', slogan: 'Take control over your investments', url: 'https://www.folishare.com' @@ -490,7 +490,7 @@ export const personalFinanceTools: Product[] = [ 'Português' ], name: 'Gasti', - origin: 'Argentina', + origin: 'AR', pricingPerYear: '$60', regions: ['Global'], slogan: 'Take control of your finances from WhatsApp', @@ -503,7 +503,7 @@ export const personalFinanceTools: Product[] = [ key: 'getquin', languages: ['Deutsch', 'English'], name: 'getquin', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€48', slogan: 'Portfolio Tracker, Analysis & Community', url: 'https://www.getquin.com' @@ -515,7 +515,7 @@ export const personalFinanceTools: Product[] = [ key: 'gospatz', name: 'goSPATZ', note: 'Renamed to Money Peak', - origin: 'Germany', + origin: 'DE', slogan: 'Volle Kontrolle über deine Investitionen' }, { @@ -525,7 +525,7 @@ export const personalFinanceTools: Product[] = [ key: 'gustav', languages: ['Français'], name: 'Gustav', - origin: 'France', + origin: 'FR', pricingPerYear: '€59.99', slogan: 'Prenez enfin le contrôle de votre argent', url: 'https://get-gustav.com' @@ -536,7 +536,7 @@ export const personalFinanceTools: Product[] = [ key: 'holistic-capital', languages: ['Deutsch'], name: 'Holistic', - origin: 'Germany', + origin: 'DE', slogan: 'Die All-in-One Lösung für dein Vermögen.', url: 'https://holistic.capital', useAnonymously: true @@ -546,7 +546,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'honeydue', name: 'Honeydue', - origin: 'United States', + origin: 'US', slogan: 'Finance App for Couples', url: 'https://www.honeydue.com' }, @@ -556,7 +556,7 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Income Reign', note: 'Income Reign was discontinued in 2025', - origin: 'United States', + origin: 'US', pricingPerYear: '$120' }, { @@ -566,7 +566,7 @@ export const personalFinanceTools: Product[] = [ key: 'intuit-mint', name: 'Intuit Mint', note: 'Intuit Mint was discontinued in 2023', - origin: 'United States', + origin: 'US', pricingPerYear: '$60', slogan: 'Managing money, made simple' }, @@ -575,7 +575,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'investify', name: 'Investify', - origin: 'Pakistan', + origin: 'PK', slogan: 'Advanced portfolio tracking and stock market information', url: 'https://www.investify.pk' }, @@ -586,7 +586,7 @@ export const personalFinanceTools: Product[] = [ key: 'invmon', name: 'InvMon', note: 'Originally named as A2PB', - origin: 'Switzerland', + origin: 'CH', pricingPerYear: '$156', slogan: 'Track all your assets, investments and portfolios in one place', url: 'https://invmon.com', @@ -598,7 +598,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'justetf', name: 'justETF', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€119', slogan: 'ETF portfolios made simple', url: 'https://www.justetf.com' @@ -609,7 +609,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'koinly', name: 'Koinly', - origin: 'Singapore', + origin: 'SG', slogan: 'Track all your crypto wallets in one place', url: 'https://koinly.io' }, @@ -619,7 +619,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'koyfin', name: 'Koyfin', - origin: 'United States', + origin: 'US', pricingPerYear: '$468', slogan: 'Comprehensive financial data analysis', url: 'https://www.koyfin.com' @@ -630,7 +630,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'kubera', name: 'Kubera®', - origin: 'United States', + origin: 'US', pricingPerYear: '$249', slogan: 'The Time Machine for your Net Worth', url: 'https://www.kubera.com' @@ -641,7 +641,7 @@ export const personalFinanceTools: Product[] = [ key: 'leafs', languages: ['Deutsch', 'English'], name: 'Leafs', - origin: 'Switzerland', + origin: 'CH', slogan: 'Sustainability insights for wealth managers', url: 'https://leafs.ch' }, @@ -651,7 +651,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'magnifi', name: 'Magnifi', - origin: 'United States', + origin: 'US', pricingPerYear: '$132', slogan: 'AI Investing Assistant', url: 'https://magnifi.com' @@ -663,7 +663,7 @@ export const personalFinanceTools: Product[] = [ key: 'markets.sh', languages: ['English'], name: 'markets.sh', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€168', regions: ['Global'], slogan: 'Track your investments', @@ -673,7 +673,7 @@ export const personalFinanceTools: Product[] = [ founded: 2010, key: 'masttro', name: 'Masttro', - origin: 'United States', + origin: 'US', slogan: 'Your platform for wealth in full view', url: 'https://masttro.com' }, @@ -687,7 +687,7 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'Maybe Finance', note: 'Maybe Finance was discontinued in 2023, relaunched in 2024, and discontinued again in 2025', - origin: 'United States', + origin: 'US', pricingPerYear: '$145', regions: ['United States'], slogan: 'Your financial future, in your control', @@ -699,7 +699,7 @@ export const personalFinanceTools: Product[] = [ key: 'merlincrypto', languages: ['English'], name: 'Merlin', - origin: 'United States', + origin: 'US', pricingPerYear: '$204', regions: ['Canada', 'United States'], slogan: 'The smartest way to track your crypto', @@ -712,7 +712,7 @@ export const personalFinanceTools: Product[] = [ key: 'microsoft-money', name: 'Microsoft Money', note: 'Microsoft Money was discontinued in 2010', - origin: 'United States' + origin: 'US' }, { founded: 2019, @@ -720,7 +720,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'monarch-money', name: 'Monarch Money', - origin: 'United States', + origin: 'US', pricingPerYear: '$99.99', slogan: 'The modern way to manage your money', url: 'https://www.monarch.com' @@ -731,7 +731,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: true, key: 'moneydance', name: 'Moneydance', - origin: 'Scotland', + origin: 'GB', pricingPerYear: '$100', slogan: 'Personal Finance Manager for Mac, Windows, and Linux', url: 'https://moneydance.com' @@ -742,7 +742,7 @@ export const personalFinanceTools: Product[] = [ key: 'moneypeak', name: 'Money Peak', note: 'Originally named as goSPATZ', - origin: 'Germany', + origin: 'DE', slogan: 'Dein smarter Finance Assistant', url: 'https://moneypeak.ai' }, @@ -751,7 +751,7 @@ export const personalFinanceTools: Product[] = [ key: 'moneyspire', name: 'Moneyspire', note: 'License is a perpetual license', - origin: 'United States', + origin: 'US', pricingPerYear: '$59.99', slogan: 'Have total control of your financial life', url: 'https://www.moneyspire.com' @@ -759,7 +759,7 @@ export const personalFinanceTools: Product[] = [ { key: 'moneywiz', name: 'MoneyWiz', - origin: 'United States', + origin: 'US', pricingPerYear: '$29.99', slogan: 'Get money management superpowers', url: 'https://www.wiz.money' @@ -780,7 +780,7 @@ export const personalFinanceTools: Product[] = [ key: 'monsy', languages: ['English'], name: 'Monsy', - origin: 'Indonesia', + origin: 'ID', pricingPerYear: '$20', slogan: 'Smart, simple, stress-free money tracking.', url: 'https://www.monsy.app' @@ -791,7 +791,7 @@ export const personalFinanceTools: Product[] = [ key: 'morningstar-portfolio-manager', languages: ['English'], name: 'Morningstar® Portfolio Manager', - origin: 'United States', + origin: 'US', slogan: 'Track your equity, fund, investment trust, ETF and pension investments in one place.', url: 'https://www.morningstar.com/mm' @@ -812,7 +812,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'nansen', name: 'Crypto Portfolio Tracker by Nansen', - origin: 'Singapore', + origin: 'SG', pricingPerYear: '$1188', slogan: 'Your Complete Crypto Portfolio, Reimagined', url: 'https://www.nansen.ai/crypto-portfolio-tracker' @@ -823,7 +823,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'navexa', name: 'Navexa', - origin: 'Australia', + origin: 'AU', pricingPerYear: '$90', slogan: 'The Intelligent Portfolio Tracker', url: 'https://www.navexa.com' @@ -844,7 +844,7 @@ export const personalFinanceTools: Product[] = [ key: 'parqet', name: 'Parqet', note: 'Originally named as Tresor One', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€99.99', regions: ['Austria', 'Germany', 'Switzerland'], slogan: 'Dein Vermögen immer im Blick', @@ -854,14 +854,14 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'peek', name: 'Peek', - origin: 'Singapore', + origin: 'SG', slogan: 'Feel in control of your money without spreadsheets or shame', url: 'https://peek.money' }, { key: 'pennies', name: 'Pennies', - origin: 'United States', + origin: 'US', pricingPerYear: '$39.99', slogan: 'Your money. Made simple.', url: 'https://www.getpennies.com' @@ -872,7 +872,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'pinklion', name: 'PinkLion', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€50', slogan: 'Invest smarter, not harder', url: 'https://pinklion.xyz' @@ -884,7 +884,7 @@ export const personalFinanceTools: Product[] = [ key: 'plainzer', languages: ['English'], name: 'Plainzer', - origin: 'Poland', + origin: 'PL', pricingPerYear: '$74', slogan: 'Free dividend tracker for your portfolio', url: 'https://plainzer.com' @@ -894,7 +894,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'plannix', name: 'Plannix', - origin: 'Italy', + origin: 'IT', slogan: 'Your Personal Finance Hub', url: 'https://www.plannix.co' }, @@ -904,7 +904,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'pocketguard', name: 'PocketGuard', - origin: 'United States', + origin: 'US', pricingPerYear: '$74.99', slogan: 'Budgeting App & Finance Planner', url: 'https://pocketguard.com' @@ -916,7 +916,7 @@ export const personalFinanceTools: Product[] = [ key: 'pocketsmith', languages: ['English'], name: 'PocketSmith', - origin: 'New Zealand', + origin: 'NZ', pricingPerYear: '$120', regions: ['Global'], slogan: 'Know where your money is going', @@ -928,7 +928,7 @@ export const personalFinanceTools: Product[] = [ key: 'portfolio-dividend-tracker', languages: ['English', 'Nederlands'], name: 'Portfolio Dividend Tracker', - origin: 'Netherlands', + origin: 'NL', pricingPerYear: '€60', slogan: 'Manage all your portfolios', url: 'https://portfoliodividendtracker.com' @@ -959,7 +959,7 @@ export const personalFinanceTools: Product[] = [ key: 'portseido', languages: ['Deutsch', 'English', 'Français', 'Nederlands'], name: 'Portseido', - origin: 'Thailand', + origin: 'TH', pricingPerYear: '$96', slogan: 'Portfolio Performance and Dividend Tracker', url: 'https://www.portseido.com' @@ -970,7 +970,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: true, key: 'projectionlab', name: 'ProjectionLab', - origin: 'United States', + origin: 'US', pricingPerYear: '$108', slogan: 'Build Financial Plans You Love.', url: 'https://projectionlab.com' @@ -981,7 +981,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'prostocktracker', name: 'Pro Stock Tracker', - origin: 'United Kingdom', + origin: 'GB', pricingPerYear: '$60', slogan: 'The stock portfolio tracker built for long-term investors', url: 'https://prostocktracker.com' @@ -1002,7 +1002,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'rocket-money', name: 'Rocket Money', - origin: 'United States', + origin: 'US', slogan: 'Track your net worth', url: 'https://www.rocketmoney.com' }, @@ -1013,7 +1013,7 @@ export const personalFinanceTools: Product[] = [ key: 'sarmaaya.pk', name: 'Sarmaaya.pk Portfolio Tracking', note: 'Sarmaaya.pk Portfolio Tracking was discontinued in 2024', - origin: 'Pakistan', + origin: 'PK', slogan: 'Unified platform for financial research and portfolio tracking' }, { @@ -1022,7 +1022,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'seeking-alpha', name: 'Seeking Alpha', - origin: 'United States', + origin: 'US', pricingPerYear: '$239', slogan: 'Stock Market Analysis & Tools for Investors', url: 'https://seekingalpha.com' @@ -1031,7 +1031,7 @@ export const personalFinanceTools: Product[] = [ founded: 2022, key: 'segmio', name: 'Segmio', - origin: 'Romania', + origin: 'RO', slogan: 'Wealth Management and Net Worth Tracking', url: 'https://www.segmio.com' }, @@ -1041,7 +1041,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'sharesight', name: 'Sharesight', - origin: 'New Zealand', + origin: 'NZ', pricingPerYear: '$135', regions: ['Global'], slogan: 'Stock Portfolio Tracker', @@ -1060,7 +1060,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'simple-portfolio', name: 'Simple Portfolio', - origin: 'Czech Republic', + origin: 'CZ', pricingPerYear: '€80', slogan: 'Stock Portfolio Tracker', url: 'https://simpleportfolio.app' @@ -1071,7 +1071,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'simply-wallstreet', name: 'Stock Portfolio Tracker & Visualizer by Simply Wall St', - origin: 'Australia', + origin: 'AU', pricingPerYear: '$120', slogan: 'Smart portfolio tracker for informed investors', url: 'https://simplywall.st' @@ -1082,7 +1082,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'snowball-analytics', name: 'Snowball Analytics', - origin: 'France', + origin: 'FR', pricingPerYear: '$80', slogan: 'Simple and powerful portfolio tracker', url: 'https://snowball-analytics.com' @@ -1090,7 +1090,7 @@ export const personalFinanceTools: Product[] = [ { key: 'splashmoney', name: 'SplashMoney', - origin: 'United States', + origin: 'US', slogan: 'Manage your money anytime, anywhere.' }, { @@ -1098,14 +1098,14 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'stock-events', name: 'Stock Events', - origin: 'Germany', + origin: 'DE', slogan: 'Track all your Investments', url: 'https://stockevents.app' }, { key: 'stockle', name: 'Stockle', - origin: 'Finland', + origin: 'FI', slogan: 'Supercharge your investments tracking experience', url: 'https://stockle.app' }, @@ -1114,7 +1114,7 @@ export const personalFinanceTools: Product[] = [ isArchived: true, key: 'stockmarketeye', name: 'StockMarketEye', - origin: 'France', + origin: 'FR', note: 'StockMarketEye was discontinued in 2023', slogan: 'A Powerful Portfolio & Investment Tracking App' }, @@ -1124,7 +1124,7 @@ export const personalFinanceTools: Product[] = [ key: 'stock-rover', languages: ['English'], name: 'Stock Rover', - origin: 'United States', + origin: 'US', pricingPerYear: '$79.99', slogan: 'Investment Research and Portfolio Management', url: 'https://www.stockrover.com' @@ -1135,7 +1135,7 @@ export const personalFinanceTools: Product[] = [ key: 'stonksfolio', languages: ['English'], name: 'Stonksfolio', - origin: 'Bulgaria', + origin: 'BG', pricingPerYear: '€49.90', slogan: 'Visualize all of your portfolios', url: 'https://stonksfolio.com' @@ -1145,7 +1145,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'sumio', name: 'Sumio', - origin: 'Czech Republic', + origin: 'CZ', pricingPerYear: '$20', slogan: 'Sum up and build your wealth.', url: 'https://www.sumio.app' @@ -1155,7 +1155,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: false, key: 'tiller', name: 'Tiller', - origin: 'United States', + origin: 'US', pricingPerYear: '$79', slogan: 'Your financial life in a spreadsheet, automatically updated each day', @@ -1167,7 +1167,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'tradervue', name: 'Tradervue', - origin: 'United States', + origin: 'US', pricingPerYear: '$360', slogan: 'The Trading Journal to Improve Your Trading Performance', url: 'https://www.tradervue.com' @@ -1199,7 +1199,7 @@ export const personalFinanceTools: Product[] = [ key: 'tresor-one', name: 'Tresor One', note: 'Renamed to Parqet', - origin: 'Germany', + origin: 'DE', regions: ['Austria', 'Germany', 'Switzerland'], slogan: 'Dein Vermögen immer im Blick' }, @@ -1209,7 +1209,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'turbobulls', name: 'Turbobulls', - origin: 'Romania', + origin: 'RO', pricingPerYear: '€39.99', slogan: 'Your complete financial dashboard. Actually private.', url: 'https://www.turbobulls.com' @@ -1220,7 +1220,7 @@ export const personalFinanceTools: Product[] = [ key: 'utluna', languages: ['Deutsch', 'English', 'Français'], name: 'Utluna', - origin: 'Switzerland', + origin: 'CH', pricingPerYear: '$300', slogan: 'Your Portfolio. Revealed.', url: 'https://www.utluna.com', @@ -1231,7 +1231,7 @@ export const personalFinanceTools: Product[] = [ hasFreePlan: true, key: 'vyzer', name: 'Vyzer', - origin: 'United States', + origin: 'US', pricingPerYear: '$348', slogan: 'Virtual Family Office for Smart Wealth Management', url: 'https://vyzer.co' @@ -1242,7 +1242,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'walletguide', name: 'Walletguide', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€90', slogan: 'Personal finance reimagined with AI', url: 'https://walletguide.com' @@ -1254,7 +1254,7 @@ export const personalFinanceTools: Product[] = [ languages: ['English'], name: 'wallmine', note: 'wallmine was discontinued in 2024', - origin: 'Czech Republic', + origin: 'CZ', pricingPerYear: '$600', slogan: 'Make Smarter Investments' }, @@ -1264,7 +1264,7 @@ export const personalFinanceTools: Product[] = [ key: 'wealthbrain', languages: ['English'], name: 'Wealthbrain', - origin: 'United Arab Emirates', + origin: 'AE', slogan: 'Portfolio Management System', url: 'https://wealthbrain.com' }, @@ -1276,7 +1276,7 @@ export const personalFinanceTools: Product[] = [ key: 'wealthfolio', languages: ['English'], name: 'Wealthfolio', - origin: 'Canada', + origin: 'CA', slogan: 'Desktop Investment Tracker', url: 'https://wealthfolio.app' }, @@ -1287,7 +1287,7 @@ export const personalFinanceTools: Product[] = [ key: 'wealthica', languages: ['English', 'Français'], name: 'Wealthica', - origin: 'Canada', + origin: 'CA', pricingPerYear: '$50', slogan: 'See all your investments in one place', url: 'https://wealthica.com' @@ -1307,14 +1307,14 @@ export const personalFinanceTools: Product[] = [ key: 'wealthy-tracker', languages: ['English'], name: 'Wealthy Tracker', - origin: 'India', + origin: 'IN', slogan: 'One app to manage all your investments', url: 'https://www.wealthy.in/tracker' }, { key: 'whal', name: 'Whal', - origin: 'United States', + origin: 'US', slogan: 'Manage your investments in one place' }, { @@ -1326,7 +1326,7 @@ export const personalFinanceTools: Product[] = [ languages: ['Deutsch', 'English', 'Español', 'Français', 'Italiano'], name: 'yeekatee', note: 'yeekatee was discontinued in 2024', - origin: 'Switzerland', + origin: 'CH', regions: ['Global'], slogan: 'Connect. Share. Invest.' }, @@ -1336,7 +1336,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'ynab', name: 'YNAB (You Need a Budget)', - origin: 'United States', + origin: 'US', pricingPerYear: '$109', slogan: 'Change Your Relationship With Money', url: 'https://www.ynab.com' @@ -1347,7 +1347,7 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'ziggma', name: 'Ziggma', - origin: 'United States', + origin: 'US', pricingPerYear: '$84', slogan: 'Your solution for investing success', url: 'https://ziggma.com' From 03ad9bc1a0987e37c2efe3d5abf312d36bc762cf Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Jun 2026 09:12:41 +0200 Subject: [PATCH 34/37] Task/improve language localization for DE (20260606) (#6996) * Update translations * Update changelog --- CHANGELOG.md | 1 + apps/client/src/locales/messages.de.xlf | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f17f1288..878641e5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Prevented the deletion of asset profiles that are currently in use - Ensured market data is correctly removed when an asset profile with no remaining activities is deleted - Refactored the backend logging to use the instance-based `Logger` +- Improved the language localization for German (`de`) - Improved the language localization for Ukrainian (`uk`) ### Fixed diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 504dc107a..fd0ca79d6 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -887,7 +887,7 @@ Energy - Energy + Energie libs/ui/src/lib/i18n.ts 90 @@ -1223,7 +1223,7 @@ Consumer Defensive - Consumer Defensive + Defensive Konsumgüter libs/ui/src/lib/i18n.ts 89 @@ -1291,7 +1291,7 @@ Utilities - Utilities + Versorgungsbetriebe libs/ui/src/lib/i18n.ts 97 @@ -2019,7 +2019,7 @@ Consumer Cyclical - Consumer Cyclical + Zyklische Konsumgüter libs/ui/src/lib/i18n.ts 88 @@ -3123,7 +3123,7 @@ Communication Services - Communication Services + Kommunikationsdienste libs/ui/src/lib/i18n.ts 87 @@ -4339,7 +4339,7 @@ Technology - Technology + Technologie libs/ui/src/lib/i18n.ts 96 @@ -4987,7 +4987,7 @@ Basic Materials - Basic Materials + Grundstoffe libs/ui/src/lib/i18n.ts 86 @@ -5713,7 +5713,7 @@ Industrials - Industrials + Industrie libs/ui/src/lib/i18n.ts 93 @@ -5829,7 +5829,7 @@ Healthcare - Healthcare + Gesundheitswesen libs/ui/src/lib/i18n.ts 92 @@ -6974,7 +6974,7 @@ Financial Services - Financial Services + Finanzdienstleistungen libs/ui/src/lib/i18n.ts 91 From 2faa4c7c89950f33c4755598713f2fe64eea33f0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 7 Jun 2026 10:21:14 +0200 Subject: [PATCH 35/37] Bugfix/prevent FAB from overlapping paginators on mobile (#7000) * Prevent FAB from overlapping paginators on mobile * Update changelog --- CHANGELOG.md | 1 + .../portfolio/activities/activities-page.html | 2 +- libs/ui/src/lib/fab/fab.component.scss | 32 +++++++++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 878641e5f..c903fb38e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- Prevented the floating action button from overlapping the paginator on mobile - Fixed an issue where the asset profile override (asset class and asset sub class) was not applied to the data enhancers when gathering asset profiles - Fixed a layout issue in the asset profile dialog of the admin control panel by truncating long titles diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.html b/apps/client/src/app/pages/portfolio/activities/activities-page.html index f06947988..23e0cef02 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.html +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.html @@ -1,5 +1,5 @@
-
+

Activities

Date: Sun, 7 Jun 2026 10:23:47 +0200 Subject: [PATCH 36/37] Release 3.8.0 (#7001) --- CHANGELOG.md | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c903fb38e..ef50d292f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## Unreleased +## 3.8.0 - 2026-06-07 ### Added diff --git a/package-lock.json b/package-lock.json index e7b5a2bca..26f8ee255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.7.0", + "version": "3.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.7.0", + "version": "3.8.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/package.json b/package.json index 4fa3e522a..04f125aa7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.7.0", + "version": "3.8.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", From 449eaa1baa678c3be98f137cc5196986c0480fb1 Mon Sep 17 00:00:00 2001 From: David Requeno <108202767+DavidReque@users.noreply.github.com> Date: Mon, 8 Jun 2026 10:10:47 -0600 Subject: [PATCH 37/37] Task/prefill form with current cash balance value in account details dialog (#6998) * Prefill form with current cash balance value * Update changelog --- CHANGELOG.md | 6 ++++++ .../account-detail-dialog.html | 1 + .../account-balances/account-balances.component.ts | 13 +++++++++++++ 3 files changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef50d292f..07002a2d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Changed + +- Prefilled the form in the account balance management with the current cash balance + ## 3.8.0 - 2026-06-07 ### Added diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index cd397e35e..4b652db96 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -148,6 +148,7 @@ [accountBalances]="accountBalances" [accountCurrency]="currency" [accountId]="data.accountId" + [currentBalance]="balance" [locale]="user?.settings?.locale" [showActions]=" !data.hasImpersonationId && diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts index 7b26263b0..503f84071 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.ts +++ b/libs/ui/src/lib/account-balances/account-balances.component.ts @@ -13,6 +13,7 @@ import { OnChanges, OnInit, Output, + effect, inject, input, viewChild @@ -70,6 +71,7 @@ export class GfAccountBalancesComponent implements OnChanges, OnInit { input.required(); public readonly accountCurrency = input.required(); public readonly accountId = input.required(); + public readonly currentBalance = input(); public readonly displayedColumns: string[] = ['date', 'value', 'actions']; public readonly locale = input(getLocale()); public readonly showActions = input(true); @@ -89,6 +91,17 @@ export class GfAccountBalancesComponent implements OnChanges, OnInit { public constructor() { addIcons({ calendarClearOutline, ellipsisHorizontal, trashOutline }); + + effect(() => { + const currentBalance = this.currentBalance(); + + if ( + this.accountBalanceForm.controls.balance.pristine && + typeof currentBalance === 'number' + ) { + this.accountBalanceForm.controls.balance.setValue(currentBalance); + } + }); } public ngOnInit() {