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 87da5e0bd..07002a2d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Prefilled the form in the account balance management with the current cash balance + +## 3.8.0 - 2026-06-07 + +### Added + +- Added an automatic refresh every 30 seconds to the users table in the admin control panel + +### 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 +- 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 + +- 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 + +## 3.7.0 - 2026-06-02 + +### 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_ +- 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 + +- 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 + +### 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 + +- 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/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/activities/activities.module.ts b/apps/api/src/app/activities/activities.module.ts index f4e592c3f..661163ff1 100644 --- a/apps/api/src/app/activities/activities.module.ts +++ b/apps/api/src/app/activities/activities.module.ts @@ -6,9 +6,11 @@ import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redac import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; import { ApiModule } from '@ghostfolio/api/services/api/api.module'; +import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; +import { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module'; import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; @@ -23,11 +25,13 @@ import { ActivitiesService } from './activities.service'; exports: [ActivitiesService], imports: [ ApiModule, + BenchmarkModule, CacheModule, DataGatheringQueueModule, DataProviderModule, ExchangeRateDataModule, ImpersonationModule, + MarketDataModule, PrismaModule, RedactValuesInResponseModule, RedisCacheModule, diff --git a/apps/api/src/app/activities/activities.service.ts b/apps/api/src/app/activities/activities.service.ts index 821185e11..f57507e3d 100644 --- a/apps/api/src/app/activities/activities.service.ts +++ b/apps/api/src/app/activities/activities.service.ts @@ -4,8 +4,10 @@ import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details import { AssetProfileChangedEvent } from '@ghostfolio/api/events/asset-profile-changed.event'; import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; +import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.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 { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; @@ -16,7 +18,10 @@ import { ghostfolioPrefix, TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; -import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { + canDeleteAssetProfile, + getAssetProfileIdentifier +} from '@ghostfolio/common/helper'; import { ActivitiesResponse, Activity, @@ -48,10 +53,12 @@ export class ActivitiesService { public constructor( private readonly accountBalanceService: AccountBalanceService, private readonly accountService: AccountService, + private readonly benchmarkService: BenchmarkService, private readonly dataGatheringService: DataGatheringService, private readonly dataProviderService: DataProviderService, private readonly eventEmitter: EventEmitter2, private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly marketDataService: MarketDataService, private readonly prismaService: PrismaService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -262,7 +269,26 @@ export class ActivitiesService { activity.symbolProfileId ]); - if (symbolProfile.activitiesCount === 0) { + const benchmarkAssetProfiles = + await this.benchmarkService.getBenchmarkAssetProfiles(); + + const isBenchmark = benchmarkAssetProfiles.some(({ id }) => { + return id === symbolProfile.id; + }); + + if ( + canDeleteAssetProfile({ + isBenchmark, + activitiesCount: symbolProfile.activitiesCount, + symbol: symbolProfile.symbol, + watchedByCount: symbolProfile.watchedByCount + }) + ) { + await this.marketDataService.deleteMany({ + dataSource: symbolProfile.dataSource, + symbol: symbolProfile.symbol + }); + await this.symbolProfileService.deleteById(activity.symbolProfileId); } @@ -308,8 +334,31 @@ export class ActivitiesService { }) ); - for (const { activitiesCount, id } of symbolProfiles) { - if (activitiesCount === 0) { + const benchmarkAssetProfiles = + await this.benchmarkService.getBenchmarkAssetProfiles(); + + for (const { + activitiesCount, + dataSource, + id, + symbol, + watchedByCount + } of symbolProfiles) { + const isBenchmark = benchmarkAssetProfiles.some( + (benchmarkAssetProfile) => { + return benchmarkAssetProfile.id === id; + } + ); + + if ( + canDeleteAssetProfile({ + activitiesCount, + isBenchmark, + symbol, + watchedByCount + }) + ) { + await this.marketDataService.deleteMany({ dataSource, symbol }); await this.symbolProfileService.deleteById(id); } } diff --git a/apps/api/src/app/admin/admin.controller.ts b/apps/api/src/app/admin/admin.controller.ts index 69b619625..1a2c58d1c 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -2,9 +2,11 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorat import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor'; import { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; import { ManualService } from '@ghostfolio/api/services/data-provider/manual/manual.service'; import { DemoService } from '@ghostfolio/api/services/demo/demo.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { getIntervalFromDateRange } from '@ghostfolio/common/calculation-helper'; import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, @@ -16,7 +18,10 @@ import { UpdateAssetProfileDto, UpdatePropertyDto } from '@ghostfolio/common/dtos'; -import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { + canDeleteAssetProfile, + getAssetProfileIdentifier +} from '@ghostfolio/common/helper'; import { AdminData, AdminMarketData, @@ -58,13 +63,17 @@ 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, + private readonly benchmarkService: BenchmarkService, private readonly dataGatheringService: DataGatheringService, private readonly demoService: DemoService, private readonly manualService: ManualService, - @Inject(REQUEST) private readonly request: RequestWithUser + @Inject(REQUEST) private readonly request: RequestWithUser, + private readonly symbolProfileService: SymbolProfileService ) {} @Get() @@ -260,7 +269,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); } @@ -288,6 +297,33 @@ export class AdminController { @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string ): Promise { + const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([ + { dataSource, symbol } + ]); + + if (assetProfile) { + const benchmarkAssetProfiles = + await this.benchmarkService.getBenchmarkAssetProfiles(); + + const isBenchmark = benchmarkAssetProfiles.some(({ id }) => { + return id === assetProfile.id; + }); + + if ( + !canDeleteAssetProfile({ + isBenchmark, + activitiesCount: assetProfile.activitiesCount, + symbol: assetProfile.symbol, + watchedByCount: assetProfile.watchedByCount + }) + ) { + throw new HttpException( + getReasonPhrase(StatusCodes.FORBIDDEN), + StatusCodes.FORBIDDEN + ); + } + } + return this.adminService.deleteProfileData({ dataSource, symbol }); } 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/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index 9fc5d0925..1d6990307 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,12 +43,15 @@ 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 logger = new Logger('OidcStrategy'); + const isOidcEnabled = configurationService.get( 'ENABLE_FEATURE_AUTH_OIDC' ); @@ -81,7 +87,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` ); @@ -97,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.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..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 @@ -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 { @@ -33,9 +34,12 @@ 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, + private readonly fetchService: FetchService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService ) {} @@ -97,7 +101,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -139,7 +143,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -181,7 +185,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -269,7 +273,7 @@ export class GhostfolioService { return results; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -346,7 +350,7 @@ export class GhostfolioService { return results; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -355,6 +359,7 @@ export class GhostfolioService { private getDataProviderInfo(): DataProviderInfo { const ghostfolioDataProviderService = new GhostfolioDataProviderService( this.configurationService, + this.fetchService, this.propertyService ); 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 ); } 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/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/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-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts index 217a67c49..2d85330a3 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -116,10 +116,12 @@ describe('PortfolioCalculator', () => { accountBalanceService, accountService, null, + null, dataProviderService, null, exchangeRateDataService, null, + null, null ); 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.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 8aa94ee92..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') @@ -144,10 +146,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 +219,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 }; } @@ -336,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 }); @@ -345,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.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts new file mode 100644 index 000000000..2d73bce3d --- /dev/null +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -0,0 +1,274 @@ +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, + null, + dataProviderService, + null, + exchangeRateDataService, + null, + 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'); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index cee36ec27..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, @@ -164,7 +166,7 @@ export class PortfolioService { }; } - const [accounts, details] = await Promise.all([ + const [accounts, details, user] = await Promise.all([ this.accountService.accounts({ where, include: { @@ -178,10 +180,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) => { @@ -584,7 +587,6 @@ export class PortfolioService { for (const { activitiesCount, - currency, dataSource, dateOfFirstActivity, dividend, @@ -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; @@ -638,16 +639,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 +668,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 +676,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 +686,6 @@ export class PortfolioService { netPerformanceWithCurrencyEffect: netPerformanceWithCurrencyEffectMap?.[dateRange]?.toNumber() ?? 0, quantity: quantity.toNumber(), - sectors: assetProfile.sectors, - url: assetProfile.url, valueInBaseCurrency: valueInBaseCurrency.toNumber() }; } @@ -1472,8 +1453,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 +1700,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 +1713,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/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/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 } }; 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/helper/country.helper.ts b/apps/api/src/helper/country.helper.ts new file mode 100644 index 000000000..9d14d8778 --- /dev/null +++ b/apps/api/src/helper/country.helper.ts @@ -0,0 +1,17 @@ +import { countries } from 'countries-list'; + +export function getCountryCodeByName({ + aliases = {}, + name +}: { + aliases?: Record; + name: string; +}): string { + for (const [code, country] of Object.entries(countries)) { + if (country.name === name || country.name === aliases[name]) { + return code; + } + } + + return undefined; +} diff --git a/apps/api/src/helper/sector.helper.ts b/apps/api/src/helper/sector.helper.ts new file mode 100644 index 000000000..e0face386 --- /dev/null +++ b/apps/api/src/helper/sector.helper.ts @@ -0,0 +1,28 @@ +import { SECTORS } from '@ghostfolio/common/config'; +import { SectorName } from '@ghostfolio/common/types'; + +import { Logger } from '@nestjs/common'; + +export function getSectorName({ + aliases = {}, + name +}: { + aliases?: Record; + name: string; +}): SectorName { + if (aliases[name]) { + return aliases[name]; + } + + if ((SECTORS as readonly string[]).includes(name)) { + return name as SectorName; + } + + if (name) { + const logger = new Logger('getSectorName'); + + logger.warn(`Could not map the sector "${name}" to the ontology`); + } + + return 'Other'; +} 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 f08a09a83..63185a48b 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -18,11 +18,17 @@ 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'; +const logger = new Logger('Bootstrap'); + 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[]; @@ -110,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 d5ed69d06..5d6ed79aa 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 { @@ -28,11 +29,14 @@ 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 = {}; public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public onModuleInit() { @@ -67,12 +71,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) { @@ -84,7 +90,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return response; @@ -118,13 +124,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 +189,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] = { @@ -209,7 +216,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return response; @@ -230,13 +237,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 { @@ -258,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/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..c8291a901 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,29 +1,38 @@ +import { getCountryCodeByName } from '@ghostfolio/api/helper/country.helper'; +import { getSectorName } from '@ghostfolio/api/helper/sector.helper'; 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'; +import { SectorName } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { SymbolProfile } from '@prisma/client'; -import { countries } from 'countries-list'; @Injectable() 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 = { + private static sectorsMapping: Record = { 'Consumer Discretionary': 'Consumer Cyclical', - 'Consumer Defensive': 'Consumer Staples', + 'Consumer Staples': 'Consumer Defensive', + Financials: 'Financial Services', 'Health Care': 'Healthcare', - 'Information Technology': 'Technology' + 'Information Technology': 'Technology', + Materials: 'Basic Materials' }; + private readonly logger = new Logger(TrackinsightDataEnhancerService.name); + public constructor( - private readonly configurationService: ConfigurationService + private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public async enhance({ @@ -60,12 +69,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 +93,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 {}; @@ -110,21 +121,11 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { for (const [name, value] of Object.entries( holdings?.countries ?? {} )) { - let countryCode: string; - - for (const [code, country] of Object.entries(countries)) { - if ( - country.name === name || - country.name === - TrackinsightDataEnhancerService.countriesMapping[name] - ) { - countryCode = code; - break; - } - } - response.countries.push({ - code: countryCode, + code: getCountryCodeByName({ + name, + aliases: TrackinsightDataEnhancerService.countriesMapping + }), weight: value.weight }); } @@ -158,7 +159,10 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { holdings?.sectors ?? {} )) { response.sectors.push({ - name: TrackinsightDataEnhancerService.sectorsMapping[name] ?? name, + name: getSectorName({ + name, + aliases: TrackinsightDataEnhancerService.sectorsMapping + }), weight: value.weight }); } @@ -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 ( @@ -203,9 +208,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..4fb0e96ed 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 @@ -1,12 +1,13 @@ +import { getSectorName } from '@ghostfolio/api/helper/sector.helper'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { AssetProfileDelistedError } from '@ghostfolio/api/services/data-provider/errors/asset-profile-delisted.error'; import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface'; import { DEFAULT_CURRENCY, - REPLACE_NAME_PARTS, - UNKNOWN_KEY + REPLACE_NAME_PARTS } from '@ghostfolio/common/config'; import { isCurrency } from '@ghostfolio/common/helper'; +import { SectorName } from '@ghostfolio/common/types'; import { Injectable, Logger } from '@nestjs/common'; import { @@ -23,6 +24,22 @@ import type { Price } from 'yahoo-finance2/esm/src/modules/quoteSummary-iface'; @Injectable() export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { + private static sectorsMapping: Record = { + basic_materials: 'Basic Materials', + communication_services: 'Communication Services', + consumer_cyclical: 'Consumer Cyclical', + consumer_defensive: 'Consumer Defensive', + energy: 'Energy', + financial_services: 'Financial Services', + healthcare: 'Healthcare', + industrials: 'Industrials', + realestate: 'Real Estate', + technology: 'Technology', + utilities: 'Utilities' + }; + + private readonly logger = new Logger(YahooFinanceDataEnhancerService.name); + private readonly yahooFinance = new YahooFinance({ suppressNotices: ['yahooSurvey'] }); @@ -123,7 +140,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { response.url = url; } } catch (error) { - Logger.error(error, 'YahooFinanceDataEnhancerService'); + this.logger.error(error); } return response; @@ -222,7 +239,10 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { .flatMap((sectorWeighting) => { return Object.entries(sectorWeighting).map(([sector, weight]) => { return { - name: this.parseSector(sector), + name: getSectorName({ + aliases: YahooFinanceDataEnhancerService.sectorsMapping, + name: sector + }), weight: weight as number }; }); @@ -266,7 +286,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { `No data found, ${aSymbol} (${this.getName()}) may be delisted` ); } else { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); } } @@ -329,46 +349,4 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { return { assetClass, assetSubClass }; } - - private parseSector(aString: string) { - let sector = UNKNOWN_KEY; - - switch (aString) { - case 'basic_materials': - sector = 'Basic Materials'; - break; - case 'communication_services': - sector = 'Communication Services'; - break; - case 'consumer_cyclical': - sector = 'Consumer Cyclical'; - break; - case 'consumer_defensive': - sector = 'Consumer Staples'; - break; - case 'energy': - sector = 'Energy'; - break; - case 'financial_services': - sector = 'Financial Services'; - break; - case 'healthcare': - sector = 'Healthcare'; - break; - case 'industrials': - sector = 'Industrials'; - break; - case 'realestate': - sector = 'Real Estate'; - break; - case 'technology': - sector = 'Technology'; - break; - case 'utilities': - sector = 'Utilities'; - break; - } - - return sector; - } } 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/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 8c718108c..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 @@ -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, @@ -36,11 +37,14 @@ 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'; public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -111,12 +115,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] = { @@ -126,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 {}; @@ -158,12 +160,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 }) => { @@ -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}` ); } @@ -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; @@ -290,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()})` ); } } @@ -309,7 +310,7 @@ export class EodHistoricalDataService ).toFixed(3)} seconds`; } - Logger.error(message, 'EodHistoricalDataService'); + this.logger.error(message); } return {}; @@ -430,12 +431,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 }) => { @@ -464,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 d9a43fc50..157285278 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 @@ -1,3 +1,4 @@ +import { getCountryCodeByName } from '@ghostfolio/api/helper/country.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { CryptocurrencyService } from '@ghostfolio/api/services/cryptocurrency/cryptocurrency.service'; import { AssetProfileDelistedError } from '@ghostfolio/api/services/data-provider/errors/asset-profile-delisted.error'; @@ -9,6 +10,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, @@ -32,7 +34,6 @@ import { SymbolProfile } from '@prisma/client'; import { isISIN } from 'class-validator'; -import { countries } from 'countries-list'; import { addDays, addYears, @@ -54,11 +55,14 @@ export class FinancialModelingPrepService 'Taiwan (Province of China)': 'Taiwan' }; + private readonly logger = new Logger(FinancialModelingPrepService.name); + private apiKey: string; public constructor( private readonly configurationService: ConfigurationService, private readonly cryptocurrencyService: CryptocurrencyService, + private readonly fetchService: FetchService, private readonly prismaService: PrismaService ) {} @@ -96,12 +100,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 +121,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,43 +151,37 @@ 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 }) => { return countryName.toLowerCase() !== 'other'; }) .map(({ country: countryName, weightPercentage }) => { - let countryCode: string; - - for (const [code, country] of Object.entries(countries)) { - if ( - country.name === countryName || - country.name === - FinancialModelingPrepService.countriesMapping[countryName] - ) { - countryCode = code; - break; - } - } - return { - code: countryCode, + code: getCountryCodeByName({ + aliases: FinancialModelingPrepService.countriesMapping, + name: countryName + }), weight: parseFloat(weightPercentage.slice(0, -1)) / 100 }; }); - 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 +195,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 }) => { @@ -251,7 +257,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return response; @@ -286,12 +292,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 }) => { @@ -309,12 +317,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 {}; @@ -354,12 +361,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 +431,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) { @@ -497,7 +509,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return response; @@ -525,12 +537,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 +572,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( @@ -611,7 +629,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 2b49e89c2..2b91855a6 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, @@ -32,12 +33,15 @@ 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`; public constructor( private readonly configurationService: ConfigurationService, + private readonly fetchService: FetchService, private readonly propertyService: PropertyService ) {} @@ -52,7 +56,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(), @@ -87,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; @@ -122,7 +126,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(), @@ -152,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; @@ -174,7 +178,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(), @@ -209,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( @@ -245,7 +249,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(), @@ -281,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; @@ -302,7 +306,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(), @@ -336,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 51e65e631..87e116dda 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 { @@ -30,8 +31,11 @@ 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, private readonly prismaService: PrismaService, private readonly symbolProfileService: SymbolProfileService ) {} @@ -179,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 }; } @@ -214,7 +217,7 @@ export class ManualService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'ManualService'); + this.logger.error(error); } return {}; @@ -292,7 +295,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..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 @@ -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 @@ -25,8 +26,11 @@ 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 configurationService: ConfigurationService, + private readonly fetchService: FetchService ) {} public canHandle() { @@ -120,7 +124,7 @@ export class RapidApiService implements DataProviderInterface { }; } } catch (error) { - Logger.error(error, 'RapidApiService'); + this.logger.error(error); } return {}; @@ -142,9 +146,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 +156,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) { @@ -166,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.module.ts b/apps/api/src/services/fetch/fetch.module.ts new file mode 100644 index 000000000..16e6f5f5d --- /dev/null +++ b/apps/api/src/services/fetch/fetch.module.ts @@ -0,0 +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 new file mode 100644 index 000000000..31034f81c --- /dev/null +++ b/apps/api/src/services/fetch/fetch.service.ts @@ -0,0 +1,199 @@ +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, 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 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'); + + private webFetchRoutes: WebFetchRoute[] = []; + + public constructor(private readonly propertyService: PropertyService) {} + + 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) ?? + 'GET' + ).toUpperCase(); + + const url = input instanceof Request ? input.url : input.toString(); + const urlRedacted = this.redactUrl(url); + + this.logger.debug(`${method} ${urlRedacted}`); + + 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) { + if (error instanceof Error) { + this.logger.error( + `${method} ${urlRedacted} failed: [${error.name}] ${error.message}` + ); + } else { + this.logger.error(`${method} ${urlRedacted} failed: ${String(error)}`); + } + + throw error; + } + } + + 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; + } + } + + this.logger.debug(`Routed ${this.redactUrl(url)} via web fetch tool`); + + return new Response(body, { + headers: webFetchRoute.responseContentType + ? { 'content-type': webFetchRoute.responseContentType } + : undefined + }); + } + + return undefined; + } catch (error) { + this.logger.error( + `Web fetch tool failed for ${this.redactUrl(url)}: ${ + error instanceof Error ? error.message : String(error) + }` + ); + + 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); + + 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/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/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..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 @@ -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; } @@ -176,30 +178,42 @@ 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) { - Logger.error( + this.logger.error( `Failed to enhance data for ${symbol} (${ assetProfile.dataSource }) by ${dataEnhancer.getName()}`, - error, - 'DataGatheringService' + error ); } } + const { assetClass, assetSubClass } = assetProfile; + const { - assetClass, - assetSubClass, countries, currency, cusip, @@ -212,7 +226,7 @@ export class DataGatheringService { name, sectors, url - } = assetProfile; + } = enhancedAssetProfile; try { await this.prismaService.symbolProfile.upsert({ @@ -256,11 +270,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.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..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 @@ -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, @@ -26,17 +27,17 @@ 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, private readonly propertyService: PropertyService ) {} @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(); @@ -45,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(); @@ -65,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(); @@ -85,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' ); } @@ -98,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); @@ -118,27 +106,23 @@ 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 { 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) { - Logger.error(error, 'StatisticsGatheringProcessor - DockerHub'); + this.logger.error(error); throw error; } @@ -146,11 +130,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); @@ -166,7 +152,7 @@ export class StatisticsGatheringProcessor { value }); } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + this.logger.error(error); throw error; } @@ -174,19 +160,18 @@ 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) { - Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + this.logger.error(error); throw error; } @@ -194,26 +179,28 @@ 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) { - Logger.error(error, 'StatisticsGatheringProcessor - Better Stack'); + this.logger.error(error); throw error; } 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/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); } } 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/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/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.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index 560a00164..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; @@ -246,6 +248,8 @@ export class GfAssetProfileDialogComponent implements OnInit { [name: string]: { name: string; value: number }; }; + protected readonly translate = translate; + protected user: User; private benchmarks: Partial[]; @@ -367,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 }; } @@ -381,7 +385,7 @@ export class GfAssetProfileDialogComponent implements OnInit { ) { for (const { name, weight } of this.assetProfile.sectors) { this.sectors[name] = { - name, + name: translate(name), 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 b2a7e0a05..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 @@ -1,10 +1,10 @@
-
-

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

+
+ {{ + assetProfile?.name ?? data.symbol + }}
@@ -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/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; 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..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[]; @@ -157,6 +162,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { public SymbolProfile: EnhancedSymbolProfile; public tags: Tag[]; public tagsAvailable: Tag[]; + public translate = translate; public user: User; public value: number; @@ -433,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 }; } @@ -442,7 +451,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..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 @@ -262,7 +262,7 @@ i18n size="medium" [locale]="data.locale" - [value]="SymbolProfile.sectors[0].name" + [value]="translate(SymbolProfile.sectors[0].name)" >Sector
@@ -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/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/components/user-detail-dialog/user-detail-dialog.component.scss b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss index b63df0134..542c252a5 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.scss @@ -4,4 +4,8 @@ .mat-mdc-dialog-content { max-height: unset; } + + .mat-mdc-dialog-title { + padding-right: 0.5rem !important; + } } diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html index e9af86942..caf1679eb 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1,6 +1,6 @@ -
+
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..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

- - - -
+ }
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..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, @@ -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,25 +332,28 @@ 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) { - const { code, continent, name, weight } = country; + if (position.assetProfile.countries.length > 0) { + for (const country of position.assetProfile.countries) { + const { code, continent, weight } = country; if (this.continents[continent]?.value) { this.continents[continent].value += @@ -361,7 +363,7 @@ export class GfAllocationsPageComponent implements OnInit { : position.valueInPercentage); } else { this.continents[continent] = { - name: continent, + name: translate(continent), value: weight * (isNumber(position.valueInBaseCurrency) @@ -378,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) @@ -401,12 +406,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 +433,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) { @@ -440,7 +445,7 @@ export class GfAllocationsPageComponent implements OnInit { : position.valueInPercentage); } else { this.sectors[name] = { - name, + name: translate(name), value: weight * (isNumber(position.valueInBaseCurrency) @@ -463,8 +468,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 +522,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 +536,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.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 4c5c61bd8..ec90fccec 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; }; }; @@ -182,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] @@ -202,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] @@ -229,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/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/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..fd0ca79d6 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 + Energie + + 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 + Defensive Konsumgüter + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Gutscheincode wurde eingelöst @@ -1273,6 +1289,14 @@ 67 + + Utilities + Versorgungsbetriebe + + 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 + Zyklische Konsumgüter + + 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 + Kommunikationsdienste + + 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 + Technologie + + 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 + Grundstoffe + + 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 + Industrie + + 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 + Gesundheitswesen + + 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 + Finanzdienstleistungen + + 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 edc28f604..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 @@ -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 @@ -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 @@ -1388,7 +1412,7 @@ By - By + До apps/client/src/app/pages/portfolio/fire/fire-page.html 139 @@ -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 - 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 @@ -2108,7 +2124,7 @@ Code - Code + Код apps/client/src/app/components/admin-overview/admin-overview.html 159 @@ -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 - 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 @@ -3204,7 +3236,7 @@ for - for + для apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 128 @@ -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 @@ -3560,7 +3592,7 @@ Duration - Duration + Тривалість apps/client/src/app/components/admin-overview/admin-overview.html 172 @@ -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 @@ -4897,7 +4937,7 @@ here - here + тут apps/client/src/app/pages/pricing/pricing-page.html 347 @@ -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 @@ -5113,7 +5153,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 @@ -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,15 +6431,15 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 Loan - Loan + Позика 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,12 +6995,12 @@ Роки libs/ui/src/lib/i18n.ts - 32 + 34 Role - Role + Роль apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 39 @@ -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,12 +7131,16 @@ Нерухомість libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 Authentication - Authentication + Автентифікація apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 60 @@ -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,23 +7379,23 @@ Запит AI скопійовано в буфер обміну apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 Lazy - Lazy + Лінивий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 Instant - Instant + Миттєвий apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,23 +7403,23 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 487 Mode - Mode + Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 524 Selector - 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,15 +7435,15 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 real-time - real-time + реальний час apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,12 +7451,12 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 Create - Create + Створити libs/ui/src/lib/tags-selector/tags-selector.component.html 50 @@ -7556,10 +7464,10 @@ Change - Change + Змінити libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7568,18 +7476,18 @@ Performance - Performance + Дохідність apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html 6 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 @@ -7672,7 +7556,7 @@ Continue - Continue + Продовжити apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 57 @@ -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 @@ -7732,7 +7608,7 @@ terms-of-service - terms-of-service + umovy-nadannia-posluh kebab-case libs/common/src/lib/routes/routes.ts @@ -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,12 +7652,12 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 Apply - Apply + Застосувати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 154 @@ -7837,10 +7713,10 @@ someone - someone + когось apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7853,7 +7729,7 @@ Watchlist - Watchlist + Список спостереження apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -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 @@ -7897,7 +7773,7 @@ changelog - changelog + zhurnal-zmin kebab-case libs/common/src/lib/routes/routes.ts @@ -8030,7 +7906,7 @@ personal-finance-tools - personal-finance-tools + instrumenty-osobystykh-finansiv kebab-case libs/common/src/lib/routes/routes.ts @@ -8047,7 +7923,7 @@ markets - markets + rynky kebab-case libs/common/src/lib/routes/routes.ts @@ -8108,7 +7984,7 @@ Available - Available + Доступно apps/client/src/app/components/data-provider-status/data-provider-status.component.html 3 @@ -8116,7 +7992,7 @@ Unavailable - Unavailable + Недоступно apps/client/src/app/components/data-provider-status/data-provider-status.component.html 5 @@ -8127,12 +8003,12 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 new - new + новий apps/client/src/app/components/admin-settings/admin-settings.component.html 79 @@ -8140,7 +8016,7 @@ Investment - Investment + Інвестиція apps/client/src/app/pages/i18n/i18n-page.html 15 @@ -8164,7 +8040,7 @@ Equity - Equity + Акції apps/client/src/app/pages/i18n/i18n-page.html 41 @@ -8252,7 +8128,7 @@ Investment - Investment + Інвестиція apps/client/src/app/pages/i18n/i18n-page.html 95 @@ -8276,7 +8152,7 @@ start - start + pochatok kebab-case libs/common/src/lib/routes/routes.ts @@ -8292,12 +8168,12 @@ 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 Generate - Generate + Згенерувати apps/client/src/app/components/user-account-access/user-account-access.html 45 @@ -8313,7 +8189,7 @@ Stocks - Stocks + Акції apps/client/src/app/components/markets/markets.component.ts 51 @@ -8325,7 +8201,7 @@ Cryptocurrencies - Cryptocurrencies + Криптовалюти apps/client/src/app/components/markets/markets.component.ts 52 @@ -8348,7 +8224,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 472 @@ -8356,15 +8232,15 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 Collectible - 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 @@ -8421,7 +8297,7 @@ Fees - Fees + Комісії apps/client/src/app/pages/i18n/i18n-page.html 161 @@ -8429,7 +8305,7 @@ Liquidity - Liquidity + Ліквідність apps/client/src/app/pages/i18n/i18n-page.html 70 @@ -8565,7 +8441,7 @@ Asia-Pacific - Asia-Pacific + Азіатсько-Тихоокеанський регіон apps/client/src/app/pages/i18n/i18n-page.html 165 @@ -8629,7 +8505,7 @@ Europe - Europe + Європа apps/client/src/app/pages/i18n/i18n-page.html 195 @@ -8661,7 +8537,7 @@ Japan - Japan + Японія apps/client/src/app/pages/i18n/i18n-page.html 209 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 diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 1eb5bd2dd..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,17 +358,13 @@ ngx-skeleton-loader { } .gf-table { - @include gf-table; + @include table.gf-table; } .gf-text-wrap-balance { 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 +485,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/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 113dffe4a..5f2dd9a1c 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', @@ -281,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/helper.ts b/libs/common/src/lib/helper.ts index c5f6cbbb9..ce7fca518 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 @@ -215,6 +258,20 @@ export function getCurrencyFromSymbol(aSymbol = '') { return aSymbol.replace(DEFAULT_CURRENCY, ''); } +export function getCountryName({ + code, + locale = getLocale() +}: { + code: string; + locale?: string; +}): 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/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/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..86cb1ca48 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, @@ -15,23 +16,26 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'allvue-systems', name: 'Allvue Systems', - origin: 'United States', - slogan: 'Investment Software Suite' + origin: 'US', + 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, hasSelfHostingAbility: false, key: 'altoo', name: 'Altoo Wealth Platform', - origin: 'Switzerland', - slogan: 'Simplicity for Complex Wealth' + origin: 'CH', + slogan: 'Simplicity for Complex Wealth', + url: 'https://altoo.io' }, { founded: 2018, @@ -39,8 +43,9 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'altruist', name: 'Altruist', - origin: 'United States', - slogan: 'The wealth platform built for independent advisors' + origin: 'US', + slogan: 'The wealth platform built for independent advisors', + url: 'https://altruist.com' }, { founded: 2023, @@ -48,9 +53,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'amsflow', name: 'Amsflow Portfolio', - origin: 'Singapore', + origin: 'SG', pricingPerYear: '$228', - slogan: 'Portfolio Visualizer' + slogan: 'Portfolio Visualizer', + url: 'https://amsflow.com' }, { founded: 2018, @@ -59,9 +65,10 @@ export const personalFinanceTools: Product[] = [ key: 'anlage.app', languages: ['English'], name: 'Anlage.App', - origin: 'Austria', + origin: 'AT', pricingPerYear: '$120', - slogan: 'Analyze and track your portfolio.' + slogan: 'Analyze and track your portfolio.', + url: 'https://anlage.app' }, { founded: 2022, @@ -69,15 +76,17 @@ export const personalFinanceTools: Product[] = [ key: 'asseta', languages: ['English'], name: 'Asseta', - origin: 'United States', - slogan: 'The Intelligent Family Office Suite' + origin: 'US', + slogan: 'The Intelligent Family Office Suite', + url: 'https://www.asseta.ai' }, { founded: 2016, key: 'atominvest', name: 'Atominvest', - origin: 'United Kingdom', - slogan: 'Portfolio Management' + origin: 'GB', + slogan: 'Portfolio Management', + url: 'https://www.atominvest.co' }, { founded: 2020, @@ -85,18 +94,20 @@ 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' + slogan: 'The Smarter Way to Track Your Finances', + url: 'https://www.balancepro.app' }, { hasFreePlan: false, hasSelfHostingAbility: true, key: 'banktivity', name: 'Banktivity', - origin: 'United States', + origin: 'US', 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, @@ -112,9 +124,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'beanvest', name: 'Beanvest', - origin: 'France', + origin: 'FR', pricingPerYear: '$100', - slogan: 'Stock Portfolio Tracker for Smart Investors' + slogan: 'Stock Portfolio Tracker for Smart Investors', + url: 'https://beanvest.com' }, { founded: 2024, @@ -122,8 +135,9 @@ export const personalFinanceTools: Product[] = [ key: 'bluebudget', languages: ['Deutsch', 'English', 'Français', 'Italiano'], name: 'BlueBudget', - origin: 'Switzerland', - slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung' + origin: 'CH', + slogan: 'Schweizer Budget App für einfache & smarte Budgetplanung', + url: 'https://www.bluebudget.ch' }, { founded: 2015, @@ -132,15 +146,17 @@ 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' + 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!' + origin: 'US', + slogan: 'Giving life to your finance!', + url: 'https://www.budgetpulse.com' }, { founded: 2007, @@ -148,26 +164,28 @@ 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' + slogan: 'Take control of your financial future', + url: 'https://www.buxfer.com' }, { hasFreePlan: true, hasSelfHostingAbility: false, key: 'capitally', name: 'Capitally', - origin: 'Poland', + origin: 'PL', pricingPerYear: '€80', - slogan: 'Optimize your investments performance' + slogan: 'Optimize your investments performance', + url: 'https://www.mycapitally.com' }, { founded: 2022, isArchived: true, key: 'capmon', name: 'CapMon.org', - origin: 'Germany', + origin: 'DE', note: 'CapMon.org was discontinued in 2023', slogan: 'Next Generation Assets Tracking' }, @@ -184,8 +202,9 @@ export const personalFinanceTools: Product[] = [ founded: 2011, key: 'cobalt', name: 'Cobalt', - origin: 'United States', - slogan: 'Next-Level Portfolio Monitoring' + origin: 'US', + slogan: 'Next-Level Portfolio Monitoring', + url: 'https://www.cobalt.pe' }, { founded: 2017, @@ -193,9 +212,10 @@ 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' + slogan: 'Manage All Your Wallets & Exchanges From One Place', + url: 'https://coinstats.app' }, { founded: 2013, @@ -204,16 +224,18 @@ 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' + 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' + origin: 'US', + slogan: 'Modern Wealth & Investment Management', + url: 'https://compoundplanning.com' }, { founded: 2019, @@ -221,33 +243,37 @@ 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' + slogan: 'Do money better with Copilot', + url: 'https://www.copilot.money' }, { founded: 2014, hasFreePlan: false, key: 'countabout', name: 'CountAbout', - origin: 'United States', + origin: 'US', pricingPerYear: '$9.99', - slogan: 'Customizable and Secure Personal Finance App' + slogan: 'Customizable and Secure Personal Finance App', + url: 'https://countabout.com' }, { founded: 2023, hasFreePlan: false, key: 'danti', name: 'Danti', - origin: 'United Kingdom', - slogan: 'Digitising Generational Wealth' + origin: 'GB', + 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, @@ -256,9 +282,10 @@ 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' + slogan: 'DeFi Portfolio Tracker for All Chains', + url: 'https://zerion.io/defi-portfolio-tracker' }, { founded: 2022, @@ -267,9 +294,10 @@ 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' + slogan: 'Democratizing Data Analytics', + url: 'https://capitalyse.app/app/degiro' }, { founded: 2017, @@ -278,9 +306,10 @@ 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.' + 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, @@ -298,9 +328,10 @@ export const personalFinanceTools: Product[] = [ key: 'divvydiary', languages: ['Deutsch', 'English'], name: 'DivvyDiary', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€65', - slogan: 'Your personal Dividend Calendar' + slogan: 'Your personal Dividend Calendar', + url: 'https://divvydiary.com' }, { founded: 2009, @@ -308,24 +339,27 @@ export const personalFinanceTools: Product[] = [ key: 'empower', name: 'Empower', note: 'Originally named as Personal Capital', - origin: 'United States', - slogan: 'Get answers to your money questions' + origin: 'US', + slogan: 'Get answers to your money questions', + url: 'https://www.empower.com' }, { alias: '8figures', founded: 2022, key: 'eightfigures', name: '8FIGURES', - origin: 'United States', - slogan: 'Portfolio Tracker Designed by Professional Investors' + origin: 'US', + slogan: 'Portfolio Tracker Designed by Professional Investors', + url: 'https://8figures.com' }, { founded: 2010, hasFreePlan: false, key: 'etops', name: 'etops', - origin: 'Switzerland', - slogan: 'Your financial superpower' + origin: 'CH', + slogan: 'Your financial superpower', + url: 'https://www.etops.com' }, { founded: 2020, @@ -333,9 +367,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'exirio', name: 'Exirio', - origin: 'United States', + origin: 'US', pricingPerYear: '$100', - slogan: 'All your wealth, in one place.' + slogan: 'All your wealth, in one place.', + url: 'https://www.exirio.com' }, { founded: 2018, @@ -343,9 +378,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'fey', name: 'Fey', - origin: 'Canada', + origin: 'CA', pricingPerYear: '$300', - slogan: 'Make better investments.' + slogan: 'Make better investments.', + url: 'https://fey.com' }, { founded: 2023, @@ -354,9 +390,10 @@ export const personalFinanceTools: Product[] = [ key: 'fina', languages: ['English'], name: 'Fina', - origin: 'United States', + origin: 'US', pricingPerYear: '$115', - slogan: 'Flexible Financial Management' + slogan: 'Flexible Financial Management', + url: 'https://www.fina.money' }, { founded: 2023, @@ -364,17 +401,19 @@ 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' + slogan: 'Portfolio Tracker für dein Vermögen', + url: 'https://www.finanzfluss.de/copilot' }, { founded: 2020, key: 'finary', languages: ['Deutsch', 'English', 'Français'], name: 'Finary', - origin: 'United States', - slogan: 'Real-Time Portfolio Tracker & Stock Tracker' + origin: 'US', + slogan: 'Real-Time Portfolio Tracker & Stock Tracker', + url: 'https://finary.com' }, { founded: 2021, @@ -383,33 +422,37 @@ 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' + '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' + origin: 'VG', + slogan: 'Easy-to-use Portfolio Tracker', + url: 'https://fincake.io' }, { founded: 2021, hasSelfHostingAbility: false, key: 'finvest', name: 'Finvest', - origin: 'United States', - slogan: 'Grow your wealth in a stress-free way' + origin: 'US', + slogan: 'Grow your wealth in a stress-free way', + url: 'https://www.getfinvest.com' }, { founded: 2023, hasFreePlan: true, key: 'finwise', name: 'FinWise', - origin: 'South Africa', + origin: 'ZA', pricingPerYear: '€69.99', - slogan: 'Personal finances, simplified' + slogan: 'Personal finances, simplified', + url: 'https://finwiseapp.io' }, { founded: 2021, @@ -418,9 +461,10 @@ 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' + slogan: 'A simple solution to track your wealth online', + url: 'https://firekit.space' }, { hasFreePlan: true, @@ -428,9 +472,10 @@ export const personalFinanceTools: Product[] = [ key: 'folishare', languages: ['Deutsch', 'English'], name: 'folishare', - origin: 'Austria', + origin: 'AT', pricingPerYear: '$65', - slogan: 'Take control over your investments' + slogan: 'Take control over your investments', + url: 'https://www.folishare.com' }, { hasFreePlan: true, @@ -445,10 +490,11 @@ export const personalFinanceTools: Product[] = [ 'Português' ], name: 'Gasti', - origin: 'Argentina', + origin: 'AR', 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, @@ -457,9 +503,10 @@ export const personalFinanceTools: Product[] = [ key: 'getquin', languages: ['Deutsch', 'English'], name: 'getquin', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€48', - slogan: 'Portfolio Tracker, Analysis & Community' + slogan: 'Portfolio Tracker, Analysis & Community', + url: 'https://www.getquin.com' }, { hasFreePlan: true, @@ -468,17 +515,30 @@ export const personalFinanceTools: Product[] = [ key: 'gospatz', name: 'goSPATZ', note: 'Renamed to Money Peak', - origin: 'Germany', + origin: 'DE', slogan: 'Volle Kontrolle über deine Investitionen' }, + { + founded: 2024, + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'gustav', + languages: ['Français'], + name: 'Gustav', + origin: 'FR', + pricingPerYear: '€59.99', + slogan: 'Prenez enfin le contrôle de votre argent', + url: 'https://get-gustav.com' + }, { hasFreePlan: true, hasSelfHostingAbility: false, 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 }, { @@ -486,8 +546,9 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'honeydue', name: 'Honeydue', - origin: 'United States', - slogan: 'Finance App for Couples' + origin: 'US', + slogan: 'Finance App for Couples', + url: 'https://www.honeydue.com' }, { founded: 2022, @@ -495,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' }, { @@ -505,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' }, @@ -514,8 +575,9 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'investify', name: 'Investify', - origin: 'Pakistan', - slogan: 'Advanced portfolio tracking and stock market information' + origin: 'PK', + slogan: 'Advanced portfolio tracking and stock market information', + url: 'https://www.investify.pk' }, { founded: 2021, @@ -524,9 +586,10 @@ 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', useAnonymously: true }, { @@ -535,9 +598,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'justetf', name: 'justETF', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€119', - slogan: 'ETF portfolios made simple' + slogan: 'ETF portfolios made simple', + url: 'https://www.justetf.com' }, { founded: 2018, @@ -545,8 +609,9 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'koinly', name: 'Koinly', - origin: 'Singapore', - slogan: 'Track all your crypto wallets in one place' + origin: 'SG', + slogan: 'Track all your crypto wallets in one place', + url: 'https://koinly.io' }, { founded: 2016, @@ -554,9 +619,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'koyfin', name: 'Koyfin', - origin: 'United States', + origin: 'US', pricingPerYear: '$468', - slogan: 'Comprehensive financial data analysis' + slogan: 'Comprehensive financial data analysis', + url: 'https://www.koyfin.com' }, { founded: 2019, @@ -564,9 +630,10 @@ 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' + slogan: 'The Time Machine for your Net Worth', + url: 'https://www.kubera.com' }, { founded: 2021, @@ -574,8 +641,9 @@ export const personalFinanceTools: Product[] = [ key: 'leafs', languages: ['Deutsch', 'English'], name: 'Leafs', - origin: 'Switzerland', - slogan: 'Sustainability insights for wealth managers' + origin: 'CH', + slogan: 'Sustainability insights for wealth managers', + url: 'https://leafs.ch' }, { founded: 2018, @@ -583,9 +651,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'magnifi', name: 'Magnifi', - origin: 'United States', + origin: 'US', pricingPerYear: '$132', - slogan: 'AI Investing Assistant' + slogan: 'AI Investing Assistant', + url: 'https://magnifi.com' }, { founded: 2022, @@ -594,17 +663,19 @@ export const personalFinanceTools: Product[] = [ key: 'markets.sh', languages: ['English'], name: 'markets.sh', - origin: 'Germany', + origin: 'DE', 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' + origin: 'US', + slogan: 'Your platform for wealth in full view', + url: 'https://masttro.com' }, { founded: 2021, @@ -616,10 +687,11 @@ 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' + slogan: 'Your financial future, in your control', + url: 'https://github.com/maybe-finance/maybe' }, { hasFreePlan: false, @@ -627,10 +699,11 @@ 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' + slogan: 'The smartest way to track your crypto', + url: 'https://www.merlincrypto.com' }, { founded: 1991, @@ -639,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, @@ -647,9 +720,10 @@ 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' + slogan: 'The modern way to manage your money', + url: 'https://www.monarch.com' }, { founded: 1999, @@ -657,9 +731,10 @@ 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' + slogan: 'Personal Finance Manager for Mac, Windows, and Linux', + url: 'https://moneydance.com' }, { hasFreePlan: true, @@ -667,24 +742,27 @@ export const personalFinanceTools: Product[] = [ key: 'moneypeak', name: 'Money Peak', note: 'Originally named as goSPATZ', - origin: 'Germany', - slogan: 'Dein smarter Finance Assistant' + origin: 'DE', + slogan: 'Dein smarter Finance Assistant', + url: 'https://moneypeak.ai' }, { founded: 2007, 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' + slogan: 'Have total control of your financial life', + url: 'https://www.moneyspire.com' }, { key: 'moneywiz', name: 'MoneyWiz', - origin: 'United States', + origin: 'US', pricingPerYear: '$29.99', - slogan: 'Get money management superpowers' + slogan: 'Get money management superpowers', + url: 'https://www.wiz.money' }, { hasFreePlan: false, @@ -692,7 +770,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, @@ -701,9 +780,10 @@ export const personalFinanceTools: Product[] = [ key: 'monsy', languages: ['English'], name: 'Monsy', - origin: 'Indonesia', + origin: 'ID', pricingPerYear: '$20', - slogan: 'Smart, simple, stress-free money tracking.' + slogan: 'Smart, simple, stress-free money tracking.', + url: 'https://www.monsy.app' }, { hasFreePlan: true, @@ -711,9 +791,20 @@ 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.' + '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, @@ -721,9 +812,10 @@ 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' + slogan: 'Your Complete Crypto Portfolio, Reimagined', + url: 'https://www.nansen.ai/crypto-portfolio-tracker' }, { founded: 2017, @@ -731,9 +823,19 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'navexa', name: 'Navexa', - origin: 'Australia', + origin: 'AU', pricingPerYear: '$90', - slogan: 'The Intelligent Portfolio Tracker' + 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, @@ -742,24 +844,27 @@ 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' + 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' + 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.' + slogan: 'Your money. Made simple.', + url: 'https://www.getpennies.com' }, { founded: 2022, @@ -767,9 +872,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'pinklion', name: 'PinkLion', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€50', - slogan: 'Invest smarter, not harder' + slogan: 'Invest smarter, not harder', + url: 'https://pinklion.xyz' }, { founded: 2023, @@ -778,17 +884,19 @@ export const personalFinanceTools: Product[] = [ key: 'plainzer', languages: ['English'], name: 'Plainzer', - origin: 'Poland', + origin: 'PL', pricingPerYear: '$74', - slogan: 'Free dividend tracker for your portfolio' + slogan: 'Free dividend tracker for your portfolio', + url: 'https://plainzer.com' }, { founded: 2023, hasSelfHostingAbility: false, key: 'plannix', name: 'Plannix', - origin: 'Italy', - slogan: 'Your Personal Finance Hub' + origin: 'IT', + slogan: 'Your Personal Finance Hub', + url: 'https://www.plannix.co' }, { founded: 2015, @@ -796,9 +904,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'pocketguard', name: 'PocketGuard', - origin: 'United States', + origin: 'US', pricingPerYear: '$74.99', - slogan: 'Budgeting App & Finance Planner' + slogan: 'Budgeting App & Finance Planner', + url: 'https://pocketguard.com' }, { founded: 2008, @@ -807,10 +916,11 @@ 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' + slogan: 'Know where your money is going', + url: 'https://www.pocketsmith.com' }, { hasFreePlan: false, @@ -818,9 +928,10 @@ 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' + slogan: 'Manage all your portfolios', + url: 'https://portfoliodividendtracker.com' }, { hasFreePlan: true, @@ -829,7 +940,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, @@ -847,9 +959,10 @@ 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' + slogan: 'Portfolio Performance and Dividend Tracker', + url: 'https://www.portseido.com' }, { founded: 2021, @@ -857,9 +970,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: true, key: 'projectionlab', name: 'ProjectionLab', - origin: 'United States', + origin: 'US', pricingPerYear: '$108', - slogan: 'Build Financial Plans You Love.' + slogan: 'Build Financial Plans You Love.', + url: 'https://projectionlab.com' }, { founded: 2022, @@ -867,17 +981,30 @@ 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' + 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, key: 'rocket-money', name: 'Rocket Money', - origin: 'United States', - slogan: 'Track your net worth' + origin: 'US', + slogan: 'Track your net worth', + url: 'https://www.rocketmoney.com' }, { founded: 2019, @@ -886,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' }, { @@ -895,16 +1022,18 @@ 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' + 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' + origin: 'RO', + slogan: 'Wealth Management and Net Worth Tracking', + url: 'https://www.segmio.com' }, { founded: 2007, @@ -912,10 +1041,11 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'sharesight', name: 'Sharesight', - origin: 'New Zealand', + origin: 'NZ', pricingPerYear: '$135', regions: ['Global'], - slogan: 'Stock Portfolio Tracker' + slogan: 'Stock Portfolio Tracker', + url: 'https://www.sharesight.com' }, { hasFreePlan: true, @@ -930,9 +1060,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'simple-portfolio', name: 'Simple Portfolio', - origin: 'Czech Republic', + origin: 'CZ', pricingPerYear: '€80', - slogan: 'Stock Portfolio Tracker' + slogan: 'Stock Portfolio Tracker', + url: 'https://simpleportfolio.app' }, { founded: 2014, @@ -940,9 +1071,10 @@ 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' + slogan: 'Smart portfolio tracker for informed investors', + url: 'https://simplywall.st' }, { founded: 2021, @@ -950,14 +1082,15 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'snowball-analytics', name: 'Snowball Analytics', - origin: 'France', + origin: 'FR', pricingPerYear: '$80', - slogan: 'Simple and powerful portfolio tracker' + slogan: 'Simple and powerful portfolio tracker', + url: 'https://snowball-analytics.com' }, { key: 'splashmoney', name: 'SplashMoney', - origin: 'United States', + origin: 'US', slogan: 'Manage your money anytime, anywhere.' }, { @@ -965,21 +1098,23 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'stock-events', name: 'Stock Events', - origin: 'Germany', - slogan: 'Track all your Investments' + origin: 'DE', + slogan: 'Track all your Investments', + url: 'https://stockevents.app' }, { key: 'stockle', name: 'Stockle', - origin: 'Finland', - slogan: 'Supercharge your investments tracking experience' + origin: 'FI', + slogan: 'Supercharge your investments tracking experience', + url: 'https://stockle.app' }, { founded: 2008, isArchived: true, key: 'stockmarketeye', name: 'StockMarketEye', - origin: 'France', + origin: 'FR', note: 'StockMarketEye was discontinued in 2023', slogan: 'A Powerful Portfolio & Investment Tracking App' }, @@ -989,9 +1124,10 @@ 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' + slogan: 'Investment Research and Portfolio Management', + url: 'https://www.stockrover.com' }, { hasFreePlan: true, @@ -999,28 +1135,31 @@ export const personalFinanceTools: Product[] = [ key: 'stonksfolio', languages: ['English'], name: 'Stonksfolio', - origin: 'Bulgaria', + origin: 'BG', pricingPerYear: '€49.90', - slogan: 'Visualize all of your portfolios' + slogan: 'Visualize all of your portfolios', + url: 'https://stonksfolio.com' }, { hasFreePlan: true, hasSelfHostingAbility: false, key: 'sumio', name: 'Sumio', - origin: 'Czech Republic', + origin: 'CZ', pricingPerYear: '$20', - slogan: 'Sum up and build your wealth.' + slogan: 'Sum up and build your wealth.', + url: 'https://www.sumio.app' }, { founded: 2016, hasFreePlan: false, key: 'tiller', name: 'Tiller', - origin: 'United States', + origin: 'US', 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, @@ -1028,9 +1167,29 @@ 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' + 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, @@ -1040,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' }, @@ -1050,9 +1209,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'turbobulls', name: 'Turbobulls', - origin: 'Romania', + origin: 'RO', pricingPerYear: '€39.99', - slogan: 'Your complete financial dashboard. Actually private.' + slogan: 'Your complete financial dashboard. Actually private.', + url: 'https://www.turbobulls.com' }, { hasFreePlan: true, @@ -1060,9 +1220,10 @@ 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', useAnonymously: true }, { @@ -1070,9 +1231,10 @@ 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' + slogan: 'Virtual Family Office for Smart Wealth Management', + url: 'https://vyzer.co' }, { founded: 2020, @@ -1080,9 +1242,10 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'walletguide', name: 'Walletguide', - origin: 'Germany', + origin: 'DE', pricingPerYear: '€90', - slogan: 'Personal finance reimagined with AI' + slogan: 'Personal finance reimagined with AI', + url: 'https://walletguide.com' }, { hasSelfHostingAbility: false, @@ -1091,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' }, @@ -1101,8 +1264,9 @@ export const personalFinanceTools: Product[] = [ key: 'wealthbrain', languages: ['English'], name: 'Wealthbrain', - origin: 'United Arab Emirates', - slogan: 'Portfolio Management System' + origin: 'AE', + slogan: 'Portfolio Management System', + url: 'https://wealthbrain.com' }, { founded: 2024, @@ -1112,8 +1276,9 @@ export const personalFinanceTools: Product[] = [ key: 'wealthfolio', languages: ['English'], name: 'Wealthfolio', - origin: 'Canada', - slogan: 'Desktop Investment Tracker' + origin: 'CA', + slogan: 'Desktop Investment Tracker', + url: 'https://wealthfolio.app' }, { founded: 2015, @@ -1122,9 +1287,10 @@ 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' + slogan: 'See all your investments in one place', + url: 'https://wealthica.com' }, { founded: 2018, @@ -1132,7 +1298,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, @@ -1140,13 +1307,14 @@ export const personalFinanceTools: Product[] = [ key: 'wealthy-tracker', languages: ['English'], name: 'Wealthy Tracker', - origin: 'India', - slogan: 'One app to manage all your investments' + 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' }, { @@ -1158,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.' }, @@ -1168,9 +1336,10 @@ 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' + slogan: 'Change Your Relationship With Money', + url: 'https://www.ynab.com' }, { founded: 2019, @@ -1178,8 +1347,9 @@ export const personalFinanceTools: Product[] = [ hasSelfHostingAbility: false, key: 'ziggma', name: 'Ziggma', - origin: 'United States', + origin: 'US', pricingPerYear: '$84', - slogan: 'Your solution for investing success' + slogan: 'Your solution for investing success', + url: 'https://ziggma.com' } ]; 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/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() { 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/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..78cfe47e2 --- /dev/null +++ b/libs/ui/src/lib/fab/fab.component.scss @@ -0,0 +1,32 @@ +:host { + display: block; + + // Reserve space so a floating action button does not overlap trailing content + height: calc(constant(safe-area-inset-bottom) + 7rem); + height: calc(env(safe-area-inset-bottom) + 7rem); + + @media (min-width: 576px) { + height: calc(constant(safe-area-inset-bottom) + 5rem); + height: calc(env(safe-area-inset-bottom) + 5rem); + } + + .mat-mdc-fab { + 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) { + height: calc(constant(safe-area-inset-bottom) + 6rem); + height: calc(env(safe-area-inset-bottom) + 6rem); + + .mat-mdc-fab { + 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/i18n.ts b/libs/ui/src/lib/i18n.ts index c7d8b7c8b..2c037c7d1 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 = { @@ -73,42 +75,27 @@ 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`, 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; 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/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; 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) ); } 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 22f139975..e2c41e956 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 @@ -36,8 +36,6 @@ import Color from 'color'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import OpenColor from 'open-color'; -import { translate } from '../i18n'; - const { blue, cyan, @@ -389,7 +387,7 @@ export class GfPortfolioProportionChartComponent return value > 0 ? isUUID(symbol) - ? (translate(this.data[symbol]?.name) ?? symbol) + ? (this.data[symbol]?.name ?? symbol) : symbol : ''; }, @@ -452,7 +450,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/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 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; diff --git a/package-lock.json b/package-lock.json index 19597a7aa..690f617c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.5.0", + "version": "3.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.5.0", + "version": "3.8.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -94,7 +94,8 @@ "svgmap": "2.19.3", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", - "yahoo-finance2": "3.14.0", + "undici": "7.24.4", + "yahoo-finance2": "3.14.2", "zone.js": "0.16.1" }, "devDependencies": { @@ -113,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", @@ -149,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", @@ -7272,13 +7273,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" } @@ -7297,14 +7298,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" }, @@ -7316,16 +7317,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", @@ -7354,23 +7355,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" @@ -7434,56 +7435,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" @@ -7498,19 +7499,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", @@ -7527,43 +7528,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": { @@ -7576,9 +7577,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": { @@ -7587,15 +7588,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": { @@ -8820,20 +8821,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", @@ -8881,15 +8882,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", @@ -8906,9 +8907,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": { @@ -8977,32 +8978,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" }, @@ -9016,14 +9017,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", @@ -9058,16 +9059,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", @@ -9121,9 +9122,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": { @@ -9134,8 +9135,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", @@ -9202,18 +9203,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", @@ -9634,41 +9635,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" ], @@ -9680,9 +9681,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" ], @@ -9694,9 +9695,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" ], @@ -9708,9 +9709,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" ], @@ -9722,9 +9723,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" ], @@ -9736,9 +9737,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" ], @@ -9750,9 +9751,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" ], @@ -9764,9 +9765,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" ], @@ -9778,9 +9779,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" ], @@ -9792,9 +9793,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" ], @@ -9806,16 +9807,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", @@ -10315,22 +10316,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": { @@ -10340,26 +10341,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": { @@ -10383,15 +10384,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", @@ -10603,17 +10604,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", @@ -18527,9 +18528,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": [ { @@ -18547,7 +18548,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -27342,9 +27343,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, @@ -28943,9 +28944,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", @@ -29490,9 +29491,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", @@ -29514,7 +29515,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", @@ -29595,7 +29596,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", @@ -29604,7 +29605,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" }, @@ -29613,16 +29614,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", @@ -29699,9 +29700,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": { @@ -30032,19 +30033,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", @@ -35604,9 +35592,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": { @@ -35786,15 +35774,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": { @@ -35842,14 +35830,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": { @@ -35864,15 +35852,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": { @@ -35887,17 +35875,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" }, @@ -35913,9 +35901,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": { @@ -35930,15 +35918,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" @@ -35952,13 +35940,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" @@ -35972,13 +35960,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": { @@ -35993,14 +35981,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" }, @@ -36143,20 +36131,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", @@ -36275,9 +36263,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": { @@ -36291,8 +36279,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": { @@ -38319,9 +38313,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", @@ -38373,6 +38367,22 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "devOptional": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yargs": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", diff --git a/package.json b/package.json index 857313cae..04f125aa7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.5.0", + "version": "3.8.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -138,7 +138,8 @@ "svgmap": "2.19.3", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", - "yahoo-finance2": "3.14.0", + "undici": "7.24.4", + "yahoo-finance2": "3.14.2", "zone.js": "0.16.1" }, "devDependencies": { @@ -157,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", @@ -193,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", 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 }));