diff --git a/CHANGELOG.md b/CHANGELOG.md index 495618e37..0e3ae9649 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,128 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## Unreleased + +### Added + +- Added an icon to indicate external links in the page tabs component +- Added the Korean (`ko`) language to the footer + +### Changed + +- Moved the endpoint to get the asset profiles from `GET api/v1/admin/market-data` to `GET api/v1/asset-profiles` +- Added the selected asset profile count to the delete menu item of the historical market data table in the admin control panel +- Added the selected asset profile count to the deletion confirmation dialog of the historical market data table in the admin control panel +- Improved the sorting to be case-insensitive in the platform management of the admin control panel +- Improved the sorting to be case-insensitive in the tag management of the admin control panel +- Improved the language localization for German (`de`) +- Upgraded `yahoo-finance2` from version `3.14.2` to `3.15.3` + +### Fixed + +- Fixed an issue with the localization of the country names + +## 3.12.0 - 2026-06-17 + +### Changed + +- Improved the styling of the checkboxes to consistently use the primary color in their states +- Improved the account name display in the accounts table +- Improved the name display in the activities table +- Improved the last activity display in the users table of the admin control panel +- Improved the registration display in the users table of the admin control panel +- Improved the user id display in the users table of the admin control panel +- Deprecated `SymbolProfile` in favor of `assetProfile` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Improved the language localization for German (`de`) +- Upgraded `svgmap` from version `2.19.3` to `2.21.0` + +### Fixed + +- Fixed a chart error on interaction by registering the annotation plugin early +- Fixed an issue on the allocations page where clicking an account in the _By Account_ chart did not open the detail dialog +- Restricted the maximum height of the import activities dialog +- Fixed the dark mode styling of the safe withdrawal rate selector in the _FIRE_ section (experimental) + +## 3.11.0 - 2026-06-14 + +### Added + +- Added support for a click handler in the page tabs component + +### Changed + +- Improved the styling of the tabs across various dialogs +- Improved the styling of the page tabs component on desktop +- Enabled the _Bull Dashboard_ tab in the admin control panel (experimental) +- Migrated the settings dialog to customize the rule thresholds of the _X-ray_ page from `ngModel` to form control +- Improved the language localization for Spanish (`es`) +- Upgraded `bull-board` from version `7.1.5` to `7.2.1` +- Upgraded `date-fns` from version `4.1.0` to `4.4.0` + +### Fixed + +- Improved the loading state when customizing the rule thresholds on the _X-ray_ page + +## 3.10.0 - 2026-06-13 + +### Changed + +- Improved the dynamic numerical precision for various values in the account detail dialog on mobile +- Improved the dynamic numerical precision for various values in the holding detail dialog on mobile +- Improved the account name display in the activities table +- Optimized the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` by improving the processing of the historical market data + +### Fixed + +- Fixed an issue in the import dividends dialog +- Fixed an issue where certain symbols were incorrectly identified as currencies in various data providers +- Fixed the last request date in the users table of the admin control panel + +## 3.9.0 - 2026-06-12 + +### Added + +- Extended the _Public API_ with the endpoint to update the asset profile data (`PATCH api/v1/asset-profiles/:dataSource/:symbol`) (experimental) +- Added support for a dedicated _OpenRouter_ model for the `web_fetch` tool in the `FetchService` + +### Changed + +- Prefilled the form in the account balance management with the current cash balance +- Disabled the selection of future dates in the account balance management +- Grouped commodities and cryptocurrencies into the unknown bucket of the allocations by continent, country, currency, market and sector charts on the allocations page +- Moved the support for specific calendar year date ranges (`2025`, `2024`, `2023`, etc.) in the assistant from experimental to general availability +- Migrated various components from `NgStyle` to style bindings +- Improved the language localization for Korean (`ko`) + +### Fixed + +- Grouped activities without an account into the unknown bucket of the allocations by account and platform charts on the allocations page + +## 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 diff --git a/README.md b/README.md index 8557d4330..de4b4d828 100644 --- a/README.md +++ b/README.md @@ -302,6 +302,58 @@ Grant access of type _Public_ in the _Access_ tab of _My Ghostfolio_. } ``` +### Update Asset Profile Data (experimental) + +#### Prerequisites + +[Bearer Token](#authorization-bearer-token) for authorization with admin role + +#### Request + +`PATCH http://localhost:3333/api/v1/asset-profiles//` + +#### Body + +``` +{ + "countries": [ + { + "code": "US", + "weight": 1 + } + ], + "sectors": [ + { + "name": "Technology", + "weight": 1 + } + ] +} +``` + +| Field | Type | Description | +| ----------- | ------------------ | ---------------------------------------------------------------------- | +| `countries` | `array` (optional) | Countries with `code` (`ISO 3166-1 alpha-2`) and `weight` (`0` to `1`) | +| `holdings` | `array` (optional) | Holdings with `name` and `weight` (`0` to `1`) | +| `sectors` | `array` (optional) | Sectors with `name` and `weight` (`0` to `1`) | + +#### Response + +##### Success + +`200 OK` + +##### Error + +`404 Not Found` + +``` +{ + "error": "Not Found", + "message": "Could not find the asset profile for MSFT (YAHOO)" +} +``` + ## Community Projects Discover a variety of community projects for Ghostfolio: https://github.com/topics/ghostfolio @@ -310,7 +362,7 @@ Are you building your own project? Add the `ghostfolio` topic to your _GitHub_ r ## Contributing -Ghostfolio is **100% free** and **open source**. We encourage and support an active and healthy community that accepts contributions from the public, including you. +Ghostfolio is **100% free** and **open source**. We support an active and healthy community and welcome contributions from everyone, including you. Not sure what to work on? We have [some ideas](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22%20no%3Aassignee), even for [newcomers](https://github.com/ghostfolio/ghostfolio/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22%20no%3Aassignee). Please join the Ghostfolio [Slack](https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg) channel or post to [@ghostfolio\_](https://x.com/ghostfolio_) on _X_. We would love to hear from you. 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..9eb045fba 100644 --- a/apps/api/src/app/admin/admin.controller.ts +++ b/apps/api/src/app/admin/admin.controller.ts @@ -1,10 +1,11 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; 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,21 +17,19 @@ import { UpdateAssetProfileDto, UpdatePropertyDto } from '@ghostfolio/common/dtos'; -import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; +import { + canDeleteAssetProfile, + getAssetProfileIdentifier +} from '@ghostfolio/common/helper'; import { AdminData, - AdminMarketData, AdminUserResponse, AdminUsersResponse, EnhancedSymbolProfile, ScraperConfiguration } from '@ghostfolio/common/interfaces'; import { permissions } from '@ghostfolio/common/permissions'; -import type { - DateRange, - MarketDataPreset, - RequestWithUser -} from '@ghostfolio/common/types'; +import type { DateRange, RequestWithUser } from '@ghostfolio/common/types'; import { Body, @@ -58,13 +57,16 @@ 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() @@ -209,35 +211,6 @@ export class AdminController { }); } - @Get('market-data') - @HasPermission(permissions.accessAdminControl) - @UseGuards(AuthGuard('jwt'), HasPermissionGuard) - public async getMarketData( - @Query('assetSubClasses') filterByAssetSubClasses?: string, - @Query('dataSource') filterByDataSource?: string, - @Query('presetId') presetId?: MarketDataPreset, - @Query('query') filterBySearchQuery?: string, - @Query('skip') skip?: number, - @Query('sortColumn') sortColumn?: string, - @Query('sortDirection') sortDirection?: Prisma.SortOrder, - @Query('take') take?: number - ): Promise { - const filters = this.apiService.buildFiltersFromQueryParams({ - filterByAssetSubClasses, - filterByDataSource, - filterBySearchQuery - }); - - return this.adminService.getMarketData({ - filters, - presetId, - sortColumn, - sortDirection, - skip: isNaN(skip) ? undefined : skip, - take: isNaN(take) ? undefined : take - }); - } - @HasPermission(permissions.accessAdminControl) @Post('market-data/:dataSource/:symbol/test') @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @@ -260,7 +233,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 +261,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.module.ts b/apps/api/src/app/admin/admin.module.ts index e87df9e74..0cd4d3c16 100644 --- a/apps/api/src/app/admin/admin.module.ts +++ b/apps/api/src/app/admin/admin.module.ts @@ -1,6 +1,5 @@ import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; -import { ApiModule } from '@ghostfolio/api/services/api/api.module'; import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; @@ -21,7 +20,6 @@ import { QueueModule } from './queue/queue.module'; @Module({ imports: [ ActivitiesModule, - ApiModule, BenchmarkModule, ConfigurationModule, DataGatheringQueueModule, diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 0bf5c3925..f08fb6a37 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -1,6 +1,5 @@ import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; import { environment } from '@ghostfolio/api/environments/environment'; -import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.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'; @@ -13,24 +12,15 @@ import { PROPERTY_IS_READ_ONLY_MODE, PROPERTY_IS_USER_SIGNUP_ENABLED } from '@ghostfolio/common/config'; -import { - getAssetProfileIdentifier, - getCurrencyFromSymbol, - isCurrency -} from '@ghostfolio/common/helper'; +import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper'; import { AdminData, - AdminMarketData, AdminMarketDataDetails, - AdminMarketDataItem, AdminUserResponse, AdminUsersResponse, AssetProfileIdentifier, - EnhancedSymbolProfile, - Filter + EnhancedSymbolProfile } from '@ghostfolio/common/interfaces'; -import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; -import { MarketDataPreset } from '@ghostfolio/common/types'; import { BadRequestException, @@ -48,13 +38,11 @@ import { } from '@prisma/client'; import { differenceInDays } from 'date-fns'; import { StatusCodes, getReasonPhrase } from 'http-status-codes'; -import { groupBy } from 'lodash'; @Injectable() export class AdminService { public constructor( private readonly activitiesService: ActivitiesService, - private readonly benchmarkService: BenchmarkService, private readonly configurationService: ConfigurationService, private readonly dataProviderService: DataProviderService, private readonly exchangeRateDataService: ExchangeRateDataService, @@ -188,270 +176,6 @@ export class AdminService { }; } - public async getMarketData({ - filters, - presetId, - sortColumn, - sortDirection = 'asc', - skip, - take = Number.MAX_SAFE_INTEGER - }: { - filters?: Filter[]; - presetId?: MarketDataPreset; - skip?: number; - sortColumn?: string; - sortDirection?: Prisma.SortOrder; - take?: number; - }): Promise { - let orderBy: Prisma.Enumerable = - [{ symbol: 'asc' }]; - const where: Prisma.SymbolProfileWhereInput = {}; - - if (presetId === 'BENCHMARKS') { - const benchmarkAssetProfiles = - await this.benchmarkService.getBenchmarkAssetProfiles(); - - where.id = { - in: benchmarkAssetProfiles.map(({ id }) => { - return id; - }) - }; - } else if (presetId === 'CURRENCIES') { - return this.getMarketDataForCurrencies(); - } else if ( - presetId === 'ETF_WITHOUT_COUNTRIES' || - presetId === 'ETF_WITHOUT_SECTORS' - ) { - filters = [{ id: 'ETF', type: 'ASSET_SUB_CLASS' }]; - } else if (presetId === 'NO_ACTIVITIES') { - where.activities = { - none: {} - }; - } - - const searchQuery = filters.find(({ type }) => { - return type === 'SEARCH_QUERY'; - })?.id; - - const { - ASSET_SUB_CLASS: filtersByAssetSubClass, - DATA_SOURCE: filtersByDataSource - } = groupBy(filters, ({ type }) => { - return type; - }); - - const marketDataItems = await this.prismaService.marketData.groupBy({ - _count: true, - by: ['dataSource', 'symbol'] - }); - - if (filtersByAssetSubClass) { - where.assetSubClass = AssetSubClass[filtersByAssetSubClass[0].id]; - } - - if (filtersByDataSource) { - where.dataSource = DataSource[filtersByDataSource[0].id]; - } - - if (searchQuery) { - where.OR = [ - { id: { mode: 'insensitive', startsWith: searchQuery } }, - { isin: { mode: 'insensitive', startsWith: searchQuery } }, - { name: { mode: 'insensitive', startsWith: searchQuery } }, - { symbol: { mode: 'insensitive', startsWith: searchQuery } } - ]; - } - - if (sortColumn) { - orderBy = [{ [sortColumn]: sortDirection }]; - - if (sortColumn === 'activitiesCount') { - orderBy = [ - { - activities: { - _count: sortDirection - } - } - ]; - } - } - - const extendedPrismaClient = this.getExtendedPrismaClient(); - - const symbolProfileResult = await Promise.all([ - extendedPrismaClient.symbolProfile.findMany({ - skip, - take, - where, - orderBy: [...orderBy, { id: sortDirection }], - select: { - _count: { - select: { - activities: true, - watchedBy: true - } - }, - activities: { - orderBy: [{ date: 'asc' }], - select: { date: true }, - take: 1 - }, - assetClass: true, - assetSubClass: true, - comment: true, - countries: true, - currency: true, - dataSource: true, - id: true, - isActive: true, - isUsedByUsersWithSubscription: true, - name: true, - scraperConfiguration: true, - sectors: true, - symbol: true, - SymbolProfileOverrides: true - } - }), - this.prismaService.symbolProfile.count({ where }) - ]); - const assetProfiles = symbolProfileResult[0]; - let count = symbolProfileResult[1]; - - const lastMarketPrices = await this.prismaService.marketData.findMany({ - distinct: ['dataSource', 'symbol'], - orderBy: { date: 'desc' }, - select: { - dataSource: true, - marketPrice: true, - symbol: true - }, - where: { - dataSource: { - in: assetProfiles.map(({ dataSource }) => { - return dataSource; - }) - }, - symbol: { - in: assetProfiles.map(({ symbol }) => { - return symbol; - }) - } - } - }); - - const lastMarketPriceMap = new Map(); - - for (const { dataSource, marketPrice, symbol } of lastMarketPrices) { - lastMarketPriceMap.set( - getAssetProfileIdentifier({ dataSource, symbol }), - marketPrice - ); - } - - let marketData: AdminMarketDataItem[] = await Promise.all( - assetProfiles.map( - async ({ - _count, - activities, - assetClass, - assetSubClass, - comment, - countries, - currency, - dataSource, - id, - isActive, - isUsedByUsersWithSubscription, - name, - sectors, - symbol, - SymbolProfileOverrides - }) => { - let countriesCount = countries ? Object.keys(countries).length : 0; - - const lastMarketPrice = lastMarketPriceMap.get( - getAssetProfileIdentifier({ dataSource, symbol }) - ); - - 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; - } - - name = SymbolProfileOverrides.name ?? name; - - if ( - (SymbolProfileOverrides.sectors as unknown as Sector[])?.length > - 0 - ) { - sectorsCount = ( - SymbolProfileOverrides.sectors as unknown as Prisma.JsonArray - ).length; - } - } - - 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) { - if (presetId === 'ETF_WITHOUT_COUNTRIES') { - marketData = marketData.filter(({ countriesCount }) => { - return countriesCount === 0; - }); - } else if (presetId === 'ETF_WITHOUT_SECTORS') { - marketData = marketData.filter(({ sectorsCount }) => { - return sectorsCount === 0; - }); - } - - count = marketData.length; - } - - return { - count, - marketData - }; - } - public async getMarketDataBySymbol({ dataSource, symbol @@ -516,6 +240,24 @@ export class AdminService { throw new NotFoundException(`User with ID ${id} not found`); } + if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { + const subscriptions = await this.prismaService.subscription.findMany({ + orderBy: { + expiresAt: 'desc' + }, + where: { + userId: id + } + }); + + user.subscriptions = subscriptions.map((subscription) => { + return { + ...subscription, + price: subscription.price ?? 0 + }; + }); + } + return user; } @@ -619,6 +361,7 @@ export class AdminService { assetClass: assetClass as AssetClass, assetSubClass: assetSubClass as AssetSubClass, countries: countries as Prisma.JsonArray, + holdings: holdings as Prisma.JsonArray, name: name as string, sectors: sectors as Prisma.JsonArray, url: url as string @@ -628,21 +371,14 @@ export class AdminService { comment, currency, dataSource, - holdings, isActive, scraperConfiguration, symbol, symbolMapping, - ...(dataSource === 'MANUAL' - ? { assetClass, assetSubClass, countries, name, sectors, url } - : { - SymbolProfileOverrides: { - upsert: { - create: symbolProfileOverrides, - update: symbolProfileOverrides - } - } - }) + ...this.symbolProfileService.getAssetProfileUpdateInput( + { dataSource, symbol }, + symbolProfileOverrides + ) }; await this.symbolProfileService.updateSymbolProfile( @@ -699,138 +435,6 @@ export class AdminService { }); } - private getExtendedPrismaClient() { - const symbolProfileExtension = Prisma.defineExtension((client) => { - return client.$extends({ - result: { - symbolProfile: { - isUsedByUsersWithSubscription: { - compute: async ({ id }) => { - const { _count } = - await this.prismaService.symbolProfile.findUnique({ - select: { - _count: { - select: { - activities: { - where: { - user: { - subscriptions: { - some: { - expiresAt: { - gt: new Date() - } - } - } - } - } - } - } - } - }, - where: { - id - } - }); - - return _count.activities > 0; - } - } - } - } - }); - }); - - return this.prismaService.$extends(symbolProfileExtension); - } - - private async getMarketDataForCurrencies(): Promise { - const currencyPairs = this.exchangeRateDataService.getCurrencyPairs(); - - const [lastMarketPrices, marketDataItems] = await Promise.all([ - this.prismaService.marketData.findMany({ - distinct: ['dataSource', 'symbol'], - orderBy: { date: 'desc' }, - select: { - dataSource: true, - marketPrice: true, - symbol: true - }, - where: { - dataSource: { - in: currencyPairs.map(({ dataSource }) => { - return dataSource; - }) - }, - symbol: { - in: currencyPairs.map(({ symbol }) => { - return symbol; - }) - } - } - }), - this.prismaService.marketData.groupBy({ - _count: true, - by: ['dataSource', 'symbol'] - }) - ]); - - const lastMarketPriceMap = new Map(); - - for (const { dataSource, marketPrice, symbol } of lastMarketPrices) { - lastMarketPriceMap.set( - getAssetProfileIdentifier({ dataSource, symbol }), - marketPrice - ); - } - - const marketDataPromise: Promise[] = currencyPairs.map( - async ({ dataSource, symbol }) => { - let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; - let currency: EnhancedSymbolProfile['currency'] = '-'; - let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; - - if (isCurrency(getCurrencyFromSymbol(symbol))) { - currency = getCurrencyFromSymbol(symbol); - ({ activitiesCount, dateOfFirstActivity } = - await this.activitiesService.getStatisticsByCurrency(currency)); - } - - const lastMarketPrice = lastMarketPriceMap.get( - getAssetProfileIdentifier({ dataSource, symbol }) - ); - - const marketDataItemCount = - marketDataItems.find((marketDataItem) => { - return ( - marketDataItem.dataSource === dataSource && - marketDataItem.symbol === symbol - ); - })?._count ?? 0; - - return { - activitiesCount, - currency, - dataSource, - lastMarketPrice, - marketDataItemCount, - symbol, - assetClass: AssetClass.LIQUIDITY, - assetSubClass: AssetSubClass.CASH, - countriesCount: 0, - date: dateOfFirstActivity, - id: undefined, - isActive: true, - name: symbol, - sectorsCount: 0, - watchedByCount: 0 - }; - } - ); - - const marketData = await Promise.all(marketDataPromise); - return { marketData, count: marketData.length }; - } - private async getUsersWithAnalytics({ skip, take, @@ -882,7 +486,7 @@ export class AdminService { activityCount: true, country: true, dataProviderGhostfolioDailyRequests: true, - updatedAt: true + lastRequestAt: true } }, createdAt: true, @@ -928,7 +532,7 @@ export class AdminService { activityCount: _count.activities || 0, country: analytics?.country, dailyApiRequests: analytics?.dataProviderGhostfolioDailyRequests || 0, - lastActivity: analytics?.updatedAt + lastActivity: analytics?.lastRequestAt }; } ); diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 4857c7e14..0a27faa64 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -38,6 +38,7 @@ import { AuthModule } from './auth/auth.module'; import { CacheModule } from './cache/cache.module'; import { AiModule } from './endpoints/ai/ai.module'; import { ApiKeysModule } from './endpoints/api-keys/api-keys.module'; +import { AssetProfilesModule } from './endpoints/asset-profiles/asset-profiles.module'; import { AssetsModule } from './endpoints/assets/assets.module'; import { BenchmarksModule } from './endpoints/benchmarks/benchmarks.module'; import { GhostfolioModule } from './endpoints/data-providers/ghostfolio/ghostfolio.module'; @@ -69,6 +70,7 @@ import { UserModule } from './user/user.module'; ActivitiesModule, AiModule, ApiKeysModule, + AssetProfilesModule, AssetModule, AssetsModule, AuthDeviceModule, diff --git a/apps/api/src/app/auth/auth.module.ts b/apps/api/src/app/auth/auth.module.ts index f55093bbf..1d6990307 100644 --- a/apps/api/src/app/auth/auth.module.ts +++ b/apps/api/src/app/auth/auth.module.ts @@ -50,6 +50,8 @@ import { OidcStrategy } from './oidc.strategy'; configurationService: ConfigurationService, fetchService: FetchService ) => { + const logger = new Logger('OidcStrategy'); + const isOidcEnabled = configurationService.get( 'ENABLE_FEATURE_AUTH_OIDC' ); @@ -101,7 +103,7 @@ import { OidcStrategy } from './oidc.strategy'; tokenURL = manualTokenUrl || config.token_endpoint; userInfoURL = manualUserInfoUrl || config.userinfo_endpoint; } catch (error) { - Logger.error(error, 'OidcStrategy'); + logger.error(error); throw new Error('Failed to fetch OIDC configuration from issuer'); } } diff --git a/apps/api/src/app/auth/google.strategy.ts b/apps/api/src/app/auth/google.strategy.ts index 3e4b4ca0d..53720c383 100644 --- a/apps/api/src/app/auth/google.strategy.ts +++ b/apps/api/src/app/auth/google.strategy.ts @@ -10,6 +10,8 @@ import { AuthService } from './auth.service'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { + private readonly logger = new Logger(GoogleStrategy.name); + public constructor( private readonly authService: AuthService, configurationService: ConfigurationService @@ -40,7 +42,7 @@ export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { done(null, { jwt }); } catch (error) { - Logger.error(error, 'GoogleStrategy'); + this.logger.error(error); done(error, false); } } diff --git a/apps/api/src/app/auth/oidc.strategy.ts b/apps/api/src/app/auth/oidc.strategy.ts index 96b284121..661f2a821 100644 --- a/apps/api/src/app/auth/oidc.strategy.ts +++ b/apps/api/src/app/auth/oidc.strategy.ts @@ -15,6 +15,8 @@ import { OidcStateStore } from './oidc-state.store'; @Injectable() export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { + private readonly logger = new Logger(OidcStrategy.name); + private static readonly stateStore = new OidcStateStore(); public constructor( @@ -52,9 +54,8 @@ export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { }); if (!thirdPartyId) { - Logger.error( - `Missing subject identifier in OIDC response from ${issuer}`, - 'OidcStrategy' + this.logger.error( + `Missing subject identifier in OIDC response from ${issuer}` ); throw new Error('Missing subject identifier in OIDC response'); @@ -62,7 +63,7 @@ export class OidcStrategy extends PassportStrategy(Strategy, 'oidc') { return { jwt }; } catch (error) { - Logger.error(error, 'OidcStrategy'); + this.logger.error(error); throw error; } } diff --git a/apps/api/src/app/auth/web-auth.service.ts b/apps/api/src/app/auth/web-auth.service.ts index 6cffcd244..5764eeece 100644 --- a/apps/api/src/app/auth/web-auth.service.ts +++ b/apps/api/src/app/auth/web-auth.service.ts @@ -33,6 +33,8 @@ import ms from 'ms'; @Injectable() export class WebAuthService { + private readonly logger = new Logger(WebAuthService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly deviceService: AuthDeviceService, @@ -103,7 +105,7 @@ export class WebAuthService { verification = await verifyRegistrationResponse(opts); } catch (error) { - Logger.error(error, 'WebAuthService'); + this.logger.error(error); throw new InternalServerErrorException(error.message); } @@ -210,7 +212,7 @@ export class WebAuthService { verification = await verifyAuthenticationResponse(opts); } catch (error) { - Logger.error(error, 'WebAuthService'); + this.logger.error(error); throw new InternalServerErrorException({ error: error.message }); } diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts new file mode 100644 index 000000000..2606d8075 --- /dev/null +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts @@ -0,0 +1,87 @@ +import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; +import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { ApiService } from '@ghostfolio/api/services/api/api.service'; +import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos'; +import { + AssetProfilesResponse, + EnhancedSymbolProfile +} from '@ghostfolio/common/interfaces'; +import { permissions } from '@ghostfolio/common/permissions'; +import { MarketDataPreset, RequestWithUser } from '@ghostfolio/common/types'; + +import { + Body, + Controller, + Get, + HttpException, + Inject, + Param, + Patch, + Query, + UseGuards +} from '@nestjs/common'; +import { REQUEST } from '@nestjs/core'; +import { AuthGuard } from '@nestjs/passport'; +import { DataSource, Prisma } from '@prisma/client'; +import { StatusCodes, getReasonPhrase } from 'http-status-codes'; + +import { AssetProfilesService } from './asset-profiles.service'; + +@Controller('asset-profiles') +export class AssetProfilesController { + public constructor( + private readonly apiService: ApiService, + private readonly assetProfilesService: AssetProfilesService, + @Inject(REQUEST) private readonly request: RequestWithUser + ) {} + + @Get() + @HasPermission(permissions.accessAdminControl) + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async getAssetProfiles( + @Query('assetSubClasses') filterByAssetSubClasses?: string, + @Query('dataSource') filterByDataSource?: string, + @Query('presetId') presetId?: MarketDataPreset, + @Query('query') filterBySearchQuery?: string, + @Query('skip') skip?: number, + @Query('sortColumn') sortColumn?: string, + @Query('sortDirection') sortDirection?: Prisma.SortOrder, + @Query('take') take?: number + ): Promise { + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByAssetSubClasses, + filterByDataSource, + filterBySearchQuery + }); + + return this.assetProfilesService.getAssetProfiles({ + filters, + presetId, + sortColumn, + sortDirection, + skip: isNaN(skip) ? undefined : skip, + take: isNaN(take) ? undefined : take + }); + } + + @HasPermission(permissions.accessAdminControl) + @Patch(':dataSource/:symbol') + @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + public async updateAssetProfileData( + @Body() assetProfileData: UpdateAssetProfileDataDto, + @Param('dataSource') dataSource: DataSource, + @Param('symbol') symbol: string + ): Promise { + if (!this.request.user.settings.settings.isExperimentalFeatures) { + throw new HttpException( + getReasonPhrase(StatusCodes.NOT_FOUND), + StatusCodes.NOT_FOUND + ); + } + + return this.assetProfilesService.updateAssetProfileData( + { dataSource, symbol }, + assetProfileData + ); + } +} diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts new file mode 100644 index 000000000..98463ce5d --- /dev/null +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts @@ -0,0 +1,25 @@ +import { ActivitiesModule } from '@ghostfolio/api/app/activities/activities.module'; +import { ApiModule } from '@ghostfolio/api/services/api/api.module'; +import { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module'; +import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; +import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; +import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module'; + +import { Module } from '@nestjs/common'; + +import { AssetProfilesController } from './asset-profiles.controller'; +import { AssetProfilesService } from './asset-profiles.service'; + +@Module({ + controllers: [AssetProfilesController], + imports: [ + ActivitiesModule, + ApiModule, + BenchmarkModule, + ExchangeRateDataModule, + PrismaModule, + SymbolProfileModule + ], + providers: [AssetProfilesService] +}) +export class AssetProfilesModule {} diff --git a/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts new file mode 100644 index 000000000..39eaa1642 --- /dev/null +++ b/apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts @@ -0,0 +1,482 @@ +import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service'; +import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; +import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; +import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos'; +import { + applyAssetProfileOverrides, + getAssetProfileIdentifier, + getCurrencyFromSymbol, + isCurrency +} from '@ghostfolio/common/helper'; +import { + AssetProfileItem, + AssetProfileIdentifier, + AssetProfilesResponse, + EnhancedSymbolProfile, + Filter +} from '@ghostfolio/common/interfaces'; +import { MarketDataPreset } from '@ghostfolio/common/types'; + +import { Injectable, NotFoundException } from '@nestjs/common'; +import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client'; +import { groupBy } from 'lodash'; + +@Injectable() +export class AssetProfilesService { + public constructor( + private readonly activitiesService: ActivitiesService, + private readonly benchmarkService: BenchmarkService, + private readonly exchangeRateDataService: ExchangeRateDataService, + private readonly prismaService: PrismaService, + private readonly symbolProfileService: SymbolProfileService + ) {} + + public async getAssetProfiles({ + filters = [], + presetId, + sortColumn, + sortDirection = 'asc', + skip, + take = Number.MAX_SAFE_INTEGER + }: { + filters?: Filter[]; + presetId?: MarketDataPreset; + skip?: number; + sortColumn?: string; + sortDirection?: Prisma.SortOrder; + take?: number; + }): Promise { + let orderBy: Prisma.Enumerable = + [{ symbol: 'asc' }]; + const where: Prisma.SymbolProfileWhereInput = {}; + + if (presetId === 'BENCHMARKS') { + const benchmarkAssetProfiles = + await this.benchmarkService.getBenchmarkAssetProfiles(); + + where.id = { + in: benchmarkAssetProfiles.map(({ id }) => { + return id; + }) + }; + } else if (presetId === 'CURRENCIES') { + return this.getAssetProfilesForCurrencies(); + } else if ( + presetId === 'ETF_WITHOUT_COUNTRIES' || + presetId === 'ETF_WITHOUT_SECTORS' + ) { + filters = [{ id: 'ETF', type: 'ASSET_SUB_CLASS' }]; + } else if (presetId === 'NO_ACTIVITIES') { + where.activities = { + none: {} + }; + } + + const searchQuery = filters.find(({ type }) => { + return type === 'SEARCH_QUERY'; + })?.id; + + const { + ASSET_SUB_CLASS: filtersByAssetSubClass, + DATA_SOURCE: filtersByDataSource + } = groupBy(filters, ({ type }) => { + return type; + }); + + const marketDataItems = await this.prismaService.marketData.groupBy({ + _count: true, + by: ['dataSource', 'symbol'] + }); + + if (filtersByAssetSubClass) { + where.assetSubClass = AssetSubClass[filtersByAssetSubClass[0].id]; + } + + if (filtersByDataSource) { + where.dataSource = DataSource[filtersByDataSource[0].id]; + } + + if (searchQuery) { + where.OR = [ + { id: { mode: 'insensitive', startsWith: searchQuery } }, + { isin: { mode: 'insensitive', startsWith: searchQuery } }, + { name: { mode: 'insensitive', startsWith: searchQuery } }, + { symbol: { mode: 'insensitive', startsWith: searchQuery } } + ]; + } + + if (sortColumn) { + orderBy = [{ [sortColumn]: sortDirection }]; + + if (sortColumn === 'activitiesCount') { + orderBy = [ + { + activities: { + _count: sortDirection + } + } + ]; + } + } + + const extendedPrismaClient = this.getExtendedPrismaClient(); + + const symbolProfileResult = await Promise.all([ + extendedPrismaClient.symbolProfile.findMany({ + skip, + take, + where, + orderBy: [...orderBy, { id: sortDirection }], + select: { + _count: { + select: { + activities: true, + watchedBy: true + } + }, + activities: { + orderBy: [{ date: 'asc' }], + select: { date: true }, + take: 1 + }, + assetClass: true, + assetSubClass: true, + comment: true, + countries: true, + currency: true, + dataSource: true, + id: true, + isin: true, + isActive: true, + isUsedByUsersWithSubscription: true, + name: true, + scraperConfiguration: true, + sectors: true, + symbol: true, + SymbolProfileOverrides: true + } + }), + this.prismaService.symbolProfile.count({ where }) + ]); + const symbolProfiles = symbolProfileResult[0]; + let count = symbolProfileResult[1]; + + const lastMarketPrices = await this.prismaService.marketData.findMany({ + distinct: ['dataSource', 'symbol'], + orderBy: { date: 'desc' }, + select: { + dataSource: true, + marketPrice: true, + symbol: true + }, + where: { + dataSource: { + in: symbolProfiles.map(({ dataSource }) => { + return dataSource; + }) + }, + symbol: { + in: symbolProfiles.map(({ symbol }) => { + return symbol; + }) + } + } + }); + + const lastMarketPriceMap = new Map(); + + for (const { dataSource, marketPrice, symbol } of lastMarketPrices) { + lastMarketPriceMap.set( + getAssetProfileIdentifier({ dataSource, symbol }), + marketPrice + ); + } + + let assetProfiles: AssetProfileItem[] = await Promise.all( + symbolProfiles.map(async (assetProfile) => { + const { + _count, + activities, + comment, + currency, + dataSource, + id, + isin, + isActive, + isUsedByUsersWithSubscription, + symbol + } = assetProfile; + + const { assetClass, assetSubClass, countries, name, sectors } = + applyAssetProfileOverrides( + assetProfile, + assetProfile.SymbolProfileOverrides + ); + + const countriesCount = countries ? Object.keys(countries).length : 0; + + const lastMarketPrice = lastMarketPriceMap.get( + getAssetProfileIdentifier({ dataSource, symbol }) + ); + + const marketDataItemCount = + marketDataItems.find((marketDataItem) => { + return ( + marketDataItem.dataSource === dataSource && + marketDataItem.symbol === symbol + ); + })?._count ?? 0; + + const sectorsCount = sectors ? Object.keys(sectors).length : 0; + + return { + assetClass, + assetSubClass, + comment, + countriesCount, + currency, + dataSource, + id, + isActive, + isin, + lastMarketPrice, + marketDataItemCount, + name, + sectorsCount, + symbol, + activitiesCount: _count.activities, + date: activities?.[0]?.date, + isUsedByUsersWithSubscription: await isUsedByUsersWithSubscription, + watchedByCount: _count.watchedBy + }; + }) + ); + + if (presetId) { + if (presetId === 'ETF_WITHOUT_COUNTRIES') { + assetProfiles = assetProfiles.filter(({ countriesCount }) => { + return countriesCount === 0; + }); + } else if (presetId === 'ETF_WITHOUT_SECTORS') { + assetProfiles = assetProfiles.filter(({ sectorsCount }) => { + return sectorsCount === 0; + }); + } + + count = assetProfiles.length; + } + + return { + assetProfiles, + count + }; + } + + public async updateAssetProfileData( + { dataSource, symbol }: AssetProfileIdentifier, + assetProfileData: UpdateAssetProfileDataDto + ): Promise { + const notFoundMessage = `Could not find the asset profile for ${symbol} (${dataSource})`; + + const data = this.getAssetProfileDataUpdate(assetProfileData); + + if (Object.keys(data).length > 0) { + try { + await this.symbolProfileService.updateSymbolProfile( + { + dataSource, + symbol + }, + this.symbolProfileService.getAssetProfileUpdateInput( + { dataSource, symbol }, + data + ) + ); + } catch (error) { + if ( + error instanceof Prisma.PrismaClientKnownRequestError && + error.code === 'P2025' + ) { + throw new NotFoundException(notFoundMessage); + } + + throw error; + } + } + + const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([ + { + dataSource, + symbol + } + ]); + + if (!assetProfile) { + throw new NotFoundException(notFoundMessage); + } + + return assetProfile; + } + + private getAssetProfileDataUpdate({ + countries, + holdings, + sectors + }: UpdateAssetProfileDataDto): Pick< + Prisma.SymbolProfileUpdateInput, + 'countries' | 'holdings' | 'sectors' + > { + const data: Pick< + Prisma.SymbolProfileUpdateInput, + 'countries' | 'holdings' | 'sectors' + > = {}; + + if (countries !== undefined) { + data.countries = countries as Prisma.JsonArray; + } + + if (holdings !== undefined) { + data.holdings = holdings as Prisma.JsonArray; + } + + if (sectors !== undefined) { + data.sectors = sectors as Prisma.JsonArray; + } + + return data; + } + + private async getAssetProfilesForCurrencies(): Promise { + const currencyPairs = this.exchangeRateDataService.getCurrencyPairs(); + + const [lastMarketPrices, marketDataItems] = await Promise.all([ + this.prismaService.marketData.findMany({ + distinct: ['dataSource', 'symbol'], + orderBy: { date: 'desc' }, + select: { + dataSource: true, + marketPrice: true, + symbol: true + }, + where: { + dataSource: { + in: currencyPairs.map(({ dataSource }) => { + return dataSource; + }) + }, + symbol: { + in: currencyPairs.map(({ symbol }) => { + return symbol; + }) + } + } + }), + this.prismaService.marketData.groupBy({ + _count: true, + by: ['dataSource', 'symbol'] + }) + ]); + + const lastMarketPriceMap = new Map(); + + for (const { dataSource, marketPrice, symbol } of lastMarketPrices) { + lastMarketPriceMap.set( + getAssetProfileIdentifier({ dataSource, symbol }), + marketPrice + ); + } + + const assetProfilePromises: Promise[] = currencyPairs.map( + async ({ dataSource, symbol }) => { + let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0; + let currency: EnhancedSymbolProfile['currency'] = '-'; + let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity']; + + if (isCurrency(getCurrencyFromSymbol(symbol))) { + currency = getCurrencyFromSymbol(symbol); + ({ activitiesCount, dateOfFirstActivity } = + await this.activitiesService.getStatisticsByCurrency(currency)); + } + + const lastMarketPrice = lastMarketPriceMap.get( + getAssetProfileIdentifier({ dataSource, symbol }) + ); + + const marketDataItemCount = + marketDataItems.find((marketDataItem) => { + return ( + marketDataItem.dataSource === dataSource && + marketDataItem.symbol === symbol + ); + })?._count ?? 0; + + return { + activitiesCount, + currency, + dataSource, + lastMarketPrice, + marketDataItemCount, + symbol, + assetClass: AssetClass.LIQUIDITY, + assetSubClass: AssetSubClass.CASH, + countriesCount: 0, + date: dateOfFirstActivity, + id: undefined, + isActive: true, + name: symbol, + sectorsCount: 0, + watchedByCount: 0 + }; + } + ); + + const assetProfiles = await Promise.all(assetProfilePromises); + return { assetProfiles, count: assetProfiles.length }; + } + + private getExtendedPrismaClient() { + const symbolProfileExtension = Prisma.defineExtension((client) => { + return client.$extends({ + result: { + symbolProfile: { + isUsedByUsersWithSubscription: { + compute: async ({ id }) => { + const { _count } = + await this.prismaService.symbolProfile.findUnique({ + select: { + _count: { + select: { + activities: { + where: { + user: { + subscriptions: { + some: { + expiresAt: { + gt: new Date() + } + } + } + } + } + } + } + } + }, + where: { + id + } + }); + + return _count.activities > 0; + } + } + } + } + }); + }); + + return this.prismaService.$extends(symbolProfileExtension); + } +} diff --git a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts index 03ff32c21..0b95880d4 100644 --- a/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts +++ b/apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts @@ -17,6 +17,8 @@ import { isNumber } from 'lodash'; @Injectable() export class BenchmarksService { + private readonly logger = new Logger(BenchmarksService.name); + public constructor( private readonly benchmarkService: BenchmarkService, private readonly exchangeRateDataService: ExchangeRateDataService, @@ -96,12 +98,11 @@ export class BenchmarksService { })?.marketPrice; if (!marketPriceAtStartDate) { - Logger.error( + this.logger.error( `No historical market data has been found for ${symbol} (${dataSource}) at ${format( startDate, DATE_FORMAT - )}`, - 'BenchmarkService' + )}` ); return { marketData }; diff --git a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts index 3f91dbecc..b84ca881f 100644 --- a/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts @@ -34,6 +34,8 @@ import { Big } from 'big.js'; @Injectable() export class GhostfolioService { + private readonly logger = new Logger(GhostfolioService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly dataProviderService: DataProviderService, @@ -99,7 +101,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -141,7 +143,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -183,7 +185,7 @@ export class GhostfolioService { return result; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -271,7 +273,7 @@ export class GhostfolioService { return results; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } @@ -348,7 +350,7 @@ export class GhostfolioService { return results; } catch (error) { - Logger.error(error, 'GhostfolioService'); + this.logger.error(error); throw error; } diff --git a/apps/api/src/app/health/health.controller.ts b/apps/api/src/app/health/health.controller.ts index 35f3fa348..4f88a03f0 100644 --- a/apps/api/src/app/health/health.controller.ts +++ b/apps/api/src/app/health/health.controller.ts @@ -24,6 +24,8 @@ import { HealthService } from './health.service'; @Controller('health') export class HealthController { + private readonly logger = new Logger(HealthController.name); + public constructor( private readonly aiService: AiService, private readonly healthService: HealthService @@ -61,7 +63,7 @@ export class HealthController { .json({ status: getReasonPhrase(StatusCodes.OK) }); } } catch (error) { - Logger.error(error, 'HealthController'); + this.logger.error(error); } return response diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 521be56f7..c3e79a29f 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -31,6 +31,8 @@ import { ImportService } from './import.service'; @Controller('import') export class ImportController { + private readonly logger = new Logger(ImportController.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly importService: ImportService, @@ -81,7 +83,7 @@ export class ImportController { return { activities }; } catch (error) { - Logger.error(error, ImportController); + this.logger.error(error); throw new HttpException( { diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index d57b85d8c..ab3f76703 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -62,6 +62,8 @@ import { isNumber, sortBy, sum, uniqBy } from 'lodash'; export abstract class PortfolioCalculator { protected static readonly ENABLE_LOGGING = false; + protected readonly logger = new Logger(PortfolioCalculator.name); + protected accountBalanceItems: HistoricalDataItem[]; protected activities: PortfolioOrder[]; @@ -1119,12 +1121,11 @@ export abstract class PortfolioCalculator { if (cachedPortfolioSnapshot) { this.snapshot = cachedPortfolioSnapshot; - Logger.debug( + this.logger.debug( `Fetched portfolio snapshot from cache in ${( (performance.now() - startTimeTotal) / 1000 - ).toFixed(3)} seconds`, - 'PortfolioCalculator' + ).toFixed(3)} seconds` ); if (isCachedPortfolioSnapshotExpired) { diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-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.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts index da846c45d..e0e7a8255 100644 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -9,6 +9,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data 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 { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { parseDate } from '@ghostfolio/common/helper'; import { Account, DataSource } from '@prisma/client'; @@ -59,10 +60,12 @@ describe('PortfolioService', () => { null, accountService, null, + null, dataProviderService, null, exchangeRateDataService, null, + null, null ); @@ -106,6 +109,67 @@ describe('PortfolioService', () => { ); }); + describe('getAggregatedMarkets', () => { + const getAggregatedMarkets = (holdings: object) => { + return ( + portfolioService as unknown as { + getAggregatedMarkets: (aHoldings: object) => { + markets: Record< + string, + { valueInBaseCurrency: number; valueInPercentage: number } + >; + marketsAdvanced: Record; + }; + } + ).getAggregatedMarkets(holdings); + }; + + it('should distribute holdings with countries to their market and route holdings without countries (e.g. commodities, cryptocurrencies) to the unknown bucket', () => { + const holdings = { + 'GC=F': { + // Gold + assetProfile: { countries: [] }, + markets: { developedMarkets: 0, emergingMarkets: 0, otherMarkets: 0 }, + marketsAdvanced: { + asiaPacific: 0, + emergingMarkets: 0, + europe: 0, + japan: 0, + northAmerica: 0, + otherMarkets: 0 + }, + valueInBaseCurrency: 500 + }, + MSFT: { + assetProfile: { countries: [{ code: 'US', weight: 1 }] }, + markets: { developedMarkets: 1, emergingMarkets: 0, otherMarkets: 0 }, + marketsAdvanced: { + asiaPacific: 0, + emergingMarkets: 0, + europe: 0, + japan: 0, + northAmerica: 1, + otherMarkets: 0 + }, + valueInBaseCurrency: 1000 + } + }; + + const { markets, marketsAdvanced } = getAggregatedMarkets(holdings); + + expect(markets.developedMarkets.valueInBaseCurrency).toBe(1000); + expect(markets[UNKNOWN_KEY].valueInBaseCurrency).toBe(500); + + expect(markets.developedMarkets.valueInPercentage).toBeCloseTo( + 1000 / 1500 + ); + expect(markets[UNKNOWN_KEY].valueInPercentage).toBeCloseTo(500 / 1500); + + expect(marketsAdvanced.northAmerica.valueInBaseCurrency).toBe(1000); + expect(marketsAdvanced[UNKNOWN_KEY].valueInBaseCurrency).toBe(500); + }); + }); + describe('getCashSymbolProfiles', () => { it('should use the exchange-rate data source so the symbol-profile join in getDetails matches the calculator positions', () => { jest @@ -269,4 +333,96 @@ describe('PortfolioService', () => { expect(holdings['USD'].assetProfile.symbol).toBe('USD'); }); }); + + describe('getValueOfAccountsAndPlatforms', () => { + const getValueOfAccountsAndPlatforms = (args: object) => { + return ( + portfolioService as unknown as { + getValueOfAccountsAndPlatforms: (aArgs: object) => Promise<{ + accounts: Record; + platforms: Record; + }>; + } + ).getValueOfAccountsAndPlatforms(args); + }; + + const account = { + balance: 100, + currency: 'USD', + id: randomUUID(), + isExcluded: false, + name: 'Account 1', + platform: { name: 'Platform 1' }, + platformId: randomUUID() + }; + + beforeEach(() => { + jest + .spyOn(accountService, 'getAccounts') + .mockResolvedValue([account] as unknown as Account[]); + + jest + .spyOn(exchangeRateDataService, 'toCurrency') + .mockImplementation((aValue) => aValue); + }); + + it('should group activities without an account into the unknown bucket of accounts and platforms', async () => { + const { accounts, platforms } = await getValueOfAccountsAndPlatforms({ + activities: [ + { + account, + accountId: account.id, + quantity: 1, + SymbolProfile: { symbol: 'AAPL' }, + type: 'BUY' + }, + { + account: null, + accountId: null, + quantity: 2, + SymbolProfile: { symbol: 'BABA' }, + type: 'BUY' + } + ], + filters: [], + portfolioItemsNow: { + AAPL: { marketPriceInBaseCurrency: 10 }, + BABA: { marketPriceInBaseCurrency: 20 } + }, + userCurrency: 'USD', + userId: userDummyData.id + }); + + // 100 (balance) + 1 * 10 (activity) + expect(accounts[account.id].valueInBaseCurrency).toBe(110); + expect(platforms[account.platformId].valueInBaseCurrency).toBe(110); + + // 2 * 20 (activity without an account) + expect(accounts[UNKNOWN_KEY].valueInBaseCurrency).toBe(40); + expect(platforms[UNKNOWN_KEY].valueInBaseCurrency).toBe(40); + }); + + it('should not create an unknown bucket when every activity has an account', async () => { + const { accounts, platforms } = await getValueOfAccountsAndPlatforms({ + activities: [ + { + account, + accountId: account.id, + quantity: 1, + SymbolProfile: { symbol: 'AAPL' }, + type: 'BUY' + } + ], + filters: [], + portfolioItemsNow: { + AAPL: { marketPriceInBaseCurrency: 10 } + }, + userCurrency: 'USD', + userId: userDummyData.id + }); + + expect(accounts[UNKNOWN_KEY]).toBeUndefined(); + expect(platforms[UNKNOWN_KEY]).toBeUndefined(); + }); + }); }); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 37d76bcfa..c15353521 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -108,6 +108,8 @@ const europeMarkets = require('../../assets/countries/europe-markets.json'); @Injectable() export class PortfolioService { + private readonly logger = new Logger(PortfolioService.name); + public constructor( private readonly accountBalanceService: AccountBalanceService, private readonly accountService: AccountService, @@ -619,9 +621,8 @@ export class PortfolioService { symbolProfileMap[getAssetProfileIdentifier({ dataSource, symbol })]; if (!assetProfile) { - Logger.warn( - `Asset profile not found for ${symbol} (${dataSource})`, - 'PortfolioService' + this.logger.warn( + `Asset profile not found for ${symbol} (${dataSource})` ); continue; @@ -956,6 +957,18 @@ export class PortfolioService { marketPriceMin, SymbolProfile, tags, + assetProfile: { + assetClass: SymbolProfile.assetClass, + assetSubClass: SymbolProfile.assetSubClass, + countries: SymbolProfile.countries, + currency: SymbolProfile.currency, + dataSource: SymbolProfile.dataSource, + isin: SymbolProfile.isin, + name: SymbolProfile.name, + sectors: SymbolProfile.sectors, + symbol: SymbolProfile.symbol, + userId: SymbolProfile.userId + }, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), @@ -1452,31 +1465,29 @@ export class PortfolioService { for (const [, position] of Object.entries(holdings)) { const value = position.valueInBaseCurrency; - if (position.assetProfile.assetClass !== AssetClass.LIQUIDITY) { - if (position.assetProfile.countries.length > 0) { - markets.developedMarkets.valueInBaseCurrency += - position.markets.developedMarkets * value; - markets.emergingMarkets.valueInBaseCurrency += - position.markets.emergingMarkets * value; - markets.otherMarkets.valueInBaseCurrency += - position.markets.otherMarkets * value; - - marketsAdvanced.asiaPacific.valueInBaseCurrency += - position.marketsAdvanced.asiaPacific * value; - marketsAdvanced.emergingMarkets.valueInBaseCurrency += - position.marketsAdvanced.emergingMarkets * value; - marketsAdvanced.europe.valueInBaseCurrency += - position.marketsAdvanced.europe * value; - marketsAdvanced.japan.valueInBaseCurrency += - position.marketsAdvanced.japan * value; - marketsAdvanced.northAmerica.valueInBaseCurrency += - position.marketsAdvanced.northAmerica * value; - marketsAdvanced.otherMarkets.valueInBaseCurrency += - position.marketsAdvanced.otherMarkets * value; - } else { - markets[UNKNOWN_KEY].valueInBaseCurrency += value; - marketsAdvanced[UNKNOWN_KEY].valueInBaseCurrency += value; - } + if (position.assetProfile.countries.length > 0) { + markets.developedMarkets.valueInBaseCurrency += + position.markets.developedMarkets * value; + markets.emergingMarkets.valueInBaseCurrency += + position.markets.emergingMarkets * value; + markets.otherMarkets.valueInBaseCurrency += + position.markets.otherMarkets * value; + + marketsAdvanced.asiaPacific.valueInBaseCurrency += + position.marketsAdvanced.asiaPacific * value; + marketsAdvanced.emergingMarkets.valueInBaseCurrency += + position.marketsAdvanced.emergingMarkets * value; + marketsAdvanced.europe.valueInBaseCurrency += + position.marketsAdvanced.europe * value; + marketsAdvanced.japan.valueInBaseCurrency += + position.marketsAdvanced.japan * value; + marketsAdvanced.northAmerica.valueInBaseCurrency += + position.marketsAdvanced.northAmerica * value; + marketsAdvanced.otherMarkets.valueInBaseCurrency += + position.marketsAdvanced.otherMarkets * value; + } else { + markets[UNKNOWN_KEY].valueInBaseCurrency += value; + marketsAdvanced[UNKNOWN_KEY].valueInBaseCurrency += value; } } @@ -2162,40 +2173,44 @@ export class PortfolioService { return withExcludedAccounts || account.isExcluded === false; }); - for (const account of currentAccounts) { + // Iterate over the accounts plus a null entry to group activities without + // an account into the unknown bucket + for (const account of [...currentAccounts, null]) { const ordersByAccount = activities.filter(({ accountId }) => { - return accountId === account.id; + return account ? accountId === account.id : !accountId; }); - accounts[account.id] = { - balance: account.balance, - currency: account.currency, - name: account.name, - valueInBaseCurrency: this.exchangeRateDataService.toCurrency( - account.balance, - account.currency, - userCurrency - ) - }; - - if (platforms[account.platformId || UNKNOWN_KEY]?.valueInBaseCurrency) { - platforms[account.platformId || UNKNOWN_KEY].valueInBaseCurrency += - this.exchangeRateDataService.toCurrency( - account.balance, - account.currency, - userCurrency - ); - } else { - platforms[account.platformId || UNKNOWN_KEY] = { + if (account) { + accounts[account.id] = { balance: account.balance, currency: account.currency, - name: account.platform?.name, + name: account.name, valueInBaseCurrency: this.exchangeRateDataService.toCurrency( account.balance, account.currency, userCurrency ) }; + + if (platforms[account.platformId || UNKNOWN_KEY]?.valueInBaseCurrency) { + platforms[account.platformId || UNKNOWN_KEY].valueInBaseCurrency += + this.exchangeRateDataService.toCurrency( + account.balance, + account.currency, + userCurrency + ); + } else { + platforms[account.platformId || UNKNOWN_KEY] = { + balance: account.balance, + currency: account.currency, + name: account.platform?.name, + valueInBaseCurrency: this.exchangeRateDataService.toCurrency( + account.balance, + account.currency, + userCurrency + ) + }; + } } for (const { 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 9d8d9da9d..0c159bc1c 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -28,14 +28,16 @@ import { DEFAULT_CURRENCY, DEFAULT_DATE_RANGE, DEFAULT_LANGUAGE_CODE, + DEFAULT_LOCALE, PROPERTY_IS_READ_ONLY_MODE, + PROPERTY_REFERRAL_PARTNERS, PROPERTY_SYSTEM_MESSAGE, - TAG_ID_EXCLUDE_FROM_ANALYSIS, - locale as defaultLocale + TAG_ID_EXCLUDE_FROM_ANALYSIS } from '@ghostfolio/common/config'; import { SubscriptionType } from '@ghostfolio/common/enums'; import { User as IUser, + ReferralPartner, SystemMessage, UserSettings } from '@ghostfolio/common/interfaces'; @@ -100,7 +102,7 @@ export class UserService { public async getUser({ impersonationUserId, - locale = defaultLocale, + locale = DEFAULT_LOCALE, user }: { impersonationUserId: string; @@ -153,6 +155,17 @@ export class UserService { (impersonationUserSettings?.settings as UserSettings)?.baseCurrency ?? (settings.settings as UserSettings)?.baseCurrency; + let referralPartners: ReferralPartner[]; + + if ( + this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION') && + subscription.type === SubscriptionType.Basic + ) { + referralPartners = await this.propertyService.getByKey( + PROPERTY_REFERRAL_PARTNERS + ); + } + let systemMessage: SystemMessage; const systemMessageProperty = @@ -179,6 +192,7 @@ export class UserService { activitiesCount, id, permissions, + referralPartners, subscription, systemMessage, tags, 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/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index 57643f76c..fb8ff5dc5 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -64,6 +64,7 @@ export class TransformDataSourceInResponseInterceptor< paths: [ 'activities[*].dataSource', 'activities[*].SymbolProfile.dataSource', + 'assetProfile.dataSource', 'benchmarks[*].dataSource', 'errors[*].dataSource', 'fearAndGreedIndex.CRYPTOCURRENCIES.dataSource', diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index 94e389f6a..63185a48b 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -23,6 +23,8 @@ import { EnvHttpProxyAgent, setGlobalDispatcher } from 'undici'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; +const logger = new Logger('Bootstrap'); + async function bootstrap() { // Respect HTTP_PROXY / HTTPS_PROXY / NO_PROXY for outbound HTTP requests setGlobalDispatcher(new EnvHttpProxyAgent()); @@ -114,20 +116,20 @@ async function bootstrap() { address = `${host}:${addressObject.port}`; } - Logger.log(`Listening at http://${address}`); - Logger.log(''); + logger.log(`Listening at http://${address}`); + logger.log(''); }); } function logLogo() { - Logger.log(' ________ __ ____ ___'); - Logger.log(' / ____/ /_ ____ _____/ /_/ __/___ / (_)___'); - Logger.log(' / / __/ __ \\/ __ \\/ ___/ __/ /_/ __ \\/ / / __ \\'); - Logger.log('/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ /'); - Logger.log( + logger.log(' ________ __ ____ ___'); + logger.log(' / ____/ /_ ____ _____/ /_/ __/___ / (_)___'); + logger.log(' / / __/ __ \\/ __ \\/ ___/ __/ /_/ __ \\/ / / __ \\'); + logger.log('/ /_/ / / / / /_/ (__ ) /_/ __/ /_/ / / / /_/ /'); + logger.log( `\\____/_/ /_/\\____/____/\\__/_/ \\____/_/_/\\____/ ${environment.version}` ); - Logger.log(''); + logger.log(''); } bootstrap(); diff --git a/apps/api/src/middlewares/html-template.middleware.ts b/apps/api/src/middlewares/html-template.middleware.ts index 2b8820e81..c256ada56 100644 --- a/apps/api/src/middlewares/html-template.middleware.ts +++ b/apps/api/src/middlewares/html-template.middleware.ts @@ -92,6 +92,8 @@ const locales = { @Injectable() export class HtmlTemplateMiddleware implements NestMiddleware { + private readonly logger = new Logger(HtmlTemplateMiddleware.name); + private indexHtmlMap: { [languageCode: string]: string } = {}; public constructor(private readonly i18nService: I18nService) { @@ -107,11 +109,7 @@ export class HtmlTemplateMiddleware implements NestMiddleware { {} ); } catch (error) { - Logger.error( - 'Failed to initialize index HTML map', - error, - 'HTMLTemplateMiddleware' - ); + this.logger.error('Failed to initialize index HTML map', error); } } diff --git a/apps/api/src/services/benchmark/benchmark.service.ts b/apps/api/src/services/benchmark/benchmark.service.ts index 4b1d9a65f..022a0e928 100644 --- a/apps/api/src/services/benchmark/benchmark.service.ts +++ b/apps/api/src/services/benchmark/benchmark.service.ts @@ -28,6 +28,8 @@ import { BenchmarkValue } from './interfaces/benchmark-value.interface'; @Injectable() export class BenchmarkService { + private readonly logger = new Logger(BenchmarkService.name); + private readonly CACHE_KEY_BENCHMARKS = 'BENCHMARKS'; public constructor( @@ -87,7 +89,7 @@ export class BenchmarkService { const { benchmarks, expiration }: BenchmarkValue = JSON.parse(cachedBenchmarkValue); - Logger.debug('Fetched benchmarks from cache', 'BenchmarkService'); + this.logger.debug('Fetched benchmarks from cache'); if (isAfter(new Date(), new Date(expiration))) { this.calculateAndCacheBenchmarks({ @@ -227,7 +229,7 @@ export class BenchmarkService { private async calculateAndCacheBenchmarks({ enableSharing = false }): Promise { - Logger.debug('Calculate benchmarks', 'BenchmarkService'); + this.logger.debug('Calculate benchmarks'); const benchmarkAssetProfiles = await this.getBenchmarkAssetProfiles({ enableSharing diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index b19508d3e..5f9d1055d 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -30,7 +30,6 @@ export class ConfigurationService { API_KEY_FINANCIAL_MODELING_PREP: str({ default: '' }), API_KEY_OPEN_FIGI: str({ default: '' }), API_KEY_RAPID_API: str({ default: '' }), - BULL_BOARD_IS_READ_ONLY: bool({ default: true }), CACHE_QUOTES_TTL: num({ default: ms('1 minute') }), CACHE_TTL: num({ default: CACHE_TTL_NO_CACHE }), DATA_SOURCE_EXCHANGE_RATES: str({ default: DataSource.YAHOO }), diff --git a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts index b01ba177b..5d6ed79aa 100644 --- a/apps/api/src/services/data-provider/coingecko/coingecko.service.ts +++ b/apps/api/src/services/data-provider/coingecko/coingecko.service.ts @@ -29,6 +29,8 @@ import { format, fromUnixTime, getUnixTime } from 'date-fns'; @Injectable() export class CoinGeckoService implements DataProviderInterface, OnModuleInit { + private readonly logger = new Logger(CoinGeckoService.name); + private apiUrl: string; private headers: HeadersInit = {}; @@ -88,7 +90,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return response; @@ -214,7 +216,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return response; @@ -262,7 +264,7 @@ export class CoinGeckoService implements DataProviderInterface, OnModuleInit { ).toFixed(3)} seconds`; } - Logger.error(message, 'CoinGeckoService'); + this.logger.error(message); } return { items }; diff --git a/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts b/apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts index eeccf725e..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,13 +1,15 @@ +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 { @@ -17,13 +19,17 @@ export class TrackinsightDataEnhancerService implements DataEnhancerInterface { 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 fetchService: FetchService @@ -115,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 }); } @@ -163,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 }); } @@ -209,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..85ec6c020 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 { isCurrencySymbol } 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'] }); @@ -56,31 +73,21 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { * DOGEUSD -> DOGE-USD */ public convertToYahooFinanceSymbol(aSymbol: string) { - if ( - aSymbol.includes(DEFAULT_CURRENCY) && - aSymbol.length > DEFAULT_CURRENCY.length + if (isCurrencySymbol(aSymbol)) { + return `${aSymbol}=X`; + } else if ( + this.cryptocurrencyService.isCryptocurrency( + aSymbol.replace(new RegExp(`-${DEFAULT_CURRENCY}$`), DEFAULT_CURRENCY) + ) ) { - if ( - isCurrency( - aSymbol.substring(0, aSymbol.length - DEFAULT_CURRENCY.length) - ) && - isCurrency(aSymbol.substring(aSymbol.length - DEFAULT_CURRENCY.length)) - ) { - return `${aSymbol}=X`; - } else if ( - this.cryptocurrencyService.isCryptocurrency( - aSymbol.replace(new RegExp(`-${DEFAULT_CURRENCY}$`), DEFAULT_CURRENCY) - ) - ) { - // Add a dash before the last three characters - // BTCUSD -> BTC-USD - // DOGEUSD -> DOGE-USD - // SOL1USD -> SOL1-USD - return aSymbol.replace( - new RegExp(`-?${DEFAULT_CURRENCY}$`), - `-${DEFAULT_CURRENCY}` - ); - } + // Add a dash before the last three characters + // BTCUSD -> BTC-USD + // DOGEUSD -> DOGE-USD + // SOL1USD -> SOL1-USD + return aSymbol.replace( + new RegExp(`-?${DEFAULT_CURRENCY}$`), + `-${DEFAULT_CURRENCY}` + ); } return aSymbol; @@ -123,7 +130,7 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { response.url = url; } } catch (error) { - Logger.error(error, 'YahooFinanceDataEnhancerService'); + this.logger.error(error); } return response; @@ -222,7 +229,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 +276,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 +339,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.service.ts b/apps/api/src/services/data-provider/data-provider.service.ts index 5f0a6928a..5b54afb0b 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; } @@ -383,15 +385,16 @@ export class DataProviderService implements OnModuleInit { response = marketDataByGranularity.reduce((r, marketData) => { const { date, marketPrice, symbol } = marketData; - r[symbol] = { - ...(r[symbol] || {}), - [format(new Date(date), DATE_FORMAT)]: { marketPrice } - }; + if (!r[symbol]) { + r[symbol] = {}; + } + + r[symbol][format(new Date(date), DATE_FORMAT)] = { marketPrice }; return r; }, {}); } catch (error) { - Logger.error(error, 'DataProviderService'); + this.logger.error(error); } finally { return response; } @@ -503,7 +506,7 @@ export class DataProviderService implements OnModuleInit { result[symbol] = data; } } catch (error) { - Logger.error(error, 'DataProviderService'); + this.logger.error(error); throw error; } @@ -567,13 +570,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 +686,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 +723,18 @@ export class DataProviderService implements OnModuleInit { await Promise.all(promises); - Logger.debug('--------------------------------------------------------'); - Logger.debug( + this.logger.debug( + '--------------------------------------------------------' + ); + this.logger.debug( `Fetched ${items.length} quote${items.length > 1 ? 's' : ''} in ${( (performance.now() - startTimeTotal) / 1000 - ).toFixed(3)} seconds`, - 'DataProviderService' + ).toFixed(3)} seconds` + ); + this.logger.debug( + '========================================================' ); - Logger.debug('========================================================'); return response; } diff --git a/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts b/apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts index 3fa38842b..ebb6cd743 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 @@ -13,7 +13,7 @@ import { DEFAULT_CURRENCY, REPLACE_NAME_PARTS } from '@ghostfolio/common/config'; -import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; +import { DATE_FORMAT, isCurrencySymbol } from '@ghostfolio/common/helper'; import { DataProviderHistoricalResponse, DataProviderInfo, @@ -37,6 +37,8 @@ import { isNumber } from 'lodash'; export class EodHistoricalDataService implements DataProviderInterface, OnModuleInit { + private readonly logger = new Logger(EodHistoricalDataService.name); + private apiKey: string; private readonly URL = 'https://eodhistoricaldata.com/api'; @@ -127,12 +129,11 @@ export class EodHistoricalDataService return response; } catch (error) { - Logger.error( + this.logger.error( `Could not get dividends for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT - )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`, - 'EodHistoricalDataService' + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` ); return {}; @@ -172,9 +173,8 @@ export class EodHistoricalDataService marketPrice: adjusted_close }; } else { - Logger.error( - `Could not get historical market data for ${symbol} (${this.getName()}) at ${date}`, - 'EodHistoricalDataService' + this.logger.error( + `Could not get historical market data for ${symbol} (${this.getName()}) at ${date}` ); } @@ -292,9 +292,8 @@ export class EodHistoricalDataService dataSource: this.getName() }; } else { - Logger.error( - `Could not get quote for ${this.convertFromEodSymbol(code)} (${this.getName()})`, - 'EodHistoricalDataService' + this.logger.error( + `Could not get quote for ${this.convertFromEodSymbol(code)} (${this.getName()})` ); } } @@ -311,7 +310,7 @@ export class EodHistoricalDataService ).toFixed(3)} seconds`; } - Logger.error(message, 'EodHistoricalDataService'); + this.logger.error(message); } return {}; @@ -383,20 +382,11 @@ export class EodHistoricalDataService * Currency: USDCHF -> USDCHF.FOREX */ private convertToEodSymbol(aSymbol: string) { - if ( - aSymbol.startsWith(DEFAULT_CURRENCY) && - aSymbol.length > DEFAULT_CURRENCY.length - ) { - if ( - isCurrency( - aSymbol.substring(0, aSymbol.length - DEFAULT_CURRENCY.length) - ) - ) { - let symbol = aSymbol; - symbol = symbol.replace('GBp', 'GBX'); + if (isCurrencySymbol(aSymbol)) { + let symbol = aSymbol; + symbol = symbol.replace('GBp', 'GBX'); - return `${symbol}.FOREX`; - } + return `${symbol}.FOREX`; } return aSymbol; @@ -465,7 +455,7 @@ export class EodHistoricalDataService ).toFixed(3)} seconds`; } - Logger.error(message, 'EodHistoricalDataService'); + this.logger.error(message); } return searchResult; diff --git a/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts b/apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts index fa36a0d17..ca48bb247 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'; @@ -15,7 +16,11 @@ import { DEFAULT_CURRENCY, REPLACE_NAME_PARTS } from '@ghostfolio/common/config'; -import { DATE_FORMAT, isCurrency, parseDate } from '@ghostfolio/common/helper'; +import { + DATE_FORMAT, + isCurrencySymbol, + parseDate +} from '@ghostfolio/common/helper'; import { DataProviderHistoricalResponse, DataProviderInfo, @@ -33,7 +38,6 @@ import { SymbolProfile } from '@prisma/client'; import { isISIN } from 'class-validator'; -import { countries } from 'countries-list'; import { addDays, addYears, @@ -55,6 +59,8 @@ export class FinancialModelingPrepService 'Taiwan (Province of China)': 'Taiwan' }; + private readonly logger = new Logger(FinancialModelingPrepService.name); + private apiKey: string; public constructor( @@ -84,9 +90,7 @@ export class FinancialModelingPrepService }; try { - if ( - isCurrency(symbol.substring(0, symbol.length - DEFAULT_CURRENCY.length)) - ) { + if (isCurrencySymbol(symbol)) { response.assetClass = AssetClass.LIQUIDITY; response.assetSubClass = AssetSubClass.CASH; response.currency = symbol.substring( @@ -163,21 +167,11 @@ export class FinancialModelingPrepService 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 }; }); @@ -265,7 +259,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return response; @@ -325,12 +319,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 {}; @@ -491,11 +484,7 @@ export class FinancialModelingPrepService for (const { price, symbol } of quotes) { let marketState: MarketState = 'delayed'; - if ( - isCurrency( - symbol.substring(0, symbol.length - DEFAULT_CURRENCY.length) - ) - ) { + if (isCurrencySymbol(symbol)) { marketState = 'open'; } @@ -518,7 +507,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return response; @@ -638,7 +627,7 @@ export class FinancialModelingPrepService ).toFixed(3)} seconds`; } - Logger.error(message, 'FinancialModelingPrepService'); + this.logger.error(message); } return { items }; diff --git a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts index 2f2601d5d..2b91855a6 100644 --- a/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts +++ b/apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts @@ -33,6 +33,8 @@ import { StatusCodes } from 'http-status-codes'; @Injectable() export class GhostfolioService implements DataProviderInterface { + private readonly logger = new Logger(GhostfolioService.name); + private readonly URL = environment.production ? 'https://ghostfol.io/api' : `${this.configurationService.get('ROOT_URL')}/api`; @@ -89,7 +91,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return assetProfile; @@ -154,7 +156,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return dividends; @@ -211,7 +213,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(error.message, 'GhostfolioService'); + this.logger.error(error.message); throw new Error( `Could not get historical market data for ${symbol} (${this.getName()}) from ${format( @@ -283,7 +285,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return quotes; @@ -338,7 +340,7 @@ export class GhostfolioService implements DataProviderInterface { 'RequestError: The API key is invalid. Please update it in the Settings section of the Admin Control panel.'; } - Logger.error(message, 'GhostfolioService'); + this.logger.error(message); } return searchResult; diff --git a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts index ba1e5bbe5..13f671bd4 100644 --- a/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts +++ b/apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts @@ -24,6 +24,8 @@ import { GoogleSpreadsheet } from 'google-spreadsheet'; @Injectable() export class GoogleSheetsService implements DataProviderInterface { + private readonly logger = new Logger(GoogleSheetsService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly prismaService: PrismaService, @@ -144,7 +146,7 @@ export class GoogleSheetsService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'GoogleSheetsService'); + this.logger.error(error); } return {}; diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index 11e0aae6a..87e116dda 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -31,6 +31,8 @@ import { addDays, format, isBefore } from 'date-fns'; @Injectable() export class ManualService implements DataProviderInterface { + private readonly logger = new Logger(ManualService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly fetchService: FetchService, @@ -181,9 +183,8 @@ export class ManualService implements DataProviderInterface { }); return { marketPrice, symbol }; } catch (error) { - Logger.error( - `Could not get quote for ${symbol} (${this.getName()}): [${error.name}] ${error.message}`, - 'ManualService' + this.logger.error( + `Could not get quote for ${symbol} (${this.getName()}): [${error.name}] ${error.message}` ); return { symbol, marketPrice: undefined }; } @@ -216,7 +217,7 @@ export class ManualService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'ManualService'); + this.logger.error(error); } return {}; diff --git a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts index 22896cccc..9941ae9eb 100644 --- a/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts +++ b/apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts @@ -26,6 +26,8 @@ import { format } from 'date-fns'; @Injectable() export class RapidApiService implements DataProviderInterface { + private readonly logger = new Logger(RapidApiService.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly fetchService: FetchService @@ -122,7 +124,7 @@ export class RapidApiService implements DataProviderInterface { }; } } catch (error) { - Logger.error(error, 'RapidApiService'); + this.logger.error(error); } return {}; @@ -167,7 +169,7 @@ export class RapidApiService implements DataProviderInterface { ).toFixed(3)} seconds`; } - Logger.error(message, 'RapidApiService'); + this.logger.error(message); return undefined; } diff --git a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts index de8807098..93949ebc0 100644 --- a/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts @@ -41,6 +41,8 @@ import { SearchQuoteNonYahoo } from 'yahoo-finance2/esm/src/modules/search'; @Injectable() export class YahooFinanceService implements DataProviderInterface { + private readonly logger = new Logger(YahooFinanceService.name); + private readonly yahooFinance = new YahooFinance({ suppressNotices: ['yahooSurvey'] }); @@ -105,12 +107,11 @@ export class YahooFinanceService implements DataProviderInterface { return response; } catch (error) { - Logger.error( + this.logger.error( `Could not get dividends for ${symbol} (${this.getName()}) from ${format( from, DATE_FORMAT - )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}`, - 'YahooFinanceService' + )} to ${format(to, DATE_FORMAT)}: [${error.name}] ${error.message}` ); return {}; @@ -198,12 +199,9 @@ export class YahooFinanceService implements DataProviderInterface { try { quotes = await this.yahooFinance.quote(yahooFinanceSymbols); } catch (error) { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); - Logger.warn( - 'Fallback to yahooFinance.quoteSummary()', - 'YahooFinanceService' - ); + this.logger.warn('Fallback to yahooFinance.quoteSummary()'); quotes = await this.getQuotesWithQuoteSummary(yahooFinanceSymbols); } @@ -229,7 +227,7 @@ export class YahooFinanceService implements DataProviderInterface { return response; } catch (error) { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); return {}; } @@ -334,7 +332,7 @@ export class YahooFinanceService implements DataProviderInterface { }); } } catch (error) { - Logger.error(error, 'YahooFinanceService'); + this.logger.error(error); } return { items }; @@ -365,10 +363,7 @@ export class YahooFinanceService implements DataProviderInterface { .filter( (result): result is PromiseFulfilledResult => { if (result.status === 'rejected') { - Logger.error( - `Could not get quote summary: ${result.reason}`, - 'YahooFinanceService' - ); + this.logger.error(`Could not get quote summary: ${result.reason}`); return false; } diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 024bdf4e1..708bfa591 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -30,6 +30,8 @@ import { ExchangeRatesByCurrency } from './interfaces/exchange-rate-data.interfa @Injectable() export class ExchangeRateDataService { + private readonly logger = new Logger(ExchangeRateDataService.name); + private currencies: string[] = []; private currencyPairs: DataGatheringItem[] = []; private derivedCurrencyFactors: { [currencyPair: string]: number } = {}; @@ -110,9 +112,8 @@ export class ExchangeRateDataService { previousExchangeRate; if (currency === DEFAULT_CURRENCY && isBefore(date, new Date())) { - Logger.error( - `No exchange rate has been found for ${currency}${targetCurrency} at ${dateString}`, - 'ExchangeRateDataService' + this.logger.error( + `No exchange rate has been found for ${currency}${targetCurrency} at ${dateString}` ); } } else { @@ -253,9 +254,8 @@ export class ExchangeRateDataService { } // Fallback with error, if currencies are not available - Logger.error( - `No exchange rate has been found for ${aFromCurrency}${aToCurrency}`, - 'ExchangeRateDataService' + this.logger.error( + `No exchange rate has been found for ${aFromCurrency}${aToCurrency}` ); return aValue; @@ -341,12 +341,11 @@ export class ExchangeRateDataService { return factor * aValue; } - Logger.error( + this.logger.error( `No exchange rate has been found for ${aFromCurrency}${aToCurrency} at ${format( aDate, DATE_FORMAT - )}`, - 'ExchangeRateDataService' + )}` ); return undefined; @@ -483,7 +482,7 @@ export class ExchangeRateDataService { errorMessage = `${errorMessage} and ${DEFAULT_CURRENCY}${currencyTo}`; } - Logger.error(`${errorMessage}.`, 'ExchangeRateDataService'); + this.logger.error(`${errorMessage}.`); } } } diff --git a/apps/api/src/services/fetch/fetch.service.ts b/apps/api/src/services/fetch/fetch.service.ts index f32e56a1c..2425e476e 100644 --- a/apps/api/src/services/fetch/fetch.service.ts +++ b/apps/api/src/services/fetch/fetch.service.ts @@ -3,6 +3,7 @@ import { PropertyService } from '@ghostfolio/api/services/property/property.serv import { PROPERTY_API_KEY_OPENROUTER, PROPERTY_OPENROUTER_MODEL, + PROPERTY_OPENROUTER_MODEL_WEB_FETCH, PROPERTY_WEB_FETCH_ROUTES } from '@ghostfolio/common/config'; @@ -15,6 +16,8 @@ import { WebFetchRoute } from './interfaces/web-fetch-route.interface'; @Injectable() export class FetchService implements OnModuleInit { + private readonly logger = new Logger(FetchService.name); + private static readonly REDACTED_QUERY_PARAM_NAMES = ['apikey', 'api_token']; private static readonly WEB_FETCH_TIMEOUT = ms('30 seconds'); @@ -39,7 +42,7 @@ export class FetchService implements OnModuleInit { const url = input instanceof Request ? input.url : input.toString(); const urlRedacted = this.redactUrl(url); - Logger.debug(`${method} ${urlRedacted}`, 'FetchService'); + this.logger.debug(`${method} ${urlRedacted}`); if (method === 'GET') { const webFetchRoute = this.getMatchingWebFetchRoute(url); @@ -60,15 +63,11 @@ export class FetchService implements OnModuleInit { return await globalThis.fetch(input, init); } catch (error) { if (error instanceof Error) { - Logger.error( - `${method} ${urlRedacted} failed: [${error.name}] ${error.message}`, - 'FetchService' + this.logger.error( + `${method} ${urlRedacted} failed: [${error.name}] ${error.message}` ); } else { - Logger.error( - `${method} ${urlRedacted} failed: ${String(error)}`, - 'FetchService' - ); + this.logger.error(`${method} ${urlRedacted} failed: ${String(error)}`); } throw error; @@ -82,12 +81,18 @@ export class FetchService implements OnModuleInit { 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) { + const [openRouterApiKey, openRouterModel, openRouterModelWebFetch] = + await Promise.all([ + this.propertyService.getByKey(PROPERTY_API_KEY_OPENROUTER), + this.propertyService.getByKey(PROPERTY_OPENROUTER_MODEL), + this.propertyService.getByKey( + PROPERTY_OPENROUTER_MODEL_WEB_FETCH + ) + ]); + + const model = openRouterModelWebFetch || openRouterModel; + + if (!model || !openRouterApiKey) { return undefined; } @@ -95,7 +100,7 @@ export class FetchService implements OnModuleInit { const openRouterService = createOpenRouter({ apiKey: openRouterApiKey }); const { sources, text } = await generateText({ - model: openRouterService.chat(openRouterModel), + model: openRouterService.chat(model), 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.', @@ -145,10 +150,7 @@ export class FetchService implements OnModuleInit { } } - Logger.debug( - `Routed ${this.redactUrl(url)} via web fetch tool`, - 'FetchService' - ); + this.logger.debug(`Routed ${this.redactUrl(url)} via web fetch tool`); return new Response(body, { headers: webFetchRoute.responseContentType @@ -159,11 +161,10 @@ export class FetchService implements OnModuleInit { return undefined; } catch (error) { - Logger.error( + this.logger.error( `Web fetch tool failed for ${this.redactUrl(url)}: ${ error instanceof Error ? error.message : String(error) - }`, - 'FetchService' + }` ); return undefined; diff --git a/apps/api/src/services/i18n/i18n.service.ts b/apps/api/src/services/i18n/i18n.service.ts index 1cdb811a9..65c51b2f0 100644 --- a/apps/api/src/services/i18n/i18n.service.ts +++ b/apps/api/src/services/i18n/i18n.service.ts @@ -7,6 +7,8 @@ import { join } from 'node:path'; @Injectable() export class I18nService implements OnModuleInit { + private readonly logger = new Logger(I18nService.name); + private localesPath = join(__dirname, 'assets', 'locales'); private translations: { [locale: string]: cheerio.CheerioAPI } = {}; @@ -26,7 +28,7 @@ export class I18nService implements OnModuleInit { const $ = this.translations[languageCode]; if (!$) { - Logger.warn(`Translation not found for locale '${languageCode}'`); + this.logger.warn(`Translation not found for locale '${languageCode}'`); } let translatedText = $( @@ -36,7 +38,7 @@ export class I18nService implements OnModuleInit { ).text(); if (!translatedText) { - Logger.warn( + this.logger.warn( `Translation not found for id '${id}' in locale '${languageCode}'` ); } @@ -60,7 +62,7 @@ export class I18nService implements OnModuleInit { this.parseXml(xmlData); } } catch (error) { - Logger.error(error, 'I18nService'); + this.logger.error(error); } } diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index eb3ac86a3..57c58898e 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -10,7 +10,6 @@ export interface Environment extends CleanedEnvAccessors { API_KEY_FINANCIAL_MODELING_PREP: string; API_KEY_OPEN_FIGI: string; API_KEY_RAPID_API: string; - BULL_BOARD_IS_READ_ONLY: boolean; CACHE_QUOTES_TTL: number; CACHE_TTL: number; DATA_SOURCE_EXCHANGE_RATES: string; 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.module.ts b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts index 5672df5e8..5ac6c40c0 100644 --- a/apps/api/src/services/queues/data-gathering/data-gathering.module.ts +++ b/apps/api/src/services/queues/data-gathering/data-gathering.module.ts @@ -23,8 +23,7 @@ import { DataGatheringProcessor } from './data-gathering.processor'; adapter: BullAdapter, name: DATA_GATHERING_QUEUE, options: { - displayName: 'Data Gathering', - readOnlyMode: process.env.BULL_BOARD_IS_READ_ONLY !== 'false' + displayName: 'Data Gathering' } }), BullModule.registerQueue({ 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.module.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts index c90f826f6..0da529821 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.module.ts @@ -29,8 +29,7 @@ import { PortfolioSnapshotProcessor } from './portfolio-snapshot.processor'; adapter: BullAdapter, name: PORTFOLIO_SNAPSHOT_COMPUTATION_QUEUE, options: { - displayName: 'Portfolio Snapshot Computation', - readOnlyMode: process.env.BULL_BOARD_IS_READ_ONLY !== 'false' + displayName: 'Portfolio Snapshot Computation' } }), BullModule.registerQueue({ 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 d6f6d5ccd..6ef14e29c 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 @@ -20,8 +20,7 @@ import { StatisticsGatheringService } from './statistics-gathering.service'; adapter: BullAdapter, name: STATISTICS_GATHERING_QUEUE, options: { - displayName: 'Statistics Gathering', - readOnlyMode: process.env.BULL_BOARD_IS_READ_ONLY !== 'false' + displayName: 'Statistics Gathering' } }) ] diff --git a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts index a523ef4f2..7eefc101f 100644 --- a/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts +++ b/apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts @@ -27,6 +27,8 @@ import { format, subDays } from 'date-fns'; @Injectable() @Processor(STATISTICS_GATHERING_QUEUE) export class StatisticsGatheringProcessor { + private readonly logger = new Logger(StatisticsGatheringProcessor.name); + public constructor( private readonly configurationService: ConfigurationService, private readonly fetchService: FetchService, @@ -35,10 +37,7 @@ export class StatisticsGatheringProcessor { @Process(GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME) public async gatherDockerHubPullsStatistics() { - Logger.log( - 'Docker Hub pulls statistics gathering has been started', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Docker Hub pulls statistics gathering has been started'); const dockerHubPulls = await this.countDockerHubPulls(); @@ -47,17 +46,13 @@ export class StatisticsGatheringProcessor { value: String(dockerHubPulls) }); - Logger.log( - 'Docker Hub pulls statistics gathering has been completed', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Docker Hub pulls statistics gathering has been completed'); } @Process(GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME) public async gatherGitHubContributorsStatistics() { - Logger.log( - 'GitHub contributors statistics gathering has been started', - 'StatisticsGatheringProcessor' + this.logger.log( + 'GitHub contributors statistics gathering has been started' ); const gitHubContributors = await this.countGitHubContributors(); @@ -67,18 +62,14 @@ export class StatisticsGatheringProcessor { value: String(gitHubContributors) }); - Logger.log( - 'GitHub contributors statistics gathering has been completed', - 'StatisticsGatheringProcessor' + this.logger.log( + 'GitHub contributors statistics gathering has been completed' ); } @Process(GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME) public async gatherGitHubStargazersStatistics() { - Logger.log( - 'GitHub stargazers statistics gathering has been started', - 'StatisticsGatheringProcessor' - ); + this.logger.log('GitHub stargazers statistics gathering has been started'); const gitHubStargazers = await this.countGitHubStargazers(); @@ -87,9 +78,8 @@ export class StatisticsGatheringProcessor { value: String(gitHubStargazers) }); - Logger.log( - 'GitHub stargazers statistics gathering has been completed', - 'StatisticsGatheringProcessor' + this.logger.log( + 'GitHub stargazers statistics gathering has been completed' ); } @@ -100,18 +90,14 @@ export class StatisticsGatheringProcessor { ); if (!monitorId) { - Logger.log( - `Uptime statistics gathering has been skipped as no ${PROPERTY_BETTER_UPTIME_MONITOR_ID} is configured`, - 'StatisticsGatheringProcessor' + this.logger.log( + `Uptime statistics gathering has been skipped as no ${PROPERTY_BETTER_UPTIME_MONITOR_ID} is configured` ); return; } - Logger.log( - 'Uptime statistics gathering has been started', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Uptime statistics gathering has been started'); const uptime = await this.getUptime(monitorId); @@ -120,10 +106,7 @@ export class StatisticsGatheringProcessor { value: String(uptime) }); - Logger.log( - 'Uptime statistics gathering has been completed', - 'StatisticsGatheringProcessor' - ); + this.logger.log('Uptime statistics gathering has been completed'); } private async countDockerHubPulls(): Promise { @@ -139,7 +122,7 @@ export class StatisticsGatheringProcessor { return pull_count; } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - DockerHub'); + this.logger.error(error); throw error; } @@ -169,7 +152,7 @@ export class StatisticsGatheringProcessor { value }); } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + this.logger.error(error); throw error; } @@ -188,7 +171,7 @@ export class StatisticsGatheringProcessor { return stargazers_count; } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - GitHub'); + this.logger.error(error); throw error; } @@ -217,7 +200,7 @@ export class StatisticsGatheringProcessor { return data.attributes.availability / 100; } catch (error) { - Logger.error(error, 'StatisticsGatheringProcessor - Better Stack'); + this.logger.error(error); throw error; } diff --git a/apps/api/src/services/symbol-profile/symbol-profile.service.ts b/apps/api/src/services/symbol-profile/symbol-profile.service.ts index 4c2c42589..2d5116274 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, @@ -10,7 +11,12 @@ import { Country } from '@ghostfolio/common/interfaces/country.interface'; import { Sector } from '@ghostfolio/common/interfaces/sector.interface'; import { Injectable } from '@nestjs/common'; -import { Prisma, SymbolProfile, SymbolProfileOverrides } from '@prisma/client'; +import { + DataSource, + Prisma, + SymbolProfile, + SymbolProfileOverrides +} from '@prisma/client'; import { continents, countries } from 'countries-list'; @Injectable() @@ -70,6 +76,26 @@ export class SymbolProfileService { }); } + public getAssetProfileUpdateInput( + { dataSource }: AssetProfileIdentifier, + data: Prisma.SymbolProfileUpdateInput + ): Prisma.SymbolProfileUpdateInput { + if (dataSource === DataSource.MANUAL) { + return data; + } + + return { + SymbolProfileOverrides: { + upsert: { + create: + data as Prisma.SymbolProfileOverridesCreateWithoutSymbolProfileInput, + update: + data as Prisma.SymbolProfileOverridesUpdateWithoutSymbolProfileInput + } + } + }; + } + public async getSymbolProfiles( aAssetProfileIdentifiers: AssetProfileIdentifier[] ): Promise { @@ -192,21 +218,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 +250,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.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index d9b279040..7cdf3e671 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -3,7 +3,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_DATE_RANGE, DEFAULT_PAGE_SIZE, - NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + NUMERICAL_PRECISION_THRESHOLD_5_FIGURES } from '@ghostfolio/common/config'; import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; @@ -245,7 +245,7 @@ export class GfAccountDetailDialogComponent implements OnInit { this.balance = balance; if ( - this.balance >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES && + this.balance >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES && this.data.deviceType === 'mobile' ) { this.balancePrecision = 0; @@ -257,7 +257,7 @@ export class GfAccountDetailDialogComponent implements OnInit { if ( this.data.deviceType === 'mobile' && this.dividendInBaseCurrency >= - NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.dividendInBaseCurrencyPrecision = 0; } @@ -267,7 +267,7 @@ export class GfAccountDetailDialogComponent implements OnInit { if ( this.data.deviceType === 'mobile' && - this.equity >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + this.equity >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.equityPrecision = 0; } @@ -280,7 +280,7 @@ export class GfAccountDetailDialogComponent implements OnInit { if ( this.data.deviceType === 'mobile' && this.interestInBaseCurrency >= - NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.interestInBaseCurrencyPrecision = 0; } 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-jobs/admin-jobs.component.ts b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts index b4c228881..fd90bff2c 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts @@ -1,8 +1,5 @@ -import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { - BULL_BOARD_COOKIE_NAME, - BULL_BOARD_ROUTE, DATA_GATHERING_QUEUE_PRIORITY_HIGH, DATA_GATHERING_QUEUE_PRIORITY_LOW, DATA_GATHERING_QUEUE_PRIORITY_MEDIUM, @@ -10,7 +7,6 @@ import { } from '@ghostfolio/common/config'; import { getDateWithTimeFormatString } from '@ghostfolio/common/helper'; import { AdminJobs, User } from '@ghostfolio/common/interfaces'; -import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { AdminService } from '@ghostfolio/ui/services'; @@ -106,7 +102,6 @@ export class GfAdminJobsComponent implements OnInit { 'actions' ]; - protected hasPermissionToAccessBullBoard = false; protected isLoading = false; protected readonly statusFilterOptions = QUEUE_JOB_STATUS_LIST; @@ -116,7 +111,6 @@ export class GfAdminJobsComponent implements OnInit { private readonly changeDetectorRef = inject(ChangeDetectorRef); private readonly destroyRef = inject(DestroyRef); private readonly notificationService = inject(NotificationService); - private readonly tokenStorageService = inject(TokenStorageService); private readonly userService = inject(UserService); public constructor() { @@ -129,11 +123,6 @@ export class GfAdminJobsComponent implements OnInit { this.defaultDateTimeFormat = getDateWithTimeFormatString( this.user.settings.locale ); - - this.hasPermissionToAccessBullBoard = hasPermission( - this.user.permissions, - permissions.accessAdminControlBullBoard - ); } }); @@ -193,18 +182,6 @@ export class GfAdminJobsComponent implements OnInit { }); } - protected onOpenBullBoard() { - const token = this.tokenStorageService.getToken(); - - document.cookie = [ - `${BULL_BOARD_COOKIE_NAME}=${encodeURIComponent(token)}`, - 'path=/', - 'SameSite=Strict' - ].join('; '); - - window.open(BULL_BOARD_ROUTE, '_blank'); - } - protected onViewData(aData: AdminJobs['jobs'][0]['data']) { this.notificationService.alert({ title: JSON.stringify(aData, null, ' ') diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.html b/apps/client/src/app/components/admin-jobs/admin-jobs.html index d57704b86..e615db31b 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.html +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.html @@ -1,15 +1,6 @@
- @if (hasPermissionToAccessBullBoard) { -
- -
- } -
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 805adf89d..f7396eb1d 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 @@ -1,8 +1,8 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_COLOR_SCHEME, - DEFAULT_PAGE_SIZE, - locale + DEFAULT_LOCALE, + DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { canDeleteAssetProfile, @@ -10,11 +10,11 @@ import { } from '@ghostfolio/common/helper'; import { AssetProfileIdentifier, + AssetProfileItem, Filter, InfoItem, User } from '@ghostfolio/common/interfaces'; -import { AdminMarketDataItem } from '@ghostfolio/common/interfaces/admin-market-data.interface'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; @@ -152,7 +152,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { } ]; protected readonly canDeleteAssetProfile = canDeleteAssetProfile; - protected dataSource = new MatTableDataSource(); + protected dataSource = new MatTableDataSource(); protected defaultDateFormat: string; protected readonly displayedColumns: string[] = []; protected readonly filters$ = new Subject(); @@ -160,7 +160,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { protected readonly isUUID = isUUID; protected pageSize = DEFAULT_PAGE_SIZE; protected placeholder = ''; - protected readonly selection = new SelectionModel(true); + protected readonly selection = new SelectionModel(true); protected totalItems = 0; protected user: User; @@ -375,8 +375,8 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { this.selection.clear(); - this.adminService - .fetchAdminMarketData({ + this.dataService + .fetchAssetProfiles({ sortColumn, sortDirection, filters: this.activeFilters, @@ -384,15 +384,15 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { take: this.pageSize }) .pipe(takeUntilDestroyed(this.destroyRef)) - .subscribe(({ count, marketData }) => { + .subscribe(({ assetProfiles, count }) => { this.totalItems = count; this.dataSource = new MatTableDataSource( - marketData.map((marketDataItem) => { + assetProfiles.map((assetProfile) => { return { - ...marketDataItem, + ...assetProfile, isBenchmark: this.benchmarks.some(({ id }) => { - return id === marketDataItem.id; + return id === assetProfile.id; }) }; }) @@ -429,7 +429,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { colorScheme: this.user?.settings.colorScheme ?? DEFAULT_COLOR_SCHEME, deviceType: this.deviceType(), - locale: this.user?.settings?.locale ?? locale + locale: this.user?.settings?.locale ?? DEFAULT_LOCALE } satisfies AssetProfileDialogParams, height: this.deviceType() === 'mobile' ? '98vh' : '80vh', width: this.deviceType() === 'mobile' ? '100vw' : '50rem' @@ -464,7 +464,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit { autoFocus: false, data: { deviceType: this.deviceType(), - locale: this.user?.settings?.locale ?? locale + locale: this.user?.settings?.locale ?? DEFAULT_LOCALE } satisfies CreateAssetProfileDialogParams, width: this.deviceType() === 'mobile' ? '100vw' : '50rem' }); 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 63d425513..e86e3e631 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 @@ -239,7 +239,18 @@ [disabled]="!selection.hasValue()" (click)="onDeleteAssetProfiles()" > - Delete Profiles + Delete + {{ + selection.selected.length > 1 + ? selection.selected.length + : '' + }} + {selection.selected.length, plural, + =1 {Profile} + other {Profiles} + } diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts index 77e2151ef..28c8c2d9f 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts @@ -32,6 +32,8 @@ export class AdminMarketDataService { public deleteAssetProfiles( aAssetProfileIdentifiers: AssetProfileIdentifier[] ) { + const assetProfileCount = aAssetProfileIdentifiers.length; + this.notificationService.confirm({ confirmFn: () => { const deleteRequests = aAssetProfileIdentifiers.map( @@ -44,7 +46,10 @@ export class AdminMarketDataService { .pipe( catchError(() => { this.notificationService.alert({ - title: $localize`Oops! Could not delete profiles.` + title: + assetProfileCount === 1 + ? $localize`Oops! Could not delete the asset profile.` + : $localize`Oops! Could not delete the asset profiles.` }); return EMPTY; @@ -56,7 +61,10 @@ export class AdminMarketDataService { .subscribe(); }, confirmType: ConfirmationDialogType.Warn, - title: $localize`Do you really want to delete these profiles?` + title: + assetProfileCount === 1 + ? $localize`Do you really want to delete this asset profile?` + : $localize`Do you really want to delete these ${assetProfileCount}:count: asset profiles?` }); } } 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..829129b38 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 }), 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..453b8cb6a 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,11 @@ i18n size="medium" [locale]="data.locale" - [value]="assetProfile?.countries[0].name" + [value]=" + getCountryName({ + code: assetProfile?.countries[0].code + }) + " >Country
diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index a9d135068..26e6c2b1e 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -1,7 +1,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; -import { getLocale } from '@ghostfolio/common/helper'; +import { getLocale, getLowercase } from '@ghostfolio/common/helper'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { AdminService, DataService } from '@ghostfolio/ui/services'; @@ -33,7 +33,6 @@ import { ellipsisHorizontal, trashOutline } from 'ionicons/icons'; -import { get } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; import { GfCreateOrUpdatePlatformDialogComponent } from './create-or-update-platform-dialog/create-or-update-platform-dialog.component'; @@ -147,7 +146,7 @@ export class GfAdminPlatformComponent implements OnInit { this.dataSource = new MatTableDataSource(platforms); this.dataSource.sort = this.sort(); - this.dataSource.sortingDataAccessor = get; + this.dataSource.sortingDataAccessor = getLowercase; this.dataService.updateInfo(); diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts index c00fe3a61..fcb901707 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts @@ -1,7 +1,7 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; -import { getLocale } from '@ghostfolio/common/helper'; +import { getLocale, getLowercase } from '@ghostfolio/common/helper'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -32,7 +32,6 @@ import { ellipsisHorizontal, trashOutline } from 'ionicons/icons'; -import { get } from 'lodash'; import { DeviceDetectorService } from 'ngx-device-detector'; import { GfCreateOrUpdateTagDialogComponent } from './create-or-update-tag-dialog/create-or-update-tag-dialog.component'; @@ -149,7 +148,7 @@ export class GfAdminTagComponent implements OnInit { this.dataSource = new MatTableDataSource(this.tags); this.dataSource.sort = this.sort(); - this.dataSource.sortingDataAccessor = get; + this.dataSource.sortingDataAccessor = getLowercase; this.dataService.updateInfo(); 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..15133b781 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 @@ -5,7 +5,7 @@ import { import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { DEFAULT_PAGE_SIZE, locale } from '@ghostfolio/common/config'; +import { DEFAULT_LOCALE, DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getDateFnsLocale, @@ -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; @@ -301,7 +317,7 @@ export class GfAdminUsersComponent implements OnInit { currentUserId: this.user?.id, deviceType: this.deviceType(), hasPermissionForSubscription: this.hasPermissionForSubscription, - locale: this.user?.settings?.locale ?? locale, + locale: this.user?.settings?.locale ?? DEFAULT_LOCALE, userId: aUserId } satisfies UserDetailDialogParams, height: this.deviceType() === 'mobile' ? '98vh' : '60vh', diff --git a/apps/client/src/app/components/admin-users/admin-users.html b/apps/client/src/app/components/admin-users/admin-users.html index 87ab9defc..be9bb377d 100644 --- a/apps/client/src/app/components/admin-users/admin-users.html +++ b/apps/client/src/app/components/admin-users/admin-users.html @@ -16,7 +16,7 @@ class="mat-mdc-cell px-1 py-2" mat-cell > -
+
{{ formatDistanceToNow(element.createdAt) }} @@ -183,7 +183,7 @@ {{ formatDistanceToNow(element.lastActivity) }} diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html index 4d74c2559..328cccba1 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html @@ -53,6 +53,6 @@
diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index d2dc9e1bb..c474e29ab 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -17,7 +17,6 @@ import { ColorScheme } from '@ghostfolio/common/types'; import { registerChartConfiguration } from '@ghostfolio/ui/chart'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -45,7 +44,6 @@ import { type TooltipOptions } from 'chart.js'; import 'chartjs-adapter-date-fns'; -import annotationPlugin from 'chartjs-plugin-annotation'; import { addIcons } from 'ionicons'; import { arrowForwardOutline } from 'ionicons/icons'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @@ -53,7 +51,6 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - CommonModule, FormsModule, GfPremiumIndicatorComponent, IonIcon, @@ -88,7 +85,6 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { public constructor() { Chart.register( - annotationPlugin, LinearScale, LineController, LineElement, diff --git a/apps/client/src/app/components/footer/footer.component.html b/apps/client/src/app/components/footer/footer.component.html index 45626620e..c839db8f1 100644 --- a/apps/client/src/app/components/footer/footer.component.html +++ b/apps/client/src/app/components/footer/footer.component.html @@ -141,13 +141,11 @@
  • Italiano
  • - +
  • + Korean (한국어) +
  • Nederlands
  • 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..b8dede2cd 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 @@ -2,17 +2,21 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE, NUMERICAL_PRECISION_THRESHOLD_3_FIGURES, - NUMERICAL_PRECISION_THRESHOLD_5_FIGURES, - NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + NUMERICAL_PRECISION_THRESHOLD_5_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, EnhancedSymbolProfile, Filter, LineChartItem, + NullableLineChartItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; @@ -36,11 +40,16 @@ import { ChangeDetectorRef, Component, DestroyRef, - Inject, - OnInit + OnInit, + inject } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { + FormBuilder, + FormControl, + FormGroup, + ReactiveFormsModule +} from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MatChipsModule } from '@angular/material/chips'; import { @@ -68,6 +77,7 @@ import { swapVerticalOutline, walletOutline } from 'ionicons/icons'; +import { isNumber } from 'lodash'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { switchMap } from 'rxjs/operators'; @@ -103,73 +113,78 @@ import { HoldingDetailDialogParams } from './interfaces/interfaces'; templateUrl: 'holding-detail-dialog.html' }) export class GfHoldingDetailDialogComponent implements OnInit { - public activitiesCount: number; - public accounts: Account[]; - public assetClass: string; - public assetSubClass: string; - public averagePrice: number; - public averagePricePrecision = 2; - public benchmarkDataItems: LineChartItem[]; - public benchmarkLabel = $localize`Average Unit Price`; - public countries: { + protected accounts: Account[]; + protected activitiesCount: number; + protected assetClass: string; + protected assetSubClass: string; + protected averagePrice: number; + protected averagePricePrecision = 2; + protected benchmarkDataItems: NullableLineChartItem[]; + protected readonly benchmarkLabel = $localize`Average Unit Price`; + protected countries: { [code: string]: { name: string; value: number }; }; - public dataProviderInfo: DataProviderInfo; - public dataSource: MatTableDataSource; - public dateOfFirstActivity: string; - public dividendInBaseCurrency: number; - public dividendInBaseCurrencyPrecision = 2; - public dividendYieldPercentWithCurrencyEffect: number; - public feeInBaseCurrency: number; - public hasPermissionToCreateOwnTag: boolean; - public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; - public historicalDataItems: LineChartItem[]; - public holdingForm: FormGroup; - public investmentInBaseCurrencyWithCurrencyEffect: number; - public investmentInBaseCurrencyWithCurrencyEffectPrecision = 2; - public isUUID = isUUID; - public marketDataItems: MarketData[] = []; - public marketPrice: number; - public marketPriceMax: number; - public marketPriceMaxPrecision = 2; - public marketPriceMin: number; - public marketPriceMinPrecision = 2; - public marketPricePrecision = 2; - public netPerformance: number; - public netPerformancePrecision = 2; - public netPerformancePercent: number; - public netPerformancePercentWithCurrencyEffect: number; - public netPerformancePercentWithCurrencyEffectPrecision = 2; - public netPerformanceWithCurrencyEffect: number; - public netPerformanceWithCurrencyEffectPrecision = 2; - public pageIndex = 0; - public pageSize = DEFAULT_PAGE_SIZE; - public quantity: number; - public quantityPrecision = 2; - public reportDataGlitchMail: string; - public routerLinkAdminControlMarketData = + protected dataProviderInfo: DataProviderInfo; + protected dataSource: MatTableDataSource; + protected dateOfFirstActivity: Date; + protected dividendInBaseCurrency: number; + protected dividendInBaseCurrencyPrecision = 2; + protected dividendYieldPercentWithCurrencyEffect: number; + protected feeInBaseCurrency: number; + protected readonly getCountryName = getCountryName; + protected hasPermissionToCreateOwnTag: boolean; + protected hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; + protected historicalDataItems: LineChartItem[]; + protected holdingForm: FormGroup<{ + tags: FormControl; + }>; + protected investmentInBaseCurrencyWithCurrencyEffect: number; + protected investmentInBaseCurrencyWithCurrencyEffectPrecision = 2; + protected readonly isUUID = isUUID; + protected marketDataItems: MarketData[] = []; + protected marketPrice: number; + protected marketPriceMax: number; + protected marketPriceMaxPrecision = 2; + protected marketPriceMin: number; + protected marketPriceMinPrecision = 2; + protected marketPricePrecision = 2; + protected netPerformancePercentWithCurrencyEffect: number; + protected netPerformancePercentWithCurrencyEffectPrecision = 2; + protected netPerformanceWithCurrencyEffect: number; + protected netPerformanceWithCurrencyEffectPrecision = 2; + protected pageIndex = 0; + protected readonly pageSize = DEFAULT_PAGE_SIZE; + protected quantity: number; + protected quantityPrecision = 2; + protected reportDataGlitchMail: string; + protected readonly routerLinkAdminControlMarketData = internalRoutes.adminControl.subRoutes.marketData.routerLink; - public sectors: { + protected sectors: { [name: string]: { name: string; value: number }; }; - public sortColumn = 'date'; - public sortDirection: SortDirection = 'desc'; - public SymbolProfile: EnhancedSymbolProfile; - public tags: Tag[]; - public tagsAvailable: Tag[]; - public user: User; - public value: number; - - public constructor( - private changeDetectorRef: ChangeDetectorRef, - private dataService: DataService, - private destroyRef: DestroyRef, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: HoldingDetailDialogParams, - private formBuilder: FormBuilder, - private router: Router, - private userService: UserService - ) { + protected sortColumn = 'date'; + protected sortDirection: SortDirection = 'desc'; + protected SymbolProfile: EnhancedSymbolProfile; + protected tagsAvailable: Tag[]; + protected readonly translate = translate; + protected user: User; + protected value: number; + + protected readonly data = inject(MAT_DIALOG_DATA); + protected readonly dialogRef = inject( + MatDialogRef + ); + + private tags: Tag[]; + + private readonly changeDetectorRef = inject(ChangeDetectorRef); + private readonly dataService = inject(DataService); + private readonly destroyRef = inject(DestroyRef); + private readonly formBuilder = inject(FormBuilder); + private readonly router = inject(Router); + private readonly userService = inject(UserService); + + public constructor() { addIcons({ arrowDownCircleOutline, createOutline, @@ -185,12 +200,11 @@ export class GfHoldingDetailDialogComponent implements OnInit { const filters = this.getActivityFilters(); this.holdingForm = this.formBuilder.group({ - tags: [] as string[] + tags: new FormControl([]) }); - this.holdingForm - .get('tags') - .valueChanges.pipe(takeUntilDestroyed(this.destroyRef)) + this.holdingForm.controls.tags.valueChanges + .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe((tags: Tag[]) => { const newTag = tags.find(({ id }) => { return id === undefined; @@ -263,8 +277,6 @@ export class GfHoldingDetailDialogComponent implements OnInit { marketPrice, marketPriceMax, marketPriceMin, - netPerformance, - netPerformancePercent, netPerformancePercentWithCurrencyEffect, netPerformanceWithCurrencyEffect, quantity, @@ -276,7 +288,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { this.averagePrice = averagePrice; if ( - this.averagePrice >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES && + this.averagePrice >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES && this.data.deviceType === 'mobile' ) { this.averagePricePrecision = 0; @@ -285,13 +297,17 @@ export class GfHoldingDetailDialogComponent implements OnInit { this.benchmarkDataItems = []; this.countries = {}; this.dataProviderInfo = dataProviderInfo; - this.dateOfFirstActivity = dateOfFirstActivity; + + if (dateOfFirstActivity) { + this.dateOfFirstActivity = dateOfFirstActivity; + } + this.dividendInBaseCurrency = dividendInBaseCurrency; if ( this.data.deviceType === 'mobile' && this.dividendInBaseCurrency >= - NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.dividendInBaseCurrencyPrecision = 0; } @@ -313,12 +329,12 @@ export class GfHoldingDetailDialogComponent implements OnInit { ({ averagePrice, date, marketPrice }) => { this.benchmarkDataItems.push({ date, - value: averagePrice + value: isNumber(averagePrice) ? averagePrice : null }); return { date, - value: marketPrice + value: marketPrice ?? 0 }; } ); @@ -329,7 +345,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { if ( this.data.deviceType === 'mobile' && this.investmentInBaseCurrencyWithCurrencyEffect >= - NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.investmentInBaseCurrencyWithCurrencyEffectPrecision = 0; } @@ -339,7 +355,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { if ( this.data.deviceType === 'mobile' && - this.marketPriceMax >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + this.marketPriceMax >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.marketPriceMaxPrecision = 0; } @@ -348,29 +364,18 @@ export class GfHoldingDetailDialogComponent implements OnInit { if ( this.data.deviceType === 'mobile' && - this.marketPriceMin >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + this.marketPriceMin >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.marketPriceMinPrecision = 0; } if ( this.data.deviceType === 'mobile' && - this.marketPrice >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + this.marketPrice >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES ) { this.marketPricePrecision = 0; } - this.netPerformance = netPerformance; - - if ( - this.data.deviceType === 'mobile' && - this.netPerformance >= NUMERICAL_PRECISION_THRESHOLD_6_FIGURES - ) { - this.netPerformancePrecision = 0; - } - - this.netPerformancePercent = netPerformancePercent; - this.netPerformancePercentWithCurrencyEffect = netPerformancePercentWithCurrencyEffect; @@ -433,7 +438,7 @@ 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 }), value: country.weight }; } @@ -442,22 +447,22 @@ 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 }; } } - if (isToday(parseISO(this.dateOfFirstActivity))) { + if (isToday(this.dateOfFirstActivity)) { // Add average price this.historicalDataItems.push({ - date: this.dateOfFirstActivity, + date: this.dateOfFirstActivity.toISOString(), value: this.averagePrice }); // Add benchmark 1 this.benchmarkDataItems.push({ - date: this.dateOfFirstActivity, + date: this.dateOfFirstActivity.toISOString(), value: averagePrice }); @@ -488,7 +493,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { if ( this.benchmarkDataItems[0]?.value === undefined && - isSameMonth(parseISO(this.dateOfFirstActivity), new Date()) + isSameMonth(this.dateOfFirstActivity, new Date()) ) { this.benchmarkDataItems[0].value = this.averagePrice; } @@ -518,7 +523,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { this.hasPermissionToCreateOwnTag = hasPermission(this.user.permissions, permissions.createOwnTag) && - this.user?.settings?.isExperimentalFeatures; + (this.user?.settings?.isExperimentalFeatures ?? false); this.tagsAvailable = this.user?.tags?.map((tag) => { @@ -533,13 +538,13 @@ export class GfHoldingDetailDialogComponent implements OnInit { }); } - public onChangePage(page: PageEvent) { + protected onChangePage(page: PageEvent) { this.pageIndex = page.pageIndex; this.fetchActivities(); } - public onCloneActivity(aActivity: Activity) { + protected onCloneActivity(aActivity: Activity) { this.router.navigate( internalRoutes.portfolio.subRoutes.activities.routerLink, { @@ -550,22 +555,22 @@ export class GfHoldingDetailDialogComponent implements OnInit { this.dialogRef.close(); } - public onClose() { + protected onClose() { this.dialogRef.close(); } - public onCloseHolding() { + protected onCloseHolding() { const today = new Date(); const activity: CreateOrderDto = { - accountId: this.accounts.length === 1 ? this.accounts[0].id : null, - comment: null, - currency: this.SymbolProfile.currency, - dataSource: this.SymbolProfile.dataSource, + accountId: this.accounts.length === 1 ? this.accounts[0].id : undefined, + comment: undefined, + currency: this.SymbolProfile?.currency ?? '', + dataSource: this.SymbolProfile?.dataSource, date: today.toISOString(), fee: 0, quantity: this.quantity, - symbol: this.SymbolProfile.symbol, + symbol: this.SymbolProfile?.symbol ?? '', tags: this.tags.map(({ id }) => { return id; }), @@ -585,7 +590,7 @@ export class GfHoldingDetailDialogComponent implements OnInit { }); } - public onExport() { + protected onExport() { const activityIds = this.dataSource.data.map(({ id }) => { return id; }); @@ -605,13 +610,13 @@ export class GfHoldingDetailDialogComponent implements OnInit { }); } - public onMarketDataChanged(withRefresh = false) { + protected onMarketDataChanged(withRefresh = false) { if (withRefresh) { this.fetchMarketData(); } } - public onUpdateActivity(aActivity: Activity) { + protected onUpdateActivity(aActivity: Activity) { this.router.navigate( internalRoutes.portfolio.subRoutes.activities.routerLink, { 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..0d5691874 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,11 @@ i18n size="medium" [locale]="data.locale" - [value]="SymbolProfile.countries[0].name" + [value]=" + getCountryName({ + code: SymbolProfile.countries[0].code + }) + " >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 22d829daa..0107f36a2 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 @@ -1,6 +1,6 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; -import { locale as defaultLocale } from '@ghostfolio/common/config'; +import { DEFAULT_LOCALE } from '@ghostfolio/common/config'; import { AssetProfileIdentifier, Benchmark, @@ -149,7 +149,7 @@ export class GfHomeWatchlistComponent implements OnInit { autoFocus: false, data: { deviceType: this.deviceType(), - locale: this.user?.settings?.locale ?? defaultLocale + locale: this.user?.settings?.locale ?? DEFAULT_LOCALE }, width: this.deviceType() === 'mobile' ? '100vw' : '50rem' }); diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.html b/apps/client/src/app/components/investment-chart/investment-chart.component.html index 6f7b083e5..864050ea8 100644 --- a/apps/client/src/app/components/investment-chart/investment-chart.component.html +++ b/apps/client/src/app/components/investment-chart/investment-chart.component.html @@ -10,5 +10,5 @@ diff --git a/apps/client/src/app/components/investment-chart/investment-chart.component.ts b/apps/client/src/app/components/investment-chart/investment-chart.component.ts index 691133009..dc3152f12 100644 --- a/apps/client/src/app/components/investment-chart/investment-chart.component.ts +++ b/apps/client/src/app/components/investment-chart/investment-chart.component.ts @@ -16,7 +16,6 @@ import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.in import { ColorScheme, GroupBy } from '@ghostfolio/common/types'; import { registerChartConfiguration } from '@ghostfolio/ui/chart'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -41,15 +40,13 @@ import { type TooltipOptions } from 'chart.js'; import 'chartjs-adapter-date-fns'; -import annotationPlugin, { - type AnnotationOptions -} from 'chartjs-plugin-annotation'; +import { type AnnotationOptions } from 'chartjs-plugin-annotation'; import { isAfter } from 'date-fns'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, NgxSkeletonLoaderModule], + imports: [NgxSkeletonLoaderModule], selector: 'gf-investment-chart', styleUrls: ['./investment-chart.component.scss'], templateUrl: './investment-chart.component.html' @@ -75,7 +72,6 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { public constructor() { Chart.register( - annotationPlugin, BarController, BarElement, LinearScale, diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts index 5c2f3be79..74cc80f26 100644 --- a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts +++ b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.component.ts @@ -1,8 +1,7 @@ -import { XRayRulesSettings } from '@ghostfolio/common/interfaces'; import { GfValueComponent } from '@ghostfolio/ui/value'; -import { Component, Inject } from '@angular/core'; -import { FormsModule } from '@angular/forms'; +import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; +import { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; import { MAT_DIALOG_DATA, @@ -14,22 +13,37 @@ import { MatSliderModule } from '@angular/material/slider'; import { RuleSettingsDialogParams } from './interfaces/interfaces'; @Component({ + changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - FormsModule, GfValueComponent, MatButtonModule, MatDialogModule, - MatSliderModule + MatSliderModule, + ReactiveFormsModule ], selector: 'gf-rule-settings-dialog', styleUrls: ['./rule-settings-dialog.scss'], templateUrl: './rule-settings-dialog.html' }) export class GfRuleSettingsDialogComponent { - public settings: XRayRulesSettings['AccountClusterRiskCurrentInvestment']; + public settingsForm: FormGroup; public constructor( @Inject(MAT_DIALOG_DATA) public data: RuleSettingsDialogParams, - public dialogRef: MatDialogRef - ) {} + public dialogRef: MatDialogRef, + private formBuilder: FormBuilder + ) { + this.settingsForm = this.formBuilder.group({ + thresholdMax: [this.data.settings.thresholdMax], + thresholdMin: [this.data.settings.thresholdMin] + }); + } + + public onSubmit() { + this.dialogRef.close({ + ...this.data.settings, + thresholdMax: this.settingsForm.get('thresholdMax')?.value, + thresholdMin: this.settingsForm.get('thresholdMin')?.value + }); + } } diff --git a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html index c88a9dc9d..d81a3c1f3 100644 --- a/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html +++ b/apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -1,132 +1,142 @@
    {{ data.categoryName }} › {{ data.rule.name }}
    -
    - @if ( - data.rule.configuration.thresholdMin && data.rule.configuration.thresholdMax - ) { -
    -
    - Threshold range: - - - - -
    -
    - - - - - - + +
    + @if ( + data.rule.configuration.thresholdMin && + data.rule.configuration.thresholdMax + ) { +
    +
    + Threshold range: + + - + +
    +
    + + + + + + +
    -
    - } @else { -
    -
    - Threshold Min: - -
    -
    - - - - - + } @else { +
    +
    + Threshold Min: + +
    +
    + + + + + +
    -
    -
    -
    - Threshold Max: - -
    -
    - - - - - +
    +
    + Threshold Max: + +
    +
    + + + + + +
    -
    - } -
    + } +
    -
    - - -
    +
    + + +
    + diff --git a/apps/client/src/app/components/rules/rules.component.html b/apps/client/src/app/components/rules/rules.component.html index 0c3153c52..97b41e61b 100644 --- a/apps/client/src/app/components/rules/rules.component.html +++ b/apps/client/src/app/components/rules/rules.component.html @@ -3,9 +3,7 @@
    @if (isLoading) { - } - - @if (rules !== null && rules !== undefined) { + } @else if (rules) { @for (rule of rules; track rule.key) { (); + public subscriptionsDisplayedColumns = [ + 'createdAt', + 'type', + 'price', + 'expiresAt' + ]; public user: AdminUserResponse; public constructor( private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, + private dataService: DataService, private destroyRef: DestroyRef, public dialogRef: MatDialogRef< GfUserDetailDialogComponent, UserDetailDialogResult > ) { + this.baseCurrency = this.dataService.fetchInfo().baseCurrency; + addIcons({ ellipsisVertical }); @@ -74,6 +91,8 @@ export class GfUserDetailDialogComponent implements OnInit { .subscribe((user) => { this.user = user; + this.subscriptionsDataSource.data = this.user.subscriptions ?? []; + this.changeDetectorRef.markForCheck(); }); } @@ -85,6 +104,24 @@ export class GfUserDetailDialogComponent implements OnInit { }); } + public getSum() { + return getSum( + this.subscriptionsDataSource.data.map(({ price }) => { + return new Big(price); + }) + ).toNumber(); + } + + public getType({ createdAt, expiresAt, price }: Subscription) { + if (price) { + return $localize`Paid`; + } + + return differenceInDays(expiresAt, createdAt) <= 90 + ? $localize`Trial` + : $localize`Coupon`; + } + public onClose() { this.dialogRef.close(); } 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..df935c780 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 @@ -
    +
    + + @if (subscriptionsDataSource.data.length > 0) { +
    +
    +

    Subscriptions

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Created + + + + Total + + Type + + {{ getType(element) }} + + Price + + + + + + Expires + + +
    +
    +
    +
    + } }
    diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index c28a63be2..ede2be190 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -94,7 +94,7 @@ or start a discussion at   GitHub { + this.user = state?.user; + + this.initializeTabs(); + }); + addIcons({ flashOutline, peopleOutline, @@ -34,7 +56,12 @@ export class AdminPageComponent implements OnInit { }); } - public ngOnInit() { + private initializeTabs() { + const hasPermissionToAccessBullBoard = hasPermission( + this.user?.permissions, + permissions.accessAdminControlBullBoard + ); + this.tabs = [ { iconName: 'reader-outline', @@ -51,11 +78,19 @@ export class AdminPageComponent implements OnInit { label: internalRoutes.adminControl.subRoutes.marketData.title, routerLink: internalRoutes.adminControl.subRoutes.marketData.routerLink }, - { - iconName: 'flash-outline', - label: internalRoutes.adminControl.subRoutes.jobs.title, - routerLink: internalRoutes.adminControl.subRoutes.jobs.routerLink - }, + hasPermissionToAccessBullBoard + ? { + iconName: 'flash-outline', + label: $localize`Job Queue`, + onClick: () => { + this.onOpenBullBoard(); + } + } + : { + iconName: 'flash-outline', + label: internalRoutes.adminControl.subRoutes.jobs.title, + routerLink: internalRoutes.adminControl.subRoutes.jobs.routerLink + }, { iconName: 'people-outline', label: internalRoutes.adminControl.subRoutes.users.title, @@ -63,4 +98,16 @@ export class AdminPageComponent implements OnInit { } ]; } + + private onOpenBullBoard() { + const token = this.tokenStorageService.getToken(); + + document.cookie = [ + `${BULL_BOARD_COOKIE_NAME}=${encodeURIComponent(token)}`, + 'path=/', + 'SameSite=Strict' + ].join('; '); + + window.open(BULL_BOARD_ROUTE, '_blank'); + } } diff --git a/apps/client/src/app/pages/faq/overview/faq-overview-page.html b/apps/client/src/app/pages/faq/overview/faq-overview-page.html index 3b43ac096..ee4e0ad1a 100644 --- a/apps/client/src/app/pages/faq/overview/faq-overview-page.html +++ b/apps/client/src/app/pages/faq/overview/faq-overview-page.html @@ -193,7 +193,7 @@ } or start a discussion at GitHub.GitHub. or start a discussion at GitHub. -
    +

    Activities

    Holding {{ - assetProfileForm.get('assetProfileIdentifier')?.value?.name + assetProfileForm.get('assetProfileIdentifier')?.value + ?.assetProfile?.name }} @for (holding of holdings; track holding) { 0) { - for (const country of position.assetProfile.countries) { - const { code, continent, name, weight } = country; - - if (this.continents[continent]?.value) { - this.continents[continent].value += + // Prepare analysis data by continents, countries, holdings and sectors + + 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 += + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + } else { + this.continents[continent] = { + name: translate(continent), + value: weight * (isNumber(position.valueInBaseCurrency) - ? position.valueInBaseCurrency - : position.valueInPercentage); - } else { - this.continents[continent] = { - name: continent, - value: - weight * - (isNumber(position.valueInBaseCurrency) - ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency - : this.portfolioDetails.holdings[symbol].valueInPercentage) - }; - } - - if (this.countries[code]?.value) { - this.countries[code].value += + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) + }; + } + + if (this.countries[code]?.value) { + this.countries[code].value += + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + } else { + this.countries[code] = { + name: getCountryName({ code }), + value: weight * (isNumber(position.valueInBaseCurrency) - ? position.valueInBaseCurrency - : position.valueInPercentage); - } else { - this.countries[code] = { - name, - value: - weight * - (isNumber(position.valueInBaseCurrency) - ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency - : this.portfolioDetails.holdings[symbol].valueInPercentage) - }; - } + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) + }; } - } else { - this.continents[UNKNOWN_KEY].value += isNumber( - position.valueInBaseCurrency - ) - ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency - : this.portfolioDetails.holdings[symbol].valueInPercentage; - - this.countries[UNKNOWN_KEY].value += isNumber( - position.valueInBaseCurrency - ) - ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency - : this.portfolioDetails.holdings[symbol].valueInPercentage; } + } else { + this.continents[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; + + this.countries[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; + } - if (position.assetProfile.holdings.length > 0) { - for (const { - allocationInPercentage, - name, - valueInBaseCurrency - } of position.assetProfile.holdings) { - const normalizedAssetName = this.normalizeAssetName(name); - - if (this.topHoldingsMap[normalizedAssetName]?.value) { - this.topHoldingsMap[normalizedAssetName].value += isNumber( - valueInBaseCurrency - ) + if (position.assetProfile.holdings.length > 0) { + for (const { + allocationInPercentage, + name, + valueInBaseCurrency + } of position.assetProfile.holdings) { + const normalizedAssetName = this.normalizeAssetName(name); + + if (this.topHoldingsMap[normalizedAssetName]?.value) { + this.topHoldingsMap[normalizedAssetName].value += isNumber( + valueInBaseCurrency + ) + ? valueInBaseCurrency + : allocationInPercentage * + this.portfolioDetails.holdings[symbol].valueInPercentage; + } else { + this.topHoldingsMap[normalizedAssetName] = { + name, + value: isNumber(valueInBaseCurrency) ? valueInBaseCurrency : allocationInPercentage * - this.portfolioDetails.holdings[symbol].valueInPercentage; - } else { - this.topHoldingsMap[normalizedAssetName] = { - name, - value: isNumber(valueInBaseCurrency) - ? valueInBaseCurrency - : allocationInPercentage * - this.portfolioDetails.holdings[symbol].valueInPercentage - }; - } + this.portfolioDetails.holdings[symbol].valueInPercentage + }; } } + } - if (position.assetProfile.sectors.length > 0) { - for (const sector of position.assetProfile.sectors) { - const { name, weight } = sector; - - if (this.sectors[name]?.value) { - this.sectors[name].value += + if (position.assetProfile.sectors.length > 0) { + for (const sector of position.assetProfile.sectors) { + const { name, weight } = sector; + + if (this.sectors[name]?.value) { + this.sectors[name].value += + weight * + (isNumber(position.valueInBaseCurrency) + ? position.valueInBaseCurrency + : position.valueInPercentage); + } else { + this.sectors[name] = { + name: translate(name), + value: weight * (isNumber(position.valueInBaseCurrency) - ? position.valueInBaseCurrency - : position.valueInPercentage); - } else { - this.sectors[name] = { - name, - value: - weight * - (isNumber(position.valueInBaseCurrency) - ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency - : this.portfolioDetails.holdings[symbol].valueInPercentage) - }; - } + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage) + }; } - } else { - this.sectors[UNKNOWN_KEY].value += isNumber( - position.valueInBaseCurrency - ) - ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency - : this.portfolioDetails.holdings[symbol].valueInPercentage; } + } else { + this.sectors[UNKNOWN_KEY].value += isNumber( + position.valueInBaseCurrency + ) + ? this.portfolioDetails.holdings[symbol].valueInBaseCurrency + : this.portfolioDetails.holdings[symbol].valueInPercentage; } if (this.holdings[symbol].assetSubClass === 'ETF') { diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts index dc0a1d776..04165ab11 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.component.ts @@ -12,7 +12,7 @@ import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; -import { CommonModule, NgStyle } from '@angular/common'; +import { CommonModule } from '@angular/common'; import { ChangeDetectorRef, Component, @@ -35,7 +35,6 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; GfFireCalculatorComponent, GfPremiumIndicatorComponent, GfValueComponent, - NgStyle, NgxSkeletonLoaderModule, ReactiveFormsModule ], diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.html b/apps/client/src/app/pages/portfolio/fire/fire-page.html index 76ad6cbf6..2730b35cd 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.html +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.html @@ -19,14 +19,15 @@ !hasImpersonationId && hasPermissionToUpdateUserSettings " [locale]="user?.settings?.locale" - [ngStyle]="{ - opacity: user?.subscription?.type === 'Basic' ? '0.67' : 'initial', - 'pointer-events': - user?.subscription?.type === 'Basic' ? 'none' : 'initial' - }" [projectedTotalAmount]="user?.settings?.projectedTotalAmount" [retirementDate]="user?.settings?.retirementDate" [savingsRate]="user?.settings?.savingsRate" + [style.opacity]=" + user?.subscription?.type === 'Basic' ? '0.67' : 'initial' + " + [style.pointer-events]=" + user?.subscription?.type === 'Basic' ? 'none' : 'initial' + " (annualInterestRateChanged)="onAnnualInterestRateChange($event)" (calculationCompleted)="onCalculationComplete($event)" (projectedTotalAmountChanged)="onProjectedTotalAmountChange($event)" diff --git a/apps/client/src/app/pages/portfolio/fire/fire-page.scss b/apps/client/src/app/pages/portfolio/fire/fire-page.scss index 3a0618ed6..6a5f037e2 100644 --- a/apps/client/src/app/pages/portfolio/fire/fire-page.scss +++ b/apps/client/src/app/pages/portfolio/fire/fire-page.scss @@ -29,5 +29,9 @@ @include select-arrow(variables.$light-primary-text); color: rgb(var(--light-primary-text)); + + option { + color: rgb(var(--dark-primary-text)); + } } } diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index a1fe0c0b5..c0e3848bb 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -68,20 +68,6 @@ export class GfPricingPageComponent implements OnInit { 'PROFESSIONAL_DATA_PROVIDER_TOOLTIP_PREMIUM' ); - protected readonly referralBrokers = [ - 'Alpian', - 'DEGIRO', - 'finpension', - 'frankly', - 'Interactive Brokers', - 'Mintos', - 'Monefit SmartSaver', - 'Revolut', - 'Swissquote', - 'VIAC', - 'Zak' - ] as const; - protected readonly routerLinkFeatures = publicRoutes.features.routerLink; protected readonly routerLinkRegister = publicRoutes.register.routerLink; protected user: User; diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index b951baa98..23693457c 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -305,23 +305,23 @@
    - @if (user?.subscription?.type === 'Basic') { + @if (user?.referralPartners?.length) {

    If you plan to open an account at   @for ( - broker of referralBrokers; - track broker; + partner of user.referralPartners; + track partner.name; let i = $index; let last = $last ) { - {{ broker }} + {{ partner.name }} @if (last) { , } @else { - @if (i === referralBrokers.length - 2) { + @if (i === user.referralPartners.length - 2) {   or   diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index f52639db6..43d961c1d 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -1,5 +1,5 @@ import { UNKNOWN_KEY } from '@ghostfolio/common/config'; -import { prettifySymbol } from '@ghostfolio/common/helper'; +import { getCountryName, prettifySymbol } from '@ghostfolio/common/helper'; import { InfoItem, PortfolioPosition, @@ -9,6 +9,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { Market } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table/activities-table.component'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table/holdings-table.component'; +import { translate } from '@ghostfolio/ui/i18n'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.component'; import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -185,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] @@ -205,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] @@ -232,7 +233,7 @@ export class GfPublicPageComponent implements OnInit { weight * (position.valueInBaseCurrency ?? 0); } else { this.sectors[name] = { - name, + name: translate(name), value: weight * (this.publicPortfolioDetails.holdings[symbol] diff --git a/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..1af3c6d54 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'; @@ -55,18 +56,20 @@ export class GfProductPageComponent implements OnInit { 'Türkçe' ], name: 'Ghostfolio', - origin: $localize`Switzerland`, + origin: getCountryName({ 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({ code: this.product2.origin }); } if (this.product2.regions) { diff --git a/apps/client/src/app/services/import-activities.service.ts b/apps/client/src/app/services/import-activities.service.ts index 55b5c44d5..f5cc74106 100644 --- a/apps/client/src/app/services/import-activities.service.ts +++ b/apps/client/src/app/services/import-activities.service.ts @@ -8,12 +8,11 @@ import { parseDate as parseDateHelper } from '@ghostfolio/common/helper'; import { Activity } from '@ghostfolio/common/interfaces'; import { HttpClient } from '@angular/common/http'; -import { Injectable } from '@angular/core'; +import { inject, Injectable } from '@angular/core'; import { Account, DataSource, Type as ActivityType } from '@prisma/client'; -import { isFinite } from 'lodash'; +import { isFinite, isNumber, isString } from 'lodash'; import { parse as csvToJson } from 'papaparse'; -import { EMPTY } from 'rxjs'; -import { catchError } from 'rxjs/operators'; +import { firstValueFrom } from 'rxjs'; @Injectable({ providedIn: 'root' @@ -35,7 +34,7 @@ export class ImportActivitiesService { 'value' ]; - public constructor(private http: HttpClient) {} + private readonly http = inject(HttpClient); public async importCsv({ fileContent, @@ -49,7 +48,7 @@ export class ImportActivitiesService { activities: Activity[]; assetProfiles: CreateAssetProfileWithMarketDataDto[]; }> { - const content = csvToJson(fileContent, { + const content = csvToJson>(fileContent, { dynamicTyping: true, header: true, skipEmptyLines: true @@ -83,22 +82,22 @@ export class ImportActivitiesService { assetProfiles.push({ currency, symbol, - assetClass: null, - assetSubClass: null, - comment: null, + assetClass: undefined, + assetSubClass: undefined, + comment: undefined, countries: [], - cusip: null, + cusip: undefined, dataSource: DataSource.MANUAL, - figi: null, - figiComposite: null, - figiShareClass: null, + figi: undefined, + figiComposite: undefined, + figiShareClass: undefined, holdings: [], isActive: true, - isin: null, + isin: undefined, marketData: [], name: symbol, sectors: [], - url: null + url: undefined }); } } @@ -126,7 +125,7 @@ export class ImportActivitiesService { }): Promise<{ activities: Activity[]; }> { - return new Promise((resolve, reject) => { + return firstValueFrom( this.postImport( { accounts, @@ -136,18 +135,7 @@ export class ImportActivitiesService { }, isDryRun ) - .pipe( - catchError((error) => { - reject(error); - return EMPTY; - }) - ) - .subscribe({ - next: (data) => { - resolve(data); - } - }); - }); + ); } public importSelectedActivities({ @@ -163,11 +151,9 @@ export class ImportActivitiesService { }): Promise<{ activities: Activity[]; }> { - const importData: CreateOrderDto[] = []; - - for (const activity of activities) { - importData.push(this.convertToCreateOrderDto(activity)); - } + const importData = activities.map((activity) => + this.convertToCreateOrderDto(activity) + ); return this.importJson({ accounts, @@ -191,14 +177,14 @@ export class ImportActivitiesService { updateAccountBalance }: Activity): CreateOrderDto { return { - accountId, - comment, fee, quantity, type, unitPrice, updateAccountBalance, - currency: currency ?? SymbolProfile.currency, + accountId: accountId ?? undefined, + comment: comment ?? undefined, + currency: currency ?? SymbolProfile.currency ?? '', dataSource: SymbolProfile.dataSource, date: date.toString(), symbol: SymbolProfile.symbol, @@ -208,28 +194,32 @@ export class ImportActivitiesService { }; } - private lowercaseKeys(aObject: any) { - return Object.keys(aObject).reduce((acc, key) => { - acc[key.toLowerCase()] = aObject[key]; - return acc; - }, {}); + private lowercaseKeys( + aObject: Record + ): Record { + return Object.fromEntries( + Object.entries(aObject).map(([key, val]) => { + return [key.toLowerCase(), val]; + }) + ); } private parseAccount({ item, userAccounts }: { - item: any; + item: Record; userAccounts: Account[]; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.ACCOUNT_KEYS) { - if (item[key]) { - return userAccounts.find((account) => { + const value = item[key]; + + if (isNumber(value) || isString(value)) { + return userAccounts.find(({ id, name }) => { return ( - account.id === item[key] || - account.name.toLowerCase() === item[key].toLowerCase() + id === value || name?.toLowerCase() === String(value).toLowerCase() ); })?.id; } @@ -238,12 +228,14 @@ export class ImportActivitiesService { return undefined; } - private parseComment({ item }: { item: any }) { + private parseComment({ item }: { item: Record }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.COMMENT_KEYS) { - if (item[key]) { - return item[key]; + const value = item[key]; + + if (isNumber(value) || isString(value)) { + return String(value); } } @@ -255,15 +247,17 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.CURRENCY_KEYS) { - if (item[key]) { - return item[key]; + const value = item[key]; + + if (isString(value)) { + return value; } } @@ -273,12 +267,14 @@ export class ImportActivitiesService { }; } - private parseDataSource({ item }: { item: any }) { + private parseDataSource({ item }: { item: Record }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.DATA_SOURCE_KEYS) { - if (item[key]) { - return DataSource[item[key].toUpperCase()]; + const value = item[key]; + + if (isString(value)) { + return DataSource[value.toUpperCase() as keyof typeof DataSource]; } } @@ -290,16 +286,22 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.DATE_KEYS) { - if (item[key]) { + const value = item[key]; + + if (isNumber(value) || isString(value)) { try { - return parseDateHelper(item[key].toString()).toISOString(); + const parsedDate = parseDateHelper(String(value)); + + if (parsedDate) { + return parsedDate.toISOString(); + } } catch {} } } @@ -315,15 +317,17 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.FEE_KEYS) { - if (isFinite(item[key])) { - return Math.abs(item[key]); + const value = item[key]; + + if (isNumber(value) && isFinite(value)) { + return Math.abs(value); } } @@ -338,15 +342,17 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.QUANTITY_KEYS) { - if (isFinite(item[key])) { - return Math.abs(item[key]); + const value = item[key]; + + if (isNumber(value) && isFinite(value)) { + return Math.abs(value); } } @@ -361,15 +367,17 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.SYMBOL_KEYS) { - if (item[key]) { - return item[key]; + const value = item[key]; + + if (isNumber(value) || isString(value)) { + return String(value); } } @@ -384,15 +392,17 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }): ActivityType { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.TYPE_KEYS) { - if (item[key]) { - switch (item[key].toLowerCase()) { + const value = item[key]; + + if (isString(value)) { + switch (value.toLowerCase()) { case 'buy': return 'BUY'; case 'dividend': @@ -422,15 +432,17 @@ export class ImportActivitiesService { index, item }: { - content: any[]; + content: Record[]; index: number; - item: any; + item: Record; }) { item = this.lowercaseKeys(item); for (const key of ImportActivitiesService.UNIT_PRICE_KEYS) { - if (isFinite(item[key])) { - return Math.abs(item[key]); + const value = item[key]; + + if (isNumber(value) && isFinite(value)) { + return Math.abs(value); } } diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 10fa62f11..be57f85c6 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 @@ -102,7 +102,7 @@ El risc d’assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -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 + 314 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 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -519,7 +519,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -543,7 +543,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -555,15 +555,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -583,7 +583,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -607,7 +607,7 @@ Suprimir apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -631,7 +631,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -643,7 +643,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -654,17 +654,29 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Type Tipus apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -675,7 +687,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -683,7 +695,7 @@ Perfil d’Actiu apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -691,11 +703,11 @@ Dades Històriques de Mercat apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -703,7 +715,7 @@ Origen de les Dades apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -719,7 +731,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -727,7 +739,7 @@ Prioritat apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -735,7 +747,7 @@ Intents apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -743,7 +755,11 @@ Creat apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -751,7 +767,7 @@ Finalitzat apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -759,7 +775,7 @@ Estat apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -779,7 +795,7 @@ Aturar Processos apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -787,7 +803,7 @@ Veure les Dades apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -795,7 +811,7 @@ Veure Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -803,7 +819,7 @@ Executar Procés apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -811,7 +827,7 @@ Suprimir Procés apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -827,7 +843,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -843,7 +859,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -871,7 +887,7 @@ Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -879,7 +895,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 +907,7 @@ ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -899,7 +915,7 @@ ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -907,7 +923,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -927,7 +943,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -978,36 +994,16 @@ 66 - - Delete Profiles - Eliminar Perfils - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - Do you really want to delete this asset profile? Realment vol eliminar el perfil d’aquest actiu? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 - - - - Do you really want to delete these profiles? - Realment vol eliminar aquests perfils? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 28 - - - Oops! Could not delete profiles. - Oooh! No s’han pogut eliminar els perfils apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 66 @@ -1018,12 +1014,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 @@ -1039,11 +1043,11 @@ Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -1067,7 +1071,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -1075,7 +1079,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1087,15 +1091,15 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -1107,15 +1111,15 @@ Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1123,7 +1127,15 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -1134,12 +1146,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -1147,7 +1167,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -1155,11 +1175,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1175,7 +1195,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 +1203,7 @@ Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1210,6 +1230,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Afegir manualment @@ -1238,6 +1266,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 +1351,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1327,7 +1363,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -1363,7 +1399,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1395,7 +1431,7 @@ Està segur que vol eliminar aquesta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -1411,7 +1447,7 @@ By apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1427,7 +1463,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1475,7 +1511,7 @@ Està segur que vol eliminar aquesta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -1499,7 +1535,7 @@ Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1515,7 +1551,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1567,11 +1603,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,19 +1631,19 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1619,11 +1655,11 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1639,7 +1675,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 +1703,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 +1719,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 +1731,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 @@ -1735,11 +1771,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1762,14 +1798,6 @@ 92 - - Indonesia - Indonèsia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Activitat @@ -1783,7 +1811,7 @@ Informar d’un Problema amb les Dades apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1831,7 +1859,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 +1867,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1847,7 +1875,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 +1883,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1955,7 +1983,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1975,7 +2003,7 @@ Import total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -1991,7 +2019,7 @@ Taxa d’estalvi apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -2043,15 +2071,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -2074,6 +2102,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Manteniu la sessió iniciada @@ -2095,7 +2131,7 @@ Les dades del mercat s’han retardat apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -2363,7 +2399,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -2371,11 +2407,11 @@ 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 - 385 + 384 @@ -2383,11 +2419,11 @@ 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 - 395 + 394 @@ -2395,11 +2431,11 @@ 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 - 419 + 416 @@ -2415,11 +2451,11 @@ 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 - 425 + 422 @@ -2427,15 +2463,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 +2530,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 @@ -2527,11 +2563,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -2579,7 +2615,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -2595,7 +2631,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -2606,6 +2642,14 @@ 328 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista del presentador @@ -2630,6 +2674,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language Llengua @@ -2651,7 +2703,7 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2715,7 +2767,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -2779,7 +2831,7 @@ Aquesta funció no està disponible actualment. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2787,15 +2839,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 +2855,7 @@ Aquesta acció no està permesa. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -2811,11 +2863,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 +2879,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 +2891,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 +2903,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 +3011,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2991,7 +3043,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 +3099,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 @@ -3061,6 +3113,10 @@ Job Queue Cua de treball + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -3071,7 +3127,7 @@ Dades de mercat apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3109,10 +3165,6 @@ Overview Visió general - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -3123,7 +3175,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3131,7 +3183,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -3263,11 +3315,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 +3520,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 +3592,7 @@ Mercats apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -3548,7 +3600,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3719,6 +3771,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. @@ -3839,6 +3899,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Que nostre usuaris estan dient @@ -3988,7 +4056,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -4012,7 +4080,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4072,7 +4140,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -4168,7 +4236,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -4176,7 +4252,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 +4268,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 +4284,7 @@ S’estan important dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -4216,7 +4292,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 +4308,7 @@ S’estan validant les dades... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4268,7 +4344,7 @@ Càrrega de dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -4276,7 +4352,7 @@ Trieu o deixeu anar un fitxer aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -4284,7 +4360,7 @@ S’admeten els formats de fitxer següents: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -4292,7 +4368,7 @@ Seleccioneu Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4300,7 +4376,7 @@ Seleccioneu Activitats apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4308,11 +4384,19 @@ Enrere apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -4407,6 +4491,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis Excluir de l’anàlisi @@ -4416,7 +4508,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4548,11 +4640,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4568,15 +4660,15 @@ 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 - 89 + 92 @@ -4592,7 +4684,7 @@ Mensualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4600,7 +4692,15 @@ Anualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -4608,7 +4708,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -4656,7 +4756,7 @@ A baix apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4664,7 +4764,7 @@ Evolució de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4672,7 +4772,7 @@ Cronologia de la inversió apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4680,7 +4780,7 @@ Ratxa actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4688,7 +4788,7 @@ Ratxa més llarga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4696,7 +4796,7 @@ Cronologia de dividends apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4724,15 +4824,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 +5004,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 @@ -4948,7 +5048,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -5048,28 +5148,16 @@ 42 - - Switzerland - Suïssa - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5109,11 +5197,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5313,11 +5401,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 +5453,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 @@ -5401,7 +5489,7 @@ Realment voleu eliminar el saldo d’aquest compte? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5441,7 +5529,7 @@ Esborrany libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -5481,7 +5569,7 @@ Setmana fins avui libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5489,11 +5577,11 @@ 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 - 377 + 376 @@ -5501,7 +5589,7 @@ Mes fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5509,11 +5597,11 @@ 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 - 381 + 380 @@ -5521,7 +5609,7 @@ Any fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -5529,7 +5617,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 @@ -5541,7 +5629,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -5549,11 +5637,11 @@ 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 - 419 + 416 @@ -5597,7 +5685,7 @@ Tendència de 50 dies libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5605,7 +5693,7 @@ Tendència de 200 dies libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5613,7 +5701,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5621,7 +5709,7 @@ Darrer tot el temps libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5629,7 +5717,7 @@ Canvi des del màxim històric libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5645,7 +5733,15 @@ de l’ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -5653,7 +5749,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5701,7 +5797,7 @@ annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -5729,7 +5825,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5749,7 +5845,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 +5861,7 @@ Mostra-ho tot libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5777,11 +5873,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5793,7 +5889,7 @@ Àsia-Pacífic libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5809,7 +5905,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5821,11 +5917,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 +5937,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5853,7 +5949,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5861,7 +5957,7 @@ Comprar i vendre libs/ui/src/lib/i18n.ts - 8 + 10 @@ -5869,7 +5965,7 @@ Bàsic libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5877,7 +5973,7 @@ Canvia fàcilment a Ghostfolio Premium o Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5885,7 +5981,7 @@ Canvia fàcilment a Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5901,7 +5997,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5909,7 +6005,7 @@ Subvenció libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5917,7 +6013,7 @@ Risc Alt libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5925,15 +6021,7 @@ Aquesta activitat ja existeix. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - Japó - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5941,7 +6029,7 @@ Risc Baix libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5949,7 +6037,7 @@ Mes libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5957,7 +6045,7 @@ Mesos libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5965,11 +6053,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 + 448 @@ -5977,7 +6069,7 @@ Predefinit libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5985,7 +6077,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5993,7 +6085,7 @@ Provisió de jubilació libs/ui/src/lib/i18n.ts - 27 + 29 @@ -6009,7 +6101,7 @@ Satèl·lit libs/ui/src/lib/i18n.ts - 28 + 30 @@ -6017,7 +6109,7 @@ Símbol apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -6033,11 +6125,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -6045,11 +6137,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 +6149,7 @@ Any libs/ui/src/lib/i18n.ts - 31 + 33 @@ -6077,7 +6169,7 @@ Anys libs/ui/src/lib/i18n.ts - 32 + 34 @@ -6097,7 +6189,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -6109,11 +6201,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -6121,7 +6213,7 @@ Valuós libs/ui/src/lib/i18n.ts - 42 + 44 @@ -6129,7 +6221,7 @@ Passiu libs/ui/src/lib/i18n.ts - 40 + 42 @@ -6141,7 +6233,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -6153,7 +6245,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -6161,7 +6253,7 @@ Mercaderia libs/ui/src/lib/i18n.ts - 46 + 48 @@ -6173,7 +6265,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -6181,7 +6273,7 @@ Ingressos Fixos libs/ui/src/lib/i18n.ts - 48 + 50 @@ -6189,7 +6281,7 @@ Liquiditat libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6197,7 +6289,11 @@ Immobiliari libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -6213,7 +6309,7 @@ Bona libs/ui/src/lib/i18n.ts - 53 + 55 @@ -6221,7 +6317,7 @@ Criptomoneda libs/ui/src/lib/i18n.ts - 56 + 58 @@ -6229,7 +6325,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -6237,7 +6333,7 @@ Fons d’inversió libs/ui/src/lib/i18n.ts - 59 + 61 @@ -6245,7 +6341,7 @@ Metall preciós libs/ui/src/lib/i18n.ts - 60 + 62 @@ -6253,7 +6349,7 @@ Capital privat libs/ui/src/lib/i18n.ts - 61 + 63 @@ -6261,7 +6357,7 @@ Acció libs/ui/src/lib/i18n.ts - 62 + 64 @@ -6269,7 +6365,7 @@ Àfrica libs/ui/src/lib/i18n.ts - 69 + 71 @@ -6277,7 +6373,15 @@ Àsia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -6285,7 +6389,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -6293,7 +6397,7 @@ Amèrica del Nord libs/ui/src/lib/i18n.ts - 72 + 74 @@ -6301,7 +6405,7 @@ If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -6309,7 +6413,7 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 @@ -6317,7 +6421,7 @@ Amèrica del Sud libs/ui/src/lib/i18n.ts - 74 + 76 @@ -6325,7 +6429,7 @@ Por extrema libs/ui/src/lib/i18n.ts - 106 + 79 @@ -6333,7 +6437,7 @@ Avarícia extrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -6341,7 +6445,7 @@ Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -6377,15 +6481,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6405,7 +6509,7 @@ Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6413,7 +6517,7 @@ Aplicació apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6421,7 +6525,7 @@ Pressupost apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6481,7 +6585,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6489,7 +6601,7 @@ Oficina familiar apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6497,7 +6609,7 @@ Investor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6509,7 +6621,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6521,7 +6633,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6529,7 +6641,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6537,7 +6649,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6545,7 +6657,7 @@ Tool apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6553,7 +6665,7 @@ User Experience apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6561,7 +6673,7 @@ Wealth apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6569,39 +6681,7 @@ Wealth Management apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6612,116 +6692,12 @@ 474 - - Canada - Canada - - libs/ui/src/lib/i18n.ts - 84 - - - - Czech Republic - Czech Republic + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6729,7 +6705,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6729,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 @@ -6761,7 +6737,7 @@ , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6781,7 +6757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6801,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6809,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6853,7 +6829,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6861,7 +6837,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6873,7 +6849,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6865,7 @@ Yes libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6905,7 +6881,7 @@ Portfolio Snapshot apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6937,7 +6913,7 @@ Threshold Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6945,7 +6921,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7037,7 +7013,15 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7060,6 +7044,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted cannot be self-hosted @@ -7157,15 +7149,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 @@ -7239,7 +7223,7 @@ Threshold range apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7371,7 +7355,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7395,7 +7379,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7419,11 +7403,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 +7447,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7463,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7471,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7479,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7503,7 +7487,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7511,7 +7495,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,7 +7511,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7519,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7527,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,11 +7543,11 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7575,19 +7559,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7651,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 +7663,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 +7674,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Terms of Service @@ -7768,7 +7720,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 +7728,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 +7792,7 @@ someone apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8244,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 +8300,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Collectible libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..3c8ed9e93 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -26,7 +26,7 @@ Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -50,12 +50,16 @@ Typ apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -66,7 +70,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -110,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -150,11 +154,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 @@ -194,7 +198,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -206,15 +210,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -234,7 +238,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -258,7 +262,7 @@ Löschen apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -282,7 +286,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -294,7 +298,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -305,12 +309,20 @@ 146 + + Paid + Bezahlt + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Delete Jobs Jobs löschen apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -318,7 +330,7 @@ Datenquelle apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -334,7 +346,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -342,7 +354,7 @@ Versuche apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -350,7 +362,11 @@ Erstellt apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -358,7 +374,7 @@ Abgeschlossen apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -366,7 +382,7 @@ Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -398,11 +414,11 @@ Historische Marktdaten apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -410,7 +426,7 @@ Daten anzeigen apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -418,7 +434,7 @@ Stacktrace anzeigen apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -426,7 +442,7 @@ Job löschen apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -442,7 +458,7 @@ Finde ein Konto... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -458,7 +474,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -498,7 +514,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -622,7 +638,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -646,7 +662,7 @@ Möchtest du diesen Benutzer wirklich löschen? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -662,7 +678,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -706,7 +722,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 +734,7 @@ Registrieren apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -750,11 +766,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 +790,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 @@ -854,15 +870,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -885,6 +901,14 @@ 46 + + Energy + Energie + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Eingeloggt bleiben @@ -978,15 +1002,15 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -998,15 +1022,15 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1030,7 +1054,7 @@ Datenfehler melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1042,7 +1066,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 +1082,7 @@ Alle anzeigen libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1070,7 +1094,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1078,11 +1102,11 @@ 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 - 385 + 384 @@ -1090,11 +1114,11 @@ 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 - 395 + 394 @@ -1102,11 +1126,11 @@ 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 - 419 + 416 @@ -1122,11 +1146,11 @@ 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 - 425 + 422 @@ -1138,11 +1162,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 +1178,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 +1214,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 +1237,14 @@ 174 + + Consumer Defensive + Defensive Konsumgüter + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Gutscheincode wurde eingelöst @@ -1246,11 +1278,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -1273,6 +1305,14 @@ 67 + + Utilities + Versorgungsbetriebe + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Präsentationsansicht @@ -1289,12 +1329,20 @@ 9 + + Coupon + Gutschein + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Locale Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1382,15 +1430,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1434,7 +1482,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1454,7 +1502,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -1502,11 +1550,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 +1718,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1684,10 +1732,6 @@ Overview Übersicht - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -1698,7 +1742,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1706,7 +1750,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -1726,7 +1770,7 @@ Märkte apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -1734,7 +1778,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1853,6 +1897,14 @@ 150 + + Trial + Testphase + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Analysis Analyse @@ -1870,7 +1922,7 @@ Zeitstrahl der Investitionen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1886,7 +1938,7 @@ Verlierer apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1946,7 +1998,7 @@ Aktuelle Woche apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1970,7 +2022,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1993,6 +2045,14 @@ 119 + + Consumer Cyclical + Zyklische Konsumgüter + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Anzahl @@ -2006,11 +2066,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2022,7 +2082,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 @@ -2030,7 +2090,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2074,7 +2134,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2098,7 +2158,7 @@ Daten importieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2106,12 +2166,12 @@ Der Import wurde abgeschlossen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 or start a discussion at - oder beginne eine Diskussion unter + oder beginne eine Diskussion bei apps/client/src/app/pages/about/overview/about-overview-page.html 94 @@ -2126,15 +2186,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,19 +2214,19 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -2186,7 +2246,7 @@ Nachhaltiges Einkommen im Ruhestand apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -2238,11 +2298,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 @@ -2282,7 +2342,15 @@ Geplant libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 + + + + Subscriptions + Abonnements + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -2290,7 +2358,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 +2422,7 @@ Änderung vom Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2370,7 +2438,15 @@ vom AZH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profil} other {Profile}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -2402,7 +2478,7 @@ Diese Funktion ist derzeit nicht verfügbar. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2410,15 +2486,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 +2502,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 +2542,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -2474,7 +2550,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2490,7 +2566,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2550,7 +2626,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2558,7 +2634,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -2586,7 +2662,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2618,7 +2694,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 +2702,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2634,7 +2710,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 +2718,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2650,7 +2726,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2686,11 +2762,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 +2782,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -2770,7 +2846,7 @@ Gesamtbetrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -2778,7 +2854,7 @@ Portfolio Wertentwicklung apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2794,7 +2870,7 @@ Sparrate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -2806,11 +2882,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2830,7 +2906,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2842,11 +2918,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2854,7 +2930,7 @@ Symbol apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -2870,11 +2946,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2882,11 +2958,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 +2974,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2906,7 +2982,7 @@ Rohstoff libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2918,7 +2994,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2926,7 +3002,7 @@ Feste Einkünfte libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2934,7 +3010,11 @@ Immobilien libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2950,7 +3030,7 @@ Anleihe libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2958,7 +3038,7 @@ Kryptowährung libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2966,7 +3046,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2974,7 +3054,7 @@ Investmentfonds libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2982,7 +3062,7 @@ Edelmetall libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2990,7 +3070,7 @@ Privates Beteiligungskapital libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2998,7 +3078,7 @@ Aktie libs/ui/src/lib/i18n.ts - 62 + 64 @@ -3014,7 +3094,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3022,11 +3102,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 + 448 @@ -3042,15 +3126,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3062,7 +3146,7 @@ Nordamerika libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3070,7 +3154,7 @@ Afrika libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3078,7 +3162,15 @@ Asien libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Kommunikationsdienste + + libs/ui/src/lib/i18n.ts + 87 @@ -3086,7 +3178,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3094,7 +3186,7 @@ Wenn du heute in den Ruhestand gehen würdest, könntest du apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -3102,7 +3194,7 @@ Ozeanien libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3110,7 +3202,7 @@ Südamerika libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3118,7 +3210,7 @@ Folgende Dateiformate werden unterstützt: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3126,11 +3218,19 @@ Zurück apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Preis + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -3154,7 +3254,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 @@ -3162,7 +3262,7 @@ Zeitstrahl der Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3198,11 +3298,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3218,7 +3318,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3230,7 +3330,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3246,7 +3346,7 @@ Daten validieren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3254,11 +3354,11 @@ Importieren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3270,7 +3370,7 @@ Marktdaten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3318,7 +3418,7 @@ Dividenden laden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3326,7 +3426,15 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Läuft ab + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3334,7 +3442,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 +3470,7 @@ Kern libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3370,7 +3478,7 @@ Zuwendung libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3378,7 +3486,7 @@ Höheres Risiko libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3386,7 +3494,7 @@ Geringeres Risiko libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3394,7 +3502,7 @@ Keine Aktivitäten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3402,7 +3510,7 @@ Altersvorsorge libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3418,7 +3526,7 @@ Satellit libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3542,7 +3650,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 +3778,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 +3850,7 @@ Einfacher Wechsel zu Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3766,7 +3874,7 @@ Einfacher Wechsel zu Ghostfolio Premium oder Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3774,7 +3882,7 @@ Darlehen libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3826,7 +3934,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 @@ -3890,7 +3998,7 @@ Bis apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -3906,7 +4014,7 @@ Aktuelles Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3922,11 +4030,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3942,7 +4050,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 +4058,7 @@ Möchtest du diese Plattform wirklich löschen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -4022,7 +4130,7 @@ Diese Aktivität existiert bereits. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4054,7 +4162,7 @@ Dividenden auswählen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4062,7 +4170,7 @@ Aktivitäten auswählen apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4086,7 +4194,7 @@ Aktueller Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4094,7 +4202,7 @@ Längster Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4102,7 +4210,7 @@ Monate libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4110,7 +4218,7 @@ Jahre libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4118,7 +4226,7 @@ Monat libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4126,7 +4234,7 @@ Jahr libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4286,7 +4394,15 @@ Verbindlichkeit libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technologie + + libs/ui/src/lib/i18n.ts + 96 @@ -4297,12 +4413,20 @@ 32 + + Total + Gesamt + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -4530,7 +4654,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4538,7 +4662,7 @@ Wertsache libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4546,7 +4670,7 @@ ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4554,7 +4678,7 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4570,7 +4694,7 @@ Filtervorlage libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4586,15 +4710,7 @@ Asien-Pazifik libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japan - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4682,7 +4798,7 @@ wird ein Anstieg prognostiziert auf apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4734,7 +4850,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4790,7 +4906,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 +4958,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 +5053,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. @@ -5057,6 +5181,14 @@ 217 + + Oops! Could not delete the asset profiles. + Ups! Die Anlageprofile konnten nicht gelöscht werden. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Was unsere Nutzer sagen @@ -5395,28 +5527,16 @@ 325 - - Switzerland - Schweiz - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Weltweit apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5460,7 +5580,7 @@ und einer sicheren Entnahmerate (SWR) von apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5476,7 +5596,7 @@ Wähle eine Datei aus oder ziehe sie hierhin apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5512,11 +5632,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5540,7 +5660,7 @@ Möchtest du diesen Tag wirklich löschen? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5640,7 +5760,7 @@ Anlageprofil apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5648,7 +5768,11 @@ Möchtest du dieses Anlageprofil wirklich löschen? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5659,6 +5783,14 @@ 16 + + Industrials + Industrie + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Manuell hinzufügen @@ -5680,7 +5812,7 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5688,7 +5820,7 @@ Letztes Allzeithoch libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5696,11 +5828,11 @@ pro Monat apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5732,7 +5864,7 @@ Ups, der Cash-Bestand Transfer ist fehlgeschlagen. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5740,7 +5872,7 @@ Extreme Angst libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5748,7 +5880,7 @@ Extreme Gier libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5756,7 +5888,7 @@ Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5767,6 +5899,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 +5920,7 @@ 50 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5788,7 +5928,7 @@ 200 Tage Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5796,7 +5936,7 @@ Cash-Bestände apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5816,7 +5956,7 @@ Möchtest du diesen Cash-Bestand wirklich löschen? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5832,7 +5972,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 +5980,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5880,15 +6020,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 @@ -5902,6 +6034,10 @@ Job Queue Job Warteschlange + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5912,7 +6048,7 @@ Die Marktdaten sind verzögert für apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5928,15 +6064,15 @@ 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 - 89 + 92 @@ -5952,7 +6088,7 @@ Position abschliessen apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5992,7 +6128,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -6000,11 +6136,11 @@ 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 - 377 + 376 @@ -6012,7 +6148,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -6020,11 +6156,11 @@ 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 - 381 + 380 @@ -6032,7 +6168,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6068,7 +6204,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 @@ -6080,7 +6216,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6088,11 +6224,11 @@ 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 - 419 + 416 @@ -6108,7 +6244,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6120,7 +6256,7 @@ Finde eine Position... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6173,7 +6309,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 +6336,6 @@ 62 - - Indonesia - Indonesien - - libs/ui/src/lib/i18n.ts - 90 - - Activity Aktivität @@ -6229,7 +6357,7 @@ Job ausführen apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6237,7 +6365,7 @@ Priorität apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6245,7 +6373,7 @@ Diese Aktion ist nicht zulässig. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6253,7 +6381,7 @@ Liquidität libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6269,7 +6397,7 @@ Kauf und Verkauf libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6301,7 +6429,7 @@ Springe zu einer Seite... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6349,7 +6477,7 @@ Berücksichtigen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6373,31 +6501,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Profile löschen - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Möchtest du diese Profile wirklich löschen? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Ups! Die Profile konnten nicht gelöscht werden. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6429,7 +6533,7 @@ Alternative apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6437,7 +6541,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6445,7 +6549,7 @@ Budgetierung apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6505,7 +6609,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Ups! Das Anlageprofil konnte nicht gelöscht werden. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6513,7 +6625,7 @@ Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6521,7 +6633,7 @@ Investor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6533,7 +6645,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6545,7 +6657,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6553,7 +6665,7 @@ Datenschutz apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6561,7 +6673,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6569,7 +6681,7 @@ Tool apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6577,7 +6689,7 @@ User Experience apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6585,7 +6697,7 @@ Vermögen apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6593,39 +6705,7 @@ Vermögensverwaltung apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6636,116 +6716,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 + + Do you really want to delete these asset profiles? + Möchtest du diese Anlageprofile wirklich löschen? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6753,7 +6729,7 @@ Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6777,7 +6753,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 @@ -6785,7 +6761,7 @@ entnehmen, bezogen auf dein Gesamtanlagevermögen von apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6805,7 +6781,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6849,7 +6825,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6857,7 +6833,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6877,7 +6853,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6885,7 +6861,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6897,7 +6873,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6913,7 +6889,7 @@ Ja libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6929,7 +6905,7 @@ Portfolio Snapshot apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6961,7 +6937,7 @@ Schwellenwert (Minimum) apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6969,7 +6945,7 @@ Schwellenwert (Maximum) apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7061,7 +7037,15 @@ , bei einem angenommenen Jahreszinssatz von apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Finanzdienstleistungen + + libs/ui/src/lib/i18n.ts + 91 @@ -7084,6 +7068,14 @@ 195 + + Delete + löschen + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted kann nicht selbst gehostet werden @@ -7181,15 +7173,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 @@ -7263,7 +7247,7 @@ Schwellenwertbereich apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7395,7 +7379,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7419,7 +7403,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7443,11 +7427,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 +7471,7 @@ KI-Anweisung wurde in die Zwischenablage kopiert apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7503,7 +7487,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7511,7 +7495,7 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7519,7 +7503,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7527,7 +7511,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7535,7 +7519,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7543,7 +7527,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7551,7 +7535,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7559,7 +7543,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7567,7 +7551,7 @@ Öffne Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7583,11 +7567,11 @@ Änderung libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7599,19 +7583,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7646,30 +7630,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 +7675,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 +7687,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 +7698,6 @@ 239 - - United Kingdom - Vereinigtes Königreich - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Allgemeine Geschäftsbedingungen @@ -7792,7 +7744,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7800,7 +7752,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 +7792,7 @@ jemand apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Möchtest du diesen Eintrag wirklich löschen? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Ausloggen apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,7 @@ Aktueller Monat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8244,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 +8300,7 @@ Anlageprofil verwalten apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Alternative Investition libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Sammlerobjekt libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Ø Preis pro Einheit apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..97398f8b0 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -27,7 +27,7 @@ El riesgo de pérdida en trading puede ser sustancial. No es aconsejable invertir dinero que puedas necesitar a corto plazo. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -51,12 +51,16 @@ Tipo apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -67,7 +71,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -111,7 +115,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -151,11 +155,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 @@ -195,7 +199,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -207,15 +211,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -235,7 +239,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -259,7 +263,7 @@ Eliminar apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -283,7 +287,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -295,7 +299,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -306,12 +310,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Delete Jobs Eliminar trabajos apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -319,7 +331,7 @@ Fuente de datos apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -335,7 +347,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -343,7 +355,7 @@ Intentos apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -351,7 +363,11 @@ Creado apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -359,7 +375,7 @@ Finalizado apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -367,7 +383,7 @@ Estado apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -399,11 +415,11 @@ Datos históricos del mercado apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -411,7 +427,7 @@ Ver datos apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -419,7 +435,7 @@ Ver Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -427,7 +443,7 @@ Eliminar trabajo apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -443,7 +459,7 @@ Buscar una cuenta... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -459,7 +475,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -499,7 +515,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -607,7 +623,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -631,7 +647,7 @@ ¿Seguro que quieres eliminar este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -647,7 +663,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -691,7 +707,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 +719,7 @@ Empezar apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -735,11 +751,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 +775,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 @@ -839,15 +855,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -870,6 +886,14 @@ 46 + + Energy + Energía + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Seguir conectado @@ -963,15 +987,15 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -983,15 +1007,15 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1015,7 +1039,7 @@ Reportar anomalía en los datos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1027,7 +1051,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 +1067,7 @@ Mostrar todos libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1055,7 +1079,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1063,11 +1087,11 @@ 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 - 385 + 384 @@ -1075,11 +1099,11 @@ 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 - 395 + 394 @@ -1087,11 +1111,11 @@ 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 - 419 + 416 @@ -1107,11 +1131,11 @@ 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 - 425 + 422 @@ -1123,11 +1147,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 +1163,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 +1199,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 +1222,14 @@ 174 + + Consumer Defensive + Consumo Básico + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed El código del cupón ha sido canjeado @@ -1231,11 +1263,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -1258,6 +1290,14 @@ 67 + + Utilities + Servicios Públicos + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista del presentador @@ -1274,12 +1314,20 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Locale Configuración regional apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1367,15 +1415,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1419,7 +1467,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1439,7 +1487,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -1487,11 +1535,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 +1703,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1669,10 +1717,6 @@ Overview Visión general - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -1683,7 +1727,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1691,7 +1735,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -1711,7 +1755,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -1719,7 +1763,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1838,6 +1882,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Analysis Análisis @@ -1855,7 +1907,7 @@ Cronología de la inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1871,7 +1923,7 @@ Peores apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1931,7 +1983,7 @@ Semana actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1955,7 +2007,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1978,6 +2030,14 @@ 119 + + Consumer Cyclical + Consumo Discrecional + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Cantidad @@ -1991,11 +2051,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2007,7 +2067,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 @@ -2015,7 +2075,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2059,7 +2119,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2083,7 +2143,7 @@ Importando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2091,7 +2151,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 +2171,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,19 +2199,19 @@ Cartera apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -2171,7 +2231,7 @@ Ingresos sostenibles para la jubilación apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -2223,11 +2283,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 @@ -2267,7 +2327,15 @@ Borrador libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -2275,7 +2343,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 +2407,7 @@ Variación respecto al máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2355,7 +2423,15 @@ desde el máximo histórico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -2387,7 +2463,7 @@ Esta funcionalidad no está disponible actualmente. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2395,11 +2471,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 +2483,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 +2503,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2499,7 +2575,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -2507,7 +2583,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2555,7 +2631,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2563,7 +2639,7 @@ tasa de interés anual apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -2579,7 +2655,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2603,7 +2679,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 +2687,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2619,7 +2695,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 +2703,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2635,7 +2711,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2671,11 +2747,11 @@ Índice de referencia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -2683,11 +2759,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 @@ -2755,7 +2831,7 @@ Importe total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -2763,7 +2839,7 @@ Evolución de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2779,7 +2855,7 @@ Tasa de ahorro apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -2791,11 +2867,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2815,7 +2891,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2827,11 +2903,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2839,7 +2915,7 @@ Símbolo apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -2855,11 +2931,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2867,11 +2943,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 +2959,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2891,7 +2967,7 @@ Materia prima libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2903,7 +2979,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2911,15 +2987,19 @@ Renta fija libs/ui/src/lib/i18n.ts - 48 + 50 Real Estate - Propiedad inmobiliaria + Inmobiliario libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2935,7 +3015,7 @@ Bono libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2943,7 +3023,7 @@ Criptomoneda libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2951,7 +3031,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2959,7 +3039,7 @@ Fondo de inversión libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2967,7 +3047,7 @@ Metal precioso libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2975,7 +3055,7 @@ Capital riesgo libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2983,7 +3063,7 @@ Acción libs/ui/src/lib/i18n.ts - 62 + 64 @@ -2999,7 +3079,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3007,11 +3087,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 + 448 @@ -3027,15 +3111,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3047,7 +3131,7 @@ América del Norte libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3055,7 +3139,7 @@ África libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3063,7 +3147,15 @@ Asia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Servicios de Comunicación + + libs/ui/src/lib/i18n.ts + 87 @@ -3071,7 +3163,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3079,7 +3171,7 @@ Si te jubilas hoy, podrías retirar apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -3087,7 +3179,7 @@ Oceanía libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3095,7 +3187,7 @@ América del Sur libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3103,7 +3195,7 @@ Los siguientes formatos de archivo son compatibles: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3111,11 +3203,19 @@ Volver apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -3139,7 +3239,7 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 @@ -3175,11 +3275,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3187,7 +3287,7 @@ Calendario de dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3203,7 +3303,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3215,7 +3315,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3231,7 +3331,7 @@ Validando datos... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3239,11 +3339,11 @@ Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3255,7 +3355,7 @@ Datos del mercado apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3303,7 +3403,7 @@ Cargar dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3311,7 +3411,15 @@ Anual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3319,7 +3427,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 +3455,7 @@ Núcleo libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3355,7 +3463,7 @@ Conceder libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3363,7 +3471,7 @@ Mayor riesgo libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3371,7 +3479,7 @@ Menor riesgo libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3379,7 +3487,7 @@ Sin operaciones apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3387,7 +3495,7 @@ Provisión de jubilación libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3403,7 +3511,7 @@ Satélite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3527,7 +3635,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 +3763,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 +3835,7 @@ Cambia a Ghostfolio Premium fácilmente libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3751,7 +3859,7 @@ Cambia a Ghostfolio Premium o Ghostfolio Open Source fácilmente libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3759,7 +3867,7 @@ Préstamo libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3803,7 +3911,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 @@ -3867,7 +3975,7 @@ Por apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -3883,7 +3991,7 @@ Año actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3899,11 +4007,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3919,7 +4027,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 +4035,7 @@ ¿Seguro que quieres eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -3999,7 +4107,7 @@ Esta operación ya existe. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4031,7 +4139,7 @@ Seleccionar dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4039,7 +4147,7 @@ Seleccionar operaciones apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4063,7 +4171,7 @@ Racha actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4071,7 +4179,7 @@ Racha más larga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4079,7 +4187,7 @@ Meses libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4087,7 +4195,7 @@ Años libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4095,7 +4203,7 @@ Mes libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4103,7 +4211,7 @@ Año libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4263,7 +4371,15 @@ Pasivo libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Tecnología + + libs/ui/src/lib/i18n.ts + 96 @@ -4274,12 +4390,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -4507,7 +4631,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4515,7 +4639,7 @@ Activo de valor libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4523,7 +4647,7 @@ ETFs sin países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4531,7 +4655,7 @@ ETFs sin sectores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4547,7 +4671,7 @@ Preestablecido libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4563,15 +4687,7 @@ Asia-Pacífico libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japón - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4659,7 +4775,7 @@ se proyecta que esto aumente a apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4711,7 +4827,7 @@ ID del trabajo apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4767,7 +4883,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 +4935,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 +5030,14 @@ 149 + + Basic Materials + Materiales Básicos + + 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. @@ -5034,6 +5158,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Lo que nuestros usuarios están diciendo @@ -5372,28 +5504,16 @@ 325 - - Switzerland - Suiza - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5437,7 +5557,7 @@ y una tasa de retiro segura (SWR) de apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5453,7 +5573,7 @@ Elige o suelta un archivo aquí apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5489,11 +5609,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5517,7 +5637,7 @@ ¿Seguro que quieres eliminar esta etiqueta? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5617,7 +5737,7 @@ Perfil de activo apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5625,7 +5745,11 @@ ¿Seguro que quieres eliminar este perfil de activo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5636,6 +5760,14 @@ 16 + + Industrials + Industriales + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Añadir manualmente @@ -5657,7 +5789,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5665,7 +5797,7 @@ Último máximo histórico libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5673,11 +5805,11 @@ por mes apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5709,7 +5841,7 @@ ¡Vaya! La transferencia del saldo de efectivo ha fallado. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5717,7 +5849,7 @@ Miedo extremo libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5725,7 +5857,7 @@ Codicia extrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5733,7 +5865,7 @@ Neutral libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5744,6 +5876,14 @@ 284 + + Healthcare + Salud + + 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 +5897,7 @@ Tendencia de 50 días libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5765,7 +5905,7 @@ Tendencia de 200 días libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5773,7 +5913,7 @@ Saldos de efectivo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5793,7 +5933,7 @@ ¿Seguro que quieres eliminar el saldo de esta cuenta? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5809,7 +5949,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 +5957,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5857,15 +5997,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 @@ -5879,6 +6011,10 @@ Job Queue Cola de trabajos + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5889,7 +6025,7 @@ Los datos del mercado tienen un retraso de apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5905,15 +6041,15 @@ 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 - 89 + 92 @@ -5929,7 +6065,7 @@ Cerrar posición apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5969,7 +6105,7 @@ Semana hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5977,11 +6113,11 @@ 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 - 377 + 376 @@ -5989,7 +6125,7 @@ Mes hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5997,11 +6133,11 @@ 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 - 381 + 380 @@ -6009,7 +6145,7 @@ Año hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6045,7 +6181,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 @@ -6057,7 +6193,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6065,11 +6201,11 @@ 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 - 419 + 416 @@ -6085,7 +6221,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6097,7 +6233,7 @@ Buscar una posición... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6150,7 +6286,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 +6313,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Operación @@ -6206,7 +6334,7 @@ Ejecutar trabajo apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6214,7 +6342,7 @@ Prioridad apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6222,7 +6350,7 @@ Esta acción no está permitida. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6230,7 +6358,7 @@ Liquidez libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6246,7 +6374,7 @@ Comprar y vender libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6278,7 +6406,7 @@ Saltar a una página... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6326,7 +6454,7 @@ Incluir en apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6350,31 +6478,7 @@ Índices de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Eliminar Perfiles - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - ¿Seguro que quieres eliminar estos perfiles? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - ¡Vaya! No se pudieron eliminar los perfiles. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6406,7 +6510,7 @@ Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6414,7 +6518,7 @@ Aplicación apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6422,7 +6526,7 @@ Presupuestos apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6482,7 +6586,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6490,7 +6602,7 @@ Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6498,7 +6610,7 @@ Inversor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6510,7 +6622,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6522,7 +6634,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6530,7 +6642,7 @@ Privacidad apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6538,7 +6650,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6546,7 +6658,7 @@ Herramienta apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6554,7 +6666,7 @@ Experiencia del usuario apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6562,7 +6674,7 @@ Patrimonio apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6570,39 +6682,7 @@ Gestión de patrimonios apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6613,116 +6693,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 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6730,7 +6706,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6754,7 +6730,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 @@ -6762,7 +6738,7 @@ , basado en tus activos totales de apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6782,7 +6758,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6826,7 +6802,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6834,7 +6810,7 @@ Cerrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6854,7 +6830,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6862,7 +6838,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6874,7 +6850,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6890,7 +6866,7 @@ libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6906,7 +6882,7 @@ Instantánea de la cartera apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6938,7 +6914,7 @@ Umbral mínimo apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6946,7 +6922,7 @@ Umbral máximo apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7038,7 +7014,15 @@ , asumiendo un apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Servicios Financieros + + libs/ui/src/lib/i18n.ts + 91 @@ -7061,6 +7045,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted no se puede autoalojar @@ -7158,15 +7150,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 @@ -7240,7 +7224,7 @@ Rango del umbral apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7372,7 +7356,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7396,7 +7380,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7420,11 +7404,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 +7448,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 +7464,7 @@ Bajo demanda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7488,7 +7472,7 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7496,7 +7480,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7504,7 +7488,7 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7512,7 +7496,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7520,7 +7504,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7528,7 +7512,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 +7520,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7544,7 +7528,7 @@ Abrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7560,11 +7544,11 @@ Cambio libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7576,19 +7560,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7623,30 +7607,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 +7652,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 +7664,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 +7675,6 @@ 239 - - United Kingdom - Reino Unido - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Términos de servicio @@ -7769,7 +7721,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 +7729,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 +7793,7 @@ alguien apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7825,7 @@ ¿Seguro que quieres eliminar este elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7833,7 @@ Cerrar sesión apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8080,7 @@ Mes actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8293,7 +8245,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 +8301,7 @@ Gestionar perfil de activo apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8357,7 +8309,7 @@ Inversión alternativa libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8317,7 @@ Coleccionable libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8325,7 @@ Precio medio por unidad apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..25910eafe 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -6,7 +6,7 @@ Le risque de perte en investissant peut être important. Il est déconseillé d’investir de l’argent dont vous pourriez avoir besoin à court terme. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -42,12 +42,16 @@ Type apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -58,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -118,7 +122,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -158,11 +162,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 +194,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -210,7 +214,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -250,7 +254,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -262,15 +266,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -290,7 +294,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -314,7 +318,7 @@ Supprimer apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -338,7 +342,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -350,7 +354,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -361,12 +365,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Data Source Source Données apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -382,7 +394,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -390,7 +402,7 @@ Tentatives apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -398,7 +410,11 @@ Créé apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -406,7 +422,7 @@ Terminé apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -414,7 +430,7 @@ Statut apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -434,7 +450,7 @@ Supprimer Tâches apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -454,11 +470,11 @@ Données historiques du marché apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -466,7 +482,7 @@ Voir Données apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -474,7 +490,7 @@ Voir la Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -482,7 +498,7 @@ Supprimer Tâche apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -498,7 +514,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -514,7 +530,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -542,7 +558,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -562,7 +578,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -638,7 +654,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -646,7 +662,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -658,15 +674,15 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -678,15 +694,15 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -694,7 +710,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 @@ -702,7 +718,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -818,7 +834,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -842,7 +858,7 @@ Voulez-vous vraiment supprimer cet·te utilisateur·rice ? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -858,7 +874,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -894,11 +910,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,19 +930,19 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -938,11 +954,11 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -958,7 +974,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 +986,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 +1010,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 +1034,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 +1042,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1034,7 +1050,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 +1058,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1062,7 +1078,7 @@ Montant Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -1078,7 +1094,7 @@ Taux d’Épargne apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1130,15 +1146,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1161,6 +1177,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Rester connecté @@ -1286,11 +1310,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1298,7 +1322,7 @@ Signaler une Erreur de Données apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1310,7 +1334,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1318,11 +1342,11 @@ 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 - 385 + 384 @@ -1330,11 +1354,11 @@ 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 - 395 + 394 @@ -1342,11 +1366,11 @@ 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 - 419 + 416 @@ -1362,11 +1386,11 @@ 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 - 425 + 422 @@ -1374,7 +1398,7 @@ Cette fonctionnalité est momentanément indisponible. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -1382,15 +1406,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 +1422,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 +1438,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 +1454,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 +1490,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 +1525,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Le code promotionnel a été appliqué @@ -1534,11 +1566,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -1561,6 +1593,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vue de Présentation @@ -1577,6 +1617,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language Langue @@ -1590,7 +1638,7 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1710,15 +1758,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1766,7 +1814,7 @@ Données du marché apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -1778,11 +1826,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 +2006,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -2014,7 +2062,7 @@ Marchés apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -2022,7 +2070,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -2090,7 +2138,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2122,7 +2170,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2146,7 +2194,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -2169,6 +2217,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Unit Price Prix Unitaire @@ -2178,7 +2234,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 @@ -2186,7 +2242,7 @@ Import des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2194,7 +2250,7 @@ L’import est terminé apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2210,7 +2266,7 @@ Validation des données... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -2218,7 +2274,7 @@ Les formats de fichier suivants sont supportés : apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -2226,11 +2282,19 @@ Retour apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -2238,11 +2302,11 @@ Importer apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -2341,6 +2405,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis Exclude from Analysis @@ -2350,7 +2422,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2442,11 +2514,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -2454,7 +2526,7 @@ annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -2470,7 +2542,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2486,7 +2558,7 @@ Bas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -2494,7 +2566,7 @@ Évolution du Portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2502,7 +2574,7 @@ Historique des Investissements apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -2510,7 +2582,7 @@ Historique des Dividendes apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -2538,15 +2610,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 @@ -2582,7 +2654,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -2598,7 +2670,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 +2758,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 @@ -2728,10 +2800,6 @@ Overview Aperçu - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -2742,7 +2810,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2750,7 +2818,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -2770,15 +2838,23 @@ Brouillon libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 - + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 + + + Import Activities 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 +2918,7 @@ Différence avec le Record Historique libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2858,7 +2934,15 @@ par rapport au record historique libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -2894,7 +2978,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2914,7 +2998,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 +3014,7 @@ Montrer tout libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -2942,11 +3026,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2966,7 +3050,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2978,11 +3062,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 +3082,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3010,7 +3094,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3026,7 +3110,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3034,11 +3118,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 + 448 @@ -3046,7 +3134,7 @@ Symbole apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -3062,11 +3150,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -3074,11 +3162,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 +3178,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -3098,7 +3186,7 @@ Marchandise libs/ui/src/lib/i18n.ts - 46 + 48 @@ -3110,7 +3198,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -3118,7 +3206,7 @@ Revenu Fixe libs/ui/src/lib/i18n.ts - 48 + 50 @@ -3126,7 +3214,11 @@ Immobilier libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -3142,7 +3234,7 @@ Obligation libs/ui/src/lib/i18n.ts - 53 + 55 @@ -3150,7 +3242,7 @@ Cryptomonnaie libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3158,7 +3250,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3166,7 +3258,7 @@ SICAV libs/ui/src/lib/i18n.ts - 59 + 61 @@ -3174,7 +3266,7 @@ Métal Précieux libs/ui/src/lib/i18n.ts - 60 + 62 @@ -3182,7 +3274,7 @@ Capital Propre libs/ui/src/lib/i18n.ts - 61 + 63 @@ -3190,7 +3282,7 @@ Action libs/ui/src/lib/i18n.ts - 62 + 64 @@ -3198,7 +3290,7 @@ Afrique libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3206,7 +3298,15 @@ Asie libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3214,7 +3314,7 @@ Europe libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3222,7 +3322,7 @@ Amérique du Nord libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3230,7 +3330,7 @@ If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -3238,7 +3338,7 @@ Océanie libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3246,7 +3346,7 @@ Amérique du Sud libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3270,15 +3370,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3302,7 +3402,7 @@ Charger Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3310,7 +3410,15 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3318,7 +3426,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 +3454,7 @@ Core libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3354,7 +3462,7 @@ Donner libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3362,7 +3470,7 @@ Risque élevé libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3370,7 +3478,7 @@ Risque faible libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3378,7 +3486,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3386,7 +3494,7 @@ Réserve pour retraite libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3402,7 +3510,7 @@ Satellite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3526,7 +3634,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 +3762,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 +3834,7 @@ Passez à Ghostfolio Premium facilement libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3750,7 +3858,7 @@ Passez à Ghostfolio Premium ou Ghostfolio Open Source facilement libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3758,7 +3866,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3802,7 +3910,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 @@ -3866,7 +3974,7 @@ By apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -3882,7 +3990,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3898,11 +4006,11 @@ Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3918,7 +4026,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 +4034,7 @@ Voulez-vous vraiment supprimer cette plateforme ? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -3998,7 +4106,7 @@ Cette activité existe déjà. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4030,7 +4138,7 @@ Selectionner les Dividendes apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4038,7 +4146,7 @@ Selectionner les Activités apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4062,7 +4170,7 @@ Série en cours apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4070,7 +4178,7 @@ Série la plus longue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4078,7 +4186,7 @@ Mois libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4086,7 +4194,7 @@ Années libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4094,7 +4202,7 @@ Mois libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4102,7 +4210,7 @@ Année libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4262,7 +4370,15 @@ Dette libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4273,12 +4389,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -4506,7 +4630,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4514,7 +4638,7 @@ Actifs libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4522,7 +4646,7 @@ ETF sans Pays apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4530,7 +4654,7 @@ ETF sans Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4546,7 +4670,7 @@ Configuration par défaut libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4562,15 +4686,7 @@ Asie-Pacifique libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japon - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4658,7 +4774,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4710,7 +4826,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4766,7 +4882,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 +4934,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 +5029,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. @@ -5033,6 +5157,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Qu’en pensent nos utilisateurs @@ -5371,28 +5503,16 @@ 325 - - Switzerland - Suisse - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Mondial apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5436,7 +5556,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5452,7 +5572,7 @@ Choisissez ou déposez un fichier ici apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5488,11 +5608,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5636,7 @@ Confirmez la suppression de ce tag ? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5616,7 +5736,7 @@ Profil d’Actif apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5624,7 +5744,11 @@ Confirmez la suppressoion de ce profil d’actif? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5635,6 +5759,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Ajouter manuellement @@ -5656,7 +5788,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5664,7 +5796,7 @@ Dernier All Time High libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5672,11 +5804,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5708,7 +5840,7 @@ Oops, échec du transfert de la cash balance. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5848,7 @@ Extreme Peur libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5856,7 @@ Extreme Cupidité libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5864,7 @@ Neutre libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5875,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 +5896,7 @@ Tendance 50 jours libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5904,7 @@ Tendance 200 jours libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5912,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5792,7 +5932,7 @@ Voulez-vous vraiment supprimer ce solde de compte ? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5808,7 +5948,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 +5956,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5856,15 +5996,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 @@ -5878,6 +6010,10 @@ Job Queue File d’attente + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5888,7 +6024,7 @@ Les données du marché sont retardées de apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,15 +6040,15 @@ 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 - 89 + 92 @@ -5928,7 +6064,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5968,7 +6104,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5976,11 +6112,11 @@ 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 - 377 + 376 @@ -5988,7 +6124,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5996,11 +6132,11 @@ 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 - 381 + 380 @@ -6008,7 +6144,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6044,7 +6180,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 @@ -6056,7 +6192,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6064,11 +6200,11 @@ 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 - 419 + 416 @@ -6084,7 +6220,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6096,7 +6232,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6149,7 +6285,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 +6312,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Activitées @@ -6205,7 +6333,7 @@ Execute la tâche apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6213,7 +6341,7 @@ Priorité apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6221,7 +6349,7 @@ Cette action n’est pas autorisée. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6357,7 @@ Liquiditées libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6373,7 @@ Achat et Vente libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6277,7 +6405,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6325,7 +6453,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6349,31 +6477,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Supprimer des Profils - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Confirmer la suppression de ces Profils? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Oops! Echec de la suppression de Profils. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6405,7 +6509,7 @@ Alternative apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6413,7 +6517,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6421,7 +6525,7 @@ Budget apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6481,7 +6585,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6489,7 +6601,7 @@ Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6497,7 +6609,7 @@ Investisseur apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6509,7 +6621,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6521,7 +6633,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6529,7 +6641,7 @@ Confidentialité apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6537,7 +6649,7 @@ Logiciels apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6545,7 +6657,7 @@ Outils apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6553,7 +6665,7 @@ Expérience Utilisateur apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6561,7 +6673,7 @@ Patrimoine apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6569,39 +6681,7 @@ Gestion de Patrimoine apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6612,116 +6692,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 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6729,7 +6705,7 @@ Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6729,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 @@ -6761,7 +6737,7 @@ , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6781,7 +6757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6801,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6809,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6853,7 +6829,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6861,7 +6837,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6873,7 +6849,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6865,7 @@ Oui libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6905,7 +6881,7 @@ Résumé du portefeuille apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6937,7 +6913,7 @@ Seuil Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6945,7 +6921,7 @@ Seuil Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7037,7 +7013,15 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7060,6 +7044,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted ne peut pas être auto-hébergé @@ -7157,15 +7149,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 @@ -7239,7 +7223,7 @@ Plage de seuil apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7371,7 +7355,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7395,7 +7379,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7419,11 +7403,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 +7447,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 +7463,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7471,7 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7479,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7503,7 +7487,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7511,7 +7495,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,7 +7511,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 +7519,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7527,7 @@ Ouvrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,11 +7543,11 @@ Variation libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7575,19 +7559,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7651,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 +7663,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 +7674,6 @@ 239 - - United Kingdom - Royaume-Uni - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Conditions d’utilisation @@ -7768,7 +7720,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 +7728,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 +7792,7 @@ quelqu’un apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Voulez-vous vraiment supprimer cet élément? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Se déconnecter apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8244,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 +8300,7 @@ Gérer le profil d’actif apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Investissement alternatif libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Objet de collection libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..56cd10a65 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -27,7 +27,7 @@ Il rischio di perdita nel trading può essere notevole. Non è consigliabile investire denaro di cui potresti avere bisogno a breve termine. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -51,12 +51,16 @@ Tipo apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -67,7 +71,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -111,7 +115,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -151,11 +155,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 @@ -195,7 +199,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -207,15 +211,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -235,7 +239,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -259,7 +263,7 @@ Elimina apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -283,7 +287,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -295,7 +299,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -306,12 +310,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Delete Jobs Elimina i lavori apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -319,7 +331,7 @@ Sorgente dei dati apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -335,7 +347,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -343,7 +355,7 @@ Tentativi apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -351,7 +363,11 @@ Creato apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -359,7 +375,7 @@ Finito apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -367,7 +383,7 @@ Stato apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -399,11 +415,11 @@ Dati storici del mercato apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -411,7 +427,7 @@ Visualizza i dati apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -419,7 +435,7 @@ Visualizza Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -427,7 +443,7 @@ Elimina il lavoro apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -443,7 +459,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -459,7 +475,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -499,7 +515,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -607,7 +623,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -631,7 +647,7 @@ Vuoi davvero eliminare questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -647,7 +663,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -691,7 +707,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 +719,7 @@ Inizia apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -735,11 +751,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 +775,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 @@ -839,15 +855,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -870,6 +886,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Rimani connesso @@ -963,15 +987,15 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -983,15 +1007,15 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1015,7 +1039,7 @@ Segnala un’anomalia dei dati apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1027,7 +1051,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 +1067,7 @@ Mostra tutti libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1055,7 +1079,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1063,11 +1087,11 @@ 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 - 385 + 384 @@ -1075,11 +1099,11 @@ 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 - 395 + 394 @@ -1087,11 +1111,11 @@ 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 - 419 + 416 @@ -1107,11 +1131,11 @@ 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 - 425 + 422 @@ -1123,11 +1147,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 +1163,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 +1199,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 +1222,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Il codice del buono è stato riscattato @@ -1231,11 +1263,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -1258,6 +1290,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista presentatore @@ -1274,12 +1314,20 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Locale Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1367,15 +1415,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1419,7 +1467,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1439,7 +1487,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -1487,11 +1535,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 +1703,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1669,10 +1717,6 @@ Overview Panoramica - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -1683,7 +1727,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1691,7 +1735,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -1711,7 +1755,7 @@ Mercati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -1719,7 +1763,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1838,6 +1882,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Analysis Analisi @@ -1855,7 +1907,7 @@ Cronologia degli investimenti apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1871,7 +1923,7 @@ In basso apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1931,7 +1983,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1955,7 +2007,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1978,6 +2030,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Quantità @@ -1991,11 +2051,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2007,7 +2067,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 @@ -2015,7 +2075,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2059,7 +2119,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2083,7 +2143,7 @@ Importazione dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2091,7 +2151,7 @@ L’importazione è stata completata apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2111,15 +2171,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,19 +2199,19 @@ Portafoglio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -2171,7 +2231,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -2223,11 +2283,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 @@ -2267,7 +2327,15 @@ Bozza libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -2275,7 +2343,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 +2407,7 @@ Variazione rispetto al massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2355,7 +2423,15 @@ dal massimo storico (ATH) libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -2387,7 +2463,7 @@ Questa funzionalità non è attualmente disponibile. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2395,11 +2471,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 +2483,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 +2503,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2499,7 +2575,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -2507,7 +2583,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2555,7 +2631,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2563,7 +2639,7 @@ annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -2579,7 +2655,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2603,7 +2679,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 +2687,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2619,7 +2695,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 +2703,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2635,7 +2711,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2671,11 +2747,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -2683,11 +2759,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 @@ -2755,7 +2831,7 @@ Importo totale apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -2763,7 +2839,7 @@ Evoluzione del portafoglio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2779,7 +2855,7 @@ Tasso di risparmio apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -2791,11 +2867,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2815,7 +2891,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2827,11 +2903,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2839,7 +2915,7 @@ Simbolo apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -2855,11 +2931,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2867,11 +2943,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 +2959,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2891,7 +2967,7 @@ Materia prima libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2903,7 +2979,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2911,7 +2987,7 @@ Reddito fisso libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2919,7 +2995,11 @@ Immobiliare libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2935,7 +3015,7 @@ Obbligazioni libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2943,7 +3023,7 @@ Criptovaluta libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2951,7 +3031,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2959,7 +3039,7 @@ Fondo comune di investimento libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2967,7 +3047,7 @@ Metalli preziosi libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2975,7 +3055,7 @@ Azione ordinaria privata libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2983,7 +3063,7 @@ Azione libs/ui/src/lib/i18n.ts - 62 + 64 @@ -2999,7 +3079,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3007,11 +3087,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 + 448 @@ -3027,15 +3111,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3047,7 +3131,7 @@ Nord America libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3055,7 +3139,7 @@ Africa libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3063,7 +3147,15 @@ Asia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3071,7 +3163,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3079,7 +3171,7 @@ If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -3087,7 +3179,7 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3095,7 +3187,7 @@ Sud America libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3103,7 +3195,7 @@ Sono supportati i seguenti formati di file: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3111,11 +3203,19 @@ Indietro apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -3139,7 +3239,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 @@ -3175,11 +3275,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3187,7 +3287,7 @@ Cronologia dei dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3203,7 +3303,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3215,7 +3315,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3231,7 +3331,7 @@ Convalida dei dati... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3239,11 +3339,11 @@ Importa apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3255,7 +3355,7 @@ Dati del mercato apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3303,7 +3403,7 @@ Carica i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3311,7 +3411,15 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3319,7 +3427,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 +3455,7 @@ Nucleo libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3355,7 +3463,7 @@ Sovvenzione libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3363,7 +3471,7 @@ Rischio più elevato libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3371,7 +3479,7 @@ Rischio inferiore libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3379,7 +3487,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3387,7 +3495,7 @@ Fondo pensione libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3403,7 +3511,7 @@ Satellite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3527,7 +3635,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 +3763,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 +3835,7 @@ Passa facilmente a Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3751,7 +3859,7 @@ Passa facilmente a Ghostfolio Premium o Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3759,7 +3867,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3803,7 +3911,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 @@ -3867,7 +3975,7 @@ By apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -3883,7 +3991,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3899,11 +4007,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3919,7 +4027,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 +4035,7 @@ Vuoi davvero eliminare questa piattaforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -3999,7 +4107,7 @@ Questa attività esiste già. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4031,7 +4139,7 @@ Seleziona i dividendi apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4039,7 +4147,7 @@ Seleziona le attività apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4063,7 +4171,7 @@ Serie attuale apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4071,7 +4179,7 @@ Serie più lunga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4079,7 +4187,7 @@ Mesi libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4087,7 +4195,7 @@ Anni libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4095,7 +4203,7 @@ Mese libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4103,7 +4211,7 @@ Anno libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4263,7 +4371,15 @@ Passività libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4274,12 +4390,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -4507,7 +4631,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4515,7 +4639,7 @@ Prezioso libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4523,7 +4647,7 @@ ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4531,7 +4655,7 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4547,7 +4671,7 @@ Preimpostato libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4563,15 +4687,7 @@ Asia e Pacifico libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Giappone - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4659,7 +4775,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4711,7 +4827,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4767,7 +4883,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 +4935,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 +5030,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. @@ -5034,6 +5158,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Cosa dicono i nostri utenti @@ -5372,28 +5504,16 @@ 325 - - Switzerland - Svizzera - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Globale apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5437,7 +5557,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5453,7 +5573,7 @@ Seleziona o trascina qui un file apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5489,11 +5609,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5517,7 +5637,7 @@ Sei sicuro di voler eliminare questo tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5617,7 +5737,7 @@ Profilo dell’asset apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5625,7 +5745,11 @@ Vuoi veramente eliminare il profilo di questo asset? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5636,6 +5760,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Aggiungi manualmente @@ -5657,7 +5789,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5665,7 +5797,7 @@ Ultimo massimo storico libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5673,11 +5805,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5709,7 +5841,7 @@ Ops, il trasferimento del saldo di cassa è fallito. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5717,7 +5849,7 @@ Paura estrema libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5725,7 +5857,7 @@ Avidità estrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5733,7 +5865,7 @@ Neutrale libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5744,6 +5876,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 +5897,7 @@ Trend a 50 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5765,7 +5905,7 @@ Trend a 200 giorni libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5773,7 +5913,7 @@ Saldi di cassa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5793,7 +5933,7 @@ Vuoi veramente elimnare il saldo di questo conto? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5809,7 +5949,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 +5957,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5857,15 +5997,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 @@ -5879,6 +6011,10 @@ Job Queue Coda Lavori + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5889,7 +6025,7 @@ I dati di mercato sono ritardati di apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5905,15 +6041,15 @@ 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 - 89 + 92 @@ -5929,7 +6065,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5969,7 +6105,7 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5977,11 +6113,11 @@ 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 - 377 + 376 @@ -5989,7 +6125,7 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5997,11 +6133,11 @@ 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 - 381 + 380 @@ -6009,7 +6145,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6045,7 +6181,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 @@ -6057,7 +6193,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6065,11 +6201,11 @@ 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 - 419 + 416 @@ -6085,7 +6221,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6097,7 +6233,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6150,7 +6286,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 +6313,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Attività @@ -6206,7 +6334,7 @@ Esegui il lavoro apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6214,7 +6342,7 @@ Priorità apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6222,7 +6350,7 @@ Questa azione non è permessa. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6230,7 +6358,7 @@ Liquidità libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6246,7 +6374,7 @@ Compra e vendi libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6278,7 +6406,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6326,7 +6454,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6350,31 +6478,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Elimina i profili - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Confermi di voler eliminare questi profili? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Ops! Impossibile eliminare i profili. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6406,7 +6510,7 @@ Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6414,7 +6518,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6422,7 +6526,7 @@ Budgeting apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6482,7 +6586,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6490,7 +6602,7 @@ Ufficio familiare apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6498,7 +6610,7 @@ Investitore apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6510,7 +6622,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6522,7 +6634,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6530,7 +6642,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6538,7 +6650,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6546,7 +6658,7 @@ Strumento apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6554,7 +6666,7 @@ Esperienza Utente apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6562,7 +6674,7 @@ Ricchezza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6570,39 +6682,7 @@ Gestione Patrimoniale apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6613,116 +6693,12 @@ 474 - - Canada - Canada + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6730,7 +6706,7 @@ Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6754,7 +6730,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 @@ -6762,7 +6738,7 @@ , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6782,7 +6758,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6826,7 +6802,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6834,7 +6810,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6854,7 +6830,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6862,7 +6838,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6874,7 +6850,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6890,7 +6866,7 @@ Si libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6906,7 +6882,7 @@ Stato del Portfolio apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6938,7 +6914,7 @@ Soglia Minima apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6946,7 +6922,7 @@ Soglia Massima apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7038,7 +7014,15 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7061,6 +7045,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted non può essere ospitato in proprio @@ -7158,15 +7150,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 @@ -7240,7 +7224,7 @@ Range soglia apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7372,7 +7356,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7396,7 +7380,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7420,11 +7404,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 +7448,7 @@ L’AI prompt è stato copiato negli appunti apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7480,7 +7464,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7488,7 +7472,7 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7496,7 +7480,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7504,7 +7488,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7512,7 +7496,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7520,7 +7504,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7528,7 +7512,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7536,7 +7520,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7544,7 +7528,7 @@ Apri Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7560,11 +7544,11 @@ Cambia libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7576,19 +7560,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7623,30 +7607,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 +7652,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 +7664,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 +7675,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Termini e condizioni @@ -7769,7 +7721,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 +7729,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 +7793,7 @@ qualcuno apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7825,7 @@ Vuoi davvero eliminare questo elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7833,7 @@ Esci apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8080,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8293,7 +8245,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 +8301,7 @@ Gestisci profilo risorsa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8357,7 +8309,7 @@ Investimenti alternativi libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8317,7 @@ Da collezione libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8325,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..2ac85bbf5 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -216,7 +216,7 @@ 거래에는 상당한 손실 위험이 따를 수 있습니다. 단기적으로 필요할 수 있는 자금의 투자는 권장되지 않습니다. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -252,12 +252,16 @@ 유형 apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -268,7 +272,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -340,7 +344,7 @@ 현금 잔액 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -364,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,11 +408,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 +440,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -456,7 +460,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -480,7 +484,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -492,15 +496,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -520,7 +524,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -544,7 +548,7 @@ 삭제 apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -568,7 +572,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -580,23 +584,31 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 Do you really want to delete this account? - 이 계정을 정말 삭제하시겠습니까? + 이 계좌를 정말 삭제하시겠습니까? libs/ui/src/lib/accounts-table/accounts-table.component.ts 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Asset Profile 자산 프로필 apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -604,11 +616,11 @@ 과거 시장 데이터 apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -616,7 +628,7 @@ 데이터 소스 apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -632,7 +644,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -640,7 +652,7 @@ 시도 횟수 apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -648,7 +660,11 @@ 생성됨 apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -656,7 +672,7 @@ 완료됨 apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -664,7 +680,7 @@ 상태 apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -684,7 +700,7 @@ 작업 삭제 apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -692,7 +708,7 @@ 데이터 보기 apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -700,7 +716,7 @@ 스택트레이스 보기 apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -708,7 +724,7 @@ 작업 삭제 apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -721,10 +737,10 @@ Find an account... - Find an account... + 계좌 검색... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -740,7 +756,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -768,7 +784,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 +796,7 @@ 국가 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -788,7 +804,7 @@ 섹터 정보 없는 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -796,7 +812,11 @@ 이 자산 프로필을 정말 삭제하시겠습니까? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -804,12 +824,12 @@ 다음 기준으로 필터... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 First Activity - 첫 활동 + 첫 거래 apps/client/src/app/components/admin-market-data/admin-market-data.html 147 @@ -824,12 +844,12 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 Activities Count - 활동 수 + 거래 건수 apps/client/src/app/components/admin-market-data/admin-market-data.html 156 @@ -899,6 +919,14 @@ 284 + + Healthcare + 헬스케어 + + libs/ui/src/lib/i18n.ts + 92 + + Refresh 새로고침 @@ -920,11 +948,11 @@ 가져오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -948,7 +976,7 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -956,7 +984,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -968,15 +996,15 @@ 섹터 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -988,15 +1016,15 @@ 국가 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1004,7 +1032,15 @@ 심볼 매핑 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + 기술 + + libs/ui/src/lib/i18n.ts + 96 @@ -1015,12 +1051,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration 스크래퍼 설정 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -1028,7 +1072,7 @@ 메모 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1055,6 +1099,14 @@ 16 + + Industrials + 산업재 + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually 수동 추가 @@ -1083,6 +1135,14 @@ 119 + + Consumer Cyclical + 임의소비재 + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? 이 쿠폰을 정말 삭제하시겠습니까? @@ -1188,7 +1248,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1220,11 +1280,11 @@ 링크 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1237,10 +1297,10 @@ Asset profile has been saved - Asset profile has been saved + 자산 정보가 저장되었습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1248,12 +1308,12 @@ 정말로 이 플랫폼을 삭제하시겠습니까? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 Explore - Explore + 둘러보기 apps/client/src/app/pages/resources/overview/resources-overview.component.html 11 @@ -1264,7 +1324,7 @@ 에 의해 apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1280,7 +1340,7 @@ 올해 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1328,7 +1388,7 @@ 이 태그를 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -1352,7 +1412,7 @@ 이 사용자를 정말로 삭제하시겠습니까? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1368,7 +1428,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1417,14 +1477,14 @@ Could not validate form - 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,19 +1508,19 @@ 포트폴리오 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1472,11 +1532,11 @@ 기준 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1492,7 +1552,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 +1564,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 +1588,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 @@ -1541,7 +1601,7 @@ Manage Activities - 활동 관리 + 거래 내역 관리 apps/client/src/app/components/home-holdings/home-holdings.html 64 @@ -1552,7 +1612,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 +1620,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1568,7 +1628,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 +1636,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1617,7 +1677,7 @@ Setup your accounts - 계정 설정 + 계좌 설정 apps/client/src/app/components/home-overview/home-overview.html 16 @@ -1633,7 +1693,7 @@ Capture your activities - 활동을 캡처하세요 + 거래를 기록하세요 apps/client/src/app/components/home-overview/home-overview.html 25 @@ -1641,7 +1701,7 @@ Record your investment activities to keep your portfolio up to date. - 투자 활동을 기록하여 포트폴리오를 최신 상태로 유지하세요. + 투자 거래 내역을 기록하여 포트폴리오를 최신 상태로 유지하세요. apps/client/src/app/components/home-overview/home-overview.html 27 @@ -1665,7 +1725,7 @@ Setup accounts - 계정 설정 + 계좌 설정 apps/client/src/app/components/home-overview/home-overview.html 49 @@ -1676,12 +1736,12 @@ 이번주 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 Add activity - 활동 추가 + 거래 추가 apps/client/src/app/components/home-overview/home-overview.html 57 @@ -1696,12 +1756,12 @@ 총액 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 Code - Code + 코드 apps/client/src/app/components/admin-overview/admin-overview.html 159 @@ -1712,7 +1772,7 @@ 저축률 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1764,15 +1824,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1795,6 +1855,14 @@ 46 + + Energy + 에너지 + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in 로그인 상태 유지 @@ -1952,11 +2020,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1964,7 +2032,7 @@ 데이터 결함 보고 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -2112,7 +2180,7 @@ 업그레이드 계획 apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2144,7 +2212,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -2152,11 +2220,11 @@ 연초 대비 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 - 385 + 384 @@ -2164,11 +2232,11 @@ 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 - 395 + 394 @@ -2176,16 +2244,16 @@ 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 - 419 + 416 Performance with currency effect - Performance with currency effect + 환율 효과 반영 성과 apps/client/src/app/pages/portfolio/analysis/analysis-page.html 134 @@ -2196,11 +2264,11 @@ 맥스 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 - 425 + 422 @@ -2243,6 +2311,14 @@ 174 + + Consumer Defensive + 필수소비재 + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed 쿠폰 코드가 사용되었습니다. @@ -2268,11 +2344,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -2315,6 +2391,14 @@ 279 + + Utilities + 유틸리티 + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View 발표자 보기 @@ -2339,6 +2423,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language 언어 @@ -2352,7 +2444,7 @@ 장소 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2416,7 +2508,7 @@ 이는 다음과 같이 증가할 것으로 예상된다. apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -2480,7 +2572,7 @@ 이 기능은 현재 사용할 수 없습니다. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2488,15 +2580,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 +2596,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 +2612,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 +2628,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 @@ -2633,7 +2725,7 @@ Accounts - 계정 + 계좌 apps/client/src/app/components/admin-platform/admin-platform.component.html 52 @@ -2644,15 +2736,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2676,12 +2768,12 @@ 죄송합니다. 현금 잔액 이체가 실패했습니다. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 Update account - 계정 업데이트 + 계좌 수정 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 8 @@ -2689,7 +2781,7 @@ Add account - 계정 추가 + 계좌 추가 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 10 @@ -2697,7 +2789,7 @@ Account ID - 계정 ID + 계좌 ID apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html 96 @@ -2732,11 +2824,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 +2840,7 @@ 시장 데이터 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -2786,10 +2878,6 @@ Overview 개요 - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -2800,7 +2888,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2808,7 +2896,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -2937,14 +3025,14 @@ Could not parse scraper configuration - 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 @@ -2965,7 +3053,7 @@ Duration - Duration + 기간 apps/client/src/app/components/admin-overview/admin-overview.html 172 @@ -3000,7 +3088,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -3053,7 +3141,7 @@ Multi-Accounts - 다중 계정 + 다중 계좌 apps/client/src/app/pages/features/features-page.html 127 @@ -3120,7 +3208,7 @@ 시작하기 apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3192,7 +3280,7 @@ 시장 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -3200,7 +3288,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3363,6 +3451,14 @@ 149 + + Basic Materials + 기초소재 + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. 익명으로 Ghostfolio를 사용하고 금융 데이터를 소유하세요. @@ -3483,6 +3579,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying 사용자의 이야기 @@ -3624,7 +3728,7 @@ 안전 인출률(SWR)은 다음과 같습니다. apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -3648,7 +3752,7 @@ 작업 ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -3677,7 +3781,7 @@ Activities - 활동 + 거래 내역 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html 84 @@ -3708,7 +3812,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3729,7 +3833,7 @@ Do you really want to delete these activities? - 정말로 이 활동을 삭제하시겠습니까? + 정말로 이 거래들을 삭제하시겠습니까? libs/ui/src/lib/activities-table/activities-table.component.ts 304 @@ -3737,7 +3841,7 @@ Update activity - 활동 업데이트 + 거래 수정 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 10 @@ -3757,7 +3861,7 @@ One-time fee, annual account fees - 일회성 수수료, 연간 계정 수수료 + 일회성 수수료, 연간 계좌 수수료 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 33 @@ -3812,15 +3916,23 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 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 @@ -3836,7 +3948,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 +3964,7 @@ 데이터 가져오는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3860,7 +3972,7 @@ 가져오기가 완료되었습니다. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3876,7 +3988,7 @@ 데이터 유효성을 검사하는 중... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3912,7 +4024,7 @@ 배당금 불러오기 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3920,7 +4032,7 @@ 여기에 파일을 선택하거나 드롭하세요. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -3928,7 +4040,7 @@ 다음 파일 형식이 지원됩니다. apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3936,15 +4048,15 @@ 배당금 선택 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 Select Activities - 활동 선택 + 거래 선택 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -3952,16 +4064,24 @@ 뒤쪽에 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 Allocations - 할당 + 자산 배분 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 4 @@ -4001,7 +4121,7 @@ By Asset Class - 자산 클래스별 + 자산군별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 83 @@ -4051,6 +4171,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis 분석에서 제외 @@ -4060,7 +4188,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4077,7 +4205,7 @@ Latest activities - 최신 활동 + 최신 거래 내역 apps/client/src/app/pages/public/public-page.html 210 @@ -4109,7 +4237,7 @@ By Account - 계정별 + 계좌별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 282 @@ -4176,11 +4304,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4188,7 +4316,7 @@ 연간 이자율 apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -4204,7 +4332,7 @@ 월간 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4212,7 +4340,15 @@ 매년 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -4228,7 +4364,7 @@ 하위 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4236,7 +4372,7 @@ 포트폴리오 진화 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4244,7 +4380,7 @@ 투자 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4252,7 +4388,7 @@ 현재 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4260,7 +4396,7 @@ 최장 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4268,7 +4404,7 @@ 배당 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4296,15 +4432,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 @@ -4365,7 +4501,7 @@ Unlimited Accounts - 무제한 계정 + 무제한 계좌 apps/client/src/app/pages/pricing/pricing-page.html 39 @@ -4468,7 +4604,7 @@ 플랜 갱신 apps/client/src/app/components/header/header.component.html - 191 + 195 apps/client/src/app/components/user-account-membership/user-account-membership.html @@ -4489,14 +4625,14 @@ Could not save asset profile - 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 @@ -4528,7 +4664,7 @@ 지속 가능한 퇴직 소득 apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -4665,11 +4801,11 @@ 매월 apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -4860,28 +4996,16 @@ 329 - - Switzerland - 스위스 - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global 글로벌 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4893,11 +5017,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 +5069,7 @@ 나의 고스트폴리오 apps/client/src/app/components/header/header.component.html - 276 + 280 apps/client/src/app/pages/user-account/user-account-page.routes.ts @@ -4978,15 +5102,15 @@ Do you really want to delete this account balance? - 정말로 이 계정 잔액을 삭제하시겠습니까? + 정말로 이 계좌 잔액을 삭제하시겠습니까? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 Export Activities - 수출 활동 + 거래 내역 내보내기 libs/ui/src/lib/activities-table/activities-table.component.html 64 @@ -5013,7 +5137,7 @@ 초안 libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -5034,7 +5158,7 @@ Do you really want to delete this activity? - 정말로 이 활동을 삭제하시겠습니까? + 정말로 이 거래를 삭제하시겠습니까? libs/ui/src/lib/activities-table/activities-table.component.ts 314 @@ -5057,7 +5181,7 @@ 50일 추세 libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5065,7 +5189,7 @@ 200일 추세 libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5073,7 +5197,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5081,15 +5205,15 @@ 마지막 역대 최고치 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 @@ -5105,15 +5229,23 @@ ATH에서 libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 Loan - Loan + 대출 libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5173,7 +5305,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5186,14 +5318,14 @@ Allocation - 배당 + 자산 배분 libs/ui/src/lib/accounts-table/accounts-table.component.html 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 117 + 122 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5209,23 +5341,23 @@ 모두 표시 libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 Account - 계정 + 계좌 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 86 libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5237,12 +5369,12 @@ 아시아·태평양 libs/ui/src/lib/i18n.ts - 5 + 7 Asset Class - 자산 클래스 + 자산군 apps/client/src/app/components/admin-market-data/admin-market-data.html 114 @@ -5253,7 +5385,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5265,16 +5397,16 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 Asset Sub Class - 자산 하위 클래스 + 하위 자산군 apps/client/src/app/components/admin-market-data/admin-market-data.html 123 @@ -5285,7 +5417,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5297,7 +5429,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5305,7 +5437,7 @@ 핵심 libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5313,7 +5445,7 @@ Ghostfolio 프리미엄 또는 Ghostfolio Open Source로 쉽게 전환하세요 libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5321,7 +5453,7 @@ Ghostfolio 프리미엄으로 쉽게 전환하세요 libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5337,7 +5469,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5345,7 +5477,7 @@ 승인하다 libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5353,7 +5485,7 @@ 더 높은 위험 libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5361,15 +5493,7 @@ 이 활동은 이미 존재합니다. libs/ui/src/lib/i18n.ts - 20 - - - - Japan - 일본 - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5377,7 +5501,7 @@ 위험 감소 libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5385,7 +5509,7 @@ libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5393,7 +5517,7 @@ 개월 libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5401,11 +5525,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 + 448 @@ -5413,15 +5541,15 @@ 프리셋 libs/ui/src/lib/i18n.ts - 26 + 28 No Activities - No Activities + 거래 내역 없음 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5429,12 +5557,12 @@ 퇴직금 libs/ui/src/lib/i18n.ts - 27 + 29 Everything in Basic, plus - Everything in Basic, plus + Basic의 모든 기능에 더해 apps/client/src/app/pages/pricing/pricing-page.html 199 @@ -5445,7 +5573,7 @@ 위성 libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5453,7 +5581,7 @@ 상징 apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -5469,11 +5597,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5481,11 +5609,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 +5621,7 @@ 년도 libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5513,7 +5641,7 @@ 연령 libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5533,23 +5661,23 @@ libs/ui/src/lib/i18n.ts - 36 + 38 Fee - 요금 + 수수료 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 255 libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5557,7 +5685,7 @@ 귀중한 libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5565,7 +5693,7 @@ 책임 libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5577,7 +5705,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5589,7 +5717,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5597,7 +5725,7 @@ 상품 libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5609,7 +5737,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5617,7 +5745,7 @@ 채권 libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5625,7 +5753,11 @@ 부동산 libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5641,7 +5773,7 @@ 노예 libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5649,7 +5781,7 @@ 암호화폐 libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5657,7 +5789,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5665,7 +5797,7 @@ 뮤추얼 펀드 libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5673,7 +5805,7 @@ 귀금속 libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5681,7 +5813,7 @@ 사모펀드 libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5689,7 +5821,7 @@ 재고 libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5697,7 +5829,7 @@ 아프리카 libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5705,7 +5837,15 @@ 아시아 libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + 커뮤니케이션 서비스 + + libs/ui/src/lib/i18n.ts + 87 @@ -5713,7 +5853,7 @@ 유럽 libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5721,7 +5861,7 @@ 북미 libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5729,7 +5869,7 @@ 오늘 퇴사하면 탈퇴 가능 apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -5737,7 +5877,7 @@ 오세아니아 libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5745,7 +5885,7 @@ 남아메리카 libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5753,7 +5893,7 @@ 극심한 공포 libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5761,7 +5901,7 @@ 극도의 탐욕 libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5769,7 +5909,7 @@ 중립적 libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5805,15 +5945,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5841,7 +5981,7 @@ 현재 시장가격은 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5849,7 +5989,7 @@ 시험 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5857,15 +5997,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 @@ -5903,6 +6035,10 @@ Job Queue 작업 대기열 + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5913,7 +6049,7 @@ 시장 데이터가 지연됩니다. apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5926,10 +6062,10 @@ Close Holding - 닫기 보유 + 보유 포지션 종료 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5953,15 +6089,15 @@ 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 - 89 + 92 @@ -5993,7 +6129,7 @@ 연초 현재 libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6001,7 +6137,7 @@ 이번주 현재까지 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -6009,7 +6145,7 @@ 월간 누계 libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -6017,11 +6153,11 @@ 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 - 381 + 380 @@ -6029,11 +6165,11 @@ 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 - 377 + 376 @@ -6069,7 +6205,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 @@ -6081,7 +6217,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6089,11 +6225,11 @@ 연령 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 - 419 + 416 @@ -6134,7 +6270,7 @@ 데이터 수집 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6143,10 +6279,10 @@ Find a holding... - Find a holding... + 보유 종목 검색... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6174,7 +6310,7 @@ 이런! 요청을 너무 많이 하시는 것 같습니다. 조금 천천히 해주세요. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6201,17 +6337,9 @@ 61 - - Indonesia - 인도네시아 공화국 - - libs/ui/src/lib/i18n.ts - 90 - - Activity - 활동 + 거래 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 227 @@ -6230,7 +6358,7 @@ 작업 실행 apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6238,7 +6366,7 @@ 이 작업은 허용되지 않습니다. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6246,7 +6374,7 @@ 우선 사항 apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6254,7 +6382,7 @@ 유동성 libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6262,12 +6390,12 @@ 구매 및 판매 libs/ui/src/lib/i18n.ts - 8 + 10 {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, 복수형, =1 {활동} 기타 {활동}} + {VAR_PLURAL, plural, =1 {거래} other {거래}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -6275,7 +6403,7 @@ Delete Activities - 활동 삭제 + 거래 삭제 libs/ui/src/lib/activities-table/activities-table.component.html 92 @@ -6307,10 +6435,10 @@ Jump to a page... - Jump to a page... + 페이지 이동... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6323,7 +6451,7 @@ Approximation based on the top holdings of each ETF - 각 ETF의 상위 보유량을 기준으로 한 근사치 + 각 ETF의 상위 보유 종목을 기준으로 한 근사치 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 334 @@ -6331,7 +6459,7 @@ By ETF Holding - ETF 홀딩으로 + ETF 보유 종목별 apps/client/src/app/pages/portfolio/allocations/allocations-page.html 327 @@ -6350,7 +6478,7 @@ 포함 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6369,36 +6497,12 @@ 179 - - Do you really want to delete these profiles? - 이 프로필을 정말로 삭제하시겠습니까? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Delete Profiles - 프로필 삭제 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Oops! Could not delete profiles. - 이런! 프로필을 삭제할 수 없습니다. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 - - Benchmarks 벤치마크 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -6430,7 +6534,7 @@ 재산 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6490,47 +6594,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 - 폴란드 + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. - libs/ui/src/lib/i18n.ts - 95 - - - - Italy - 이탈리아 - - libs/ui/src/lib/i18n.ts - 91 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6538,7 +6610,7 @@ 사용자 경험 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6546,7 +6618,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6554,7 +6626,7 @@ 도구 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6562,7 +6634,7 @@ 투자자 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6570,47 +6642,23 @@ 자산관리 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 100 + 103 View Holding - 보유보기 + 보유 종목 보기 libs/ui/src/lib/activities-table/activities-table.component.html 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 대안 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6618,7 +6666,7 @@ 패밀리오피스 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6630,7 +6678,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6638,31 +6686,7 @@ 소프트웨어 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 99 @@ -6670,15 +6694,7 @@ 예산 편성 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 - - - - Belgium - 벨기에 - - libs/ui/src/lib/i18n.ts - 81 + 88 @@ -6690,39 +6706,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 94 @@ -6730,23 +6714,15 @@ 은둔 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 - - - - Finland - 핀란드 - - libs/ui/src/lib/i18n.ts - 86 + 97 - - France - 프랑스 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - libs/ui/src/lib/i18n.ts - 87 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6754,7 +6730,7 @@ 오류 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6766,7 +6742,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6810,7 +6786,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6826,7 +6802,7 @@ libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6834,7 +6810,7 @@ , 귀하의 총 자산을 기준으로 apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6850,7 +6826,7 @@ 닫다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6870,7 +6846,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6878,7 +6854,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6890,7 +6866,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6906,7 +6882,7 @@ 이런! 액세스를 업데이트할 수 없습니다. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6922,7 +6898,7 @@ 임계값 최대 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -6946,7 +6922,7 @@ 포트폴리오 스냅샷 apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6954,7 +6930,7 @@ 임계값 최소 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6967,7 +6943,7 @@ Performance with currency effect Performance - 환율 효과가 있는 실적 실적 + 환율 효과 반영 수익률 수익률 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 83 @@ -6983,7 +6959,7 @@ Change with currency effect Change - 통화 효과로 변경 변경 + 환율 효과 반영 변동 변동 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 63 @@ -7007,7 +6983,7 @@ has been copied to the clipboard - has been copied to the clipboard + 가 클립보드에 복사되었습니다. apps/client/src/app/components/admin-overview/admin-overview.component.ts 378 @@ -7054,7 +7030,15 @@ , 가정 apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + 금융 서비스 + + libs/ui/src/lib/i18n.ts + 91 @@ -7077,6 +7061,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted 은(는) 자체 호스팅할 수 없습니다. @@ -7161,14 +7153,6 @@ 40 - - Ukraine - 우크라이나 - - libs/ui/src/lib/i18n.ts - 101 - - Set API key API 키 설정 @@ -7182,7 +7166,7 @@ 50개 이상의 거래소에서 80,000개 이상의 티커에 접근하세요 libs/ui/src/lib/i18n.ts - 25 + 27 @@ -7264,7 +7248,7 @@ 임계값 범위 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7396,7 +7380,7 @@ 구하다 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7420,7 +7404,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7460,11 +7444,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 @@ -7477,7 +7461,7 @@ Change with currency effect - Change with currency effect + 환율 효과 반영 변동 apps/client/src/app/pages/portfolio/analysis/analysis-page.html 115 @@ -7488,7 +7472,7 @@ AI 프롬프트가 클립보드에 복사되었습니다. apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7504,7 +7488,7 @@ 방법 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7512,7 +7496,7 @@ 기본 시장 가격 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7520,7 +7504,7 @@ 선택자 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7528,7 +7512,7 @@ 즉각적인 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7536,7 +7520,7 @@ 게으른 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7544,7 +7528,7 @@ HTTP 요청 헤더 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7552,7 +7536,7 @@ 실시간 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7560,7 +7544,7 @@ 하루의 끝 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7568,7 +7552,7 @@ 오픈 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7581,38 +7565,38 @@ Change - 변화 + 변동 libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7631,38 +7615,14 @@ 67 - - Singapore - 싱가포르 - - libs/ui/src/lib/i18n.ts - 97 - - Total amount - Total amount + 총액 apps/client/src/app/pages/portfolio/analysis/analysis-page.html 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 +7676,7 @@ 정말로 이 사용자에 대한 새 보안 토큰을 생성하시겠습니까? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7724,11 +7684,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 +7699,6 @@ 239 - - United Kingdom - 영국 - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service 이용약관 @@ -7793,7 +7745,7 @@ ()은(는) 이미 사용 중입니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7801,7 +7753,7 @@ ()로 업데이트하는 동안 오류가 발생했습니다. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7830,7 +7782,7 @@ Performance Calculation - 성능 계산 + 성과 계산 apps/client/src/app/components/user-account-settings/user-account-settings.html 31 @@ -7841,7 +7793,7 @@ 누구 apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7825,7 @@ 이 항목을 정말로 삭제하시겠습니까? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7833,7 @@ 로그아웃 apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -7935,7 +7887,7 @@ No emergency fund has been set up - 비상금은 마련되지 않았습니다 + 비상금이 설정되지 않았습니다. apps/client/src/app/pages/i18n/i18n-page.html 147 @@ -7943,7 +7895,7 @@ An emergency fund has been set up - 비상금이 마련됐어요 + 비상금이 설정되어 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 150 @@ -7951,7 +7903,7 @@ Fee Ratio - Fee Ratio + 수수료 비율 apps/client/src/app/pages/i18n/i18n-page.html 152 @@ -7959,7 +7911,7 @@ The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) - The fees do exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) + 수수료가 총 투자 금액의 ${thresholdMax}%를 초과합니다 (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 154 @@ -7967,7 +7919,7 @@ The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) - The fees do not exceed ${thresholdMax}% of your total investment volume (${feeRatio}%) + 수수료가 총 투자 금액의 ${thresholdMax}%를 초과하지 않습니다 (${feeRatio}%) apps/client/src/app/pages/i18n/i18n-page.html 158 @@ -8007,7 +7959,7 @@ Single Account - 단일 계정 + 단일 계좌 apps/client/src/app/pages/i18n/i18n-page.html 28 @@ -8015,7 +7967,7 @@ Your net worth is managed by a single account - 귀하의 순자산은 단일 계정으로 관리됩니다 + 귀하의 순자산은 단일 계좌로 관리됩니다 apps/client/src/app/pages/i18n/i18n-page.html 30 @@ -8023,7 +7975,7 @@ Your net worth is managed by ${accountsLength} accounts - 귀하의 순자산은 ${accountsLength} 계정에서 관리됩니다. + 귀하의 순자산은 ${accountsLength}개의 계좌에서 관리됩니다. apps/client/src/app/pages/i18n/i18n-page.html 36 @@ -8128,7 +8080,7 @@ 이번 달 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8149,7 +8101,7 @@ Over ${thresholdMax}% of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) - 현재 투자의 ${thresholdMax}% 이상이 ${maxAccountName} (${maxInvestmentRatio}%)에 있습니다. + 현재 투자 자산의 ${thresholdMax}% 이상이 ${maxAccountName} 계좌 (${maxInvestmentRatio}%)에 집중되어 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 17 @@ -8157,7 +8109,7 @@ The major part of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}% - 현재 투자의 주요 부분은 ${maxAccountName} (${maxInvestmentRatio}%)이며 ${thresholdMax}%를 초과하지 않습니다. + 현재 투자 자산의 주요 부분이 ${maxAccountName} 계좌 (${maxInvestmentRatio}%)에 있으며, 설정된 기준(${thresholdMax}%)을 초과하지 않습니다. apps/client/src/app/pages/i18n/i18n-page.html 24 @@ -8173,7 +8125,7 @@ The equity contribution of your current investment (${equityValueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 지분 기여도(${equityValueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 주식 비중(${equityValueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 43 @@ -8181,7 +8133,7 @@ The equity contribution of your current investment (${equityValueRatio}%) is below ${thresholdMin}% - 현재 투자의 지분 기여도(${equityValueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 주식 비중(${equityValueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 47 @@ -8189,7 +8141,7 @@ The equity contribution of your current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 지분 기여도(${equityValueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 주식 비중(${equityValueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 51 @@ -8205,7 +8157,7 @@ The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 고정 수입 기여도(${fixedIncomeValueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 채권 비중(${fixedIncomeValueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 57 @@ -8213,7 +8165,7 @@ The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}% - 현재 투자의 고정 수입 기여도(${fixedIncomeValueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 채권 비중(${fixedIncomeValueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 61 @@ -8221,7 +8173,7 @@ The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 고정 수입 기여도(${fixedIncomeValueRatio}%)가 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 채권 비중(${fixedIncomeValueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 66 @@ -8237,7 +8189,7 @@ The major part of your current investment is not in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) - 현재 투자의 주요 부분이 기본 통화(${baseCurrency}의 ${baseCurrencyValueRatio}%)로 되어 있지 않습니다. + 현재 투자 자산의 상당 부분이 기준 통화가 아닙니다 (${baseCurrency} 비중: ${baseCurrencyValueRatio}%). apps/client/src/app/pages/i18n/i18n-page.html 88 @@ -8245,7 +8197,7 @@ The major part of your current investment is in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) - 현재 투자의 주요 부분은 기본 통화(${baseCurrency}의 ${baseCurrencyValueRatio}%)입니다. + 현재 투자 자산의 주요 부분이 기준 통화로 되어 있습니다 (${baseCurrency} 비중: ${baseCurrencyValueRatio}%). apps/client/src/app/pages/i18n/i18n-page.html 92 @@ -8261,7 +8213,7 @@ Over ${thresholdMax}% of your current investment is in ${currency} (${maxValueRatio}%) - 현재 투자의 ${thresholdMax}% 이상이 ${currency}(${maxValueRatio}%)에 있습니다. + 현재 투자 자산의 ${thresholdMax}% 이상이 ${currency} 통화 (${maxValueRatio}%)에 집중되어 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 97 @@ -8269,7 +8221,7 @@ The major part of your current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}% - 현재 투자의 주요 부분은 ${currency} (${maxValueRatio}%)이며 ${thresholdMax}%를 초과하지 않습니다. + 현재 투자 자산의 상당 부분이 ${currency} 통화 (${maxValueRatio}%)로 되어 있으며, 설정된 기준(${thresholdMax}%)을 초과하지 않습니다. apps/client/src/app/pages/i18n/i18n-page.html 101 @@ -8309,7 +8261,7 @@ 정말로 새로운 보안 토큰을 생성하시겠습니까? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8338,7 +8290,7 @@ - + apps/client/src/app/components/admin-users/admin-users.html 35 @@ -8349,7 +8301,7 @@ 자산 프로필 관리 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8357,7 +8309,7 @@ 대체투자 libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8317,7 @@ 소장용 libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8325,7 @@ 평균단가 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8390,7 +8342,7 @@ Account Cluster Risks - 계정 클러스터 위험 + 계좌 집중 위험 apps/client/src/app/pages/i18n/i18n-page.html 14 @@ -8398,7 +8350,7 @@ Asset Class Cluster Risks - 자산 클래스 클러스터 위험 + 자산군 집중 위험 apps/client/src/app/pages/i18n/i18n-page.html 39 @@ -8406,7 +8358,7 @@ Currency Cluster Risks - 통화 클러스터 위험 + 통화 집중 위험 apps/client/src/app/pages/i18n/i18n-page.html 83 @@ -8414,7 +8366,7 @@ Economic Market Cluster Risks - 경제 시장 클러스터 위험 + 경제 시장 집중 위험 apps/client/src/app/pages/i18n/i18n-page.html 106 @@ -8422,7 +8374,7 @@ Emergency Fund - 비상자금 + 비상금 apps/client/src/app/pages/i18n/i18n-page.html 144 @@ -8454,7 +8406,7 @@ Your buying power is below ${thresholdMin} ${baseCurrency} - 귀하의 구매력은 ${thresholdMin} ${baseCurrency} 미만입니다. + 매수 가능 금액이 ${thresholdMin} ${baseCurrency} 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 73 @@ -8462,7 +8414,7 @@ Your buying power is 0 ${baseCurrency} - 귀하의 구매력은 0입니다 ${baseCurrency} + 매수 가능 금액이 0 ${baseCurrency}입니다. apps/client/src/app/pages/i18n/i18n-page.html 77 @@ -8478,7 +8430,7 @@ Regional Market Cluster Risks - 지역 시장 클러스터 위험 + 지역 시장 집중 위험 apps/client/src/app/pages/i18n/i18n-page.html 163 @@ -8494,7 +8446,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 선진국 시장 기여도(${개발된MarketsValueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 선진국 시장 비중(${developedMarketsValueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 112 @@ -8502,7 +8454,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% - 현재 투자의 선진국 시장 기여도(${개발된MarketsValueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 선진국 시장 비중(${developedMarketsValueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 117 @@ -8510,7 +8462,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 선진국 시장 기여도(${개발된MarketsValueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 선진국 시장 비중(${developedMarketsValueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 122 @@ -8526,7 +8478,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 신흥 시장 기여도(${emergingMarketsValueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 신흥국 시장 비중(${emergingMarketsValueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 130 @@ -8534,7 +8486,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% - 현재 투자의 신흥 시장 기여도(${emergingMarketsValueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 신흥국 시장 비중(${emergingMarketsValueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 135 @@ -8542,7 +8494,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 신흥 시장 기여도(${emergingMarketsValueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 신흥국 시장 비중(${emergingMarketsValueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 140 @@ -8550,7 +8502,7 @@ No accounts have been set up - 설정된 계정이 없습니다. + 설정된 계좌가 없습니다. apps/client/src/app/pages/i18n/i18n-page.html 21 @@ -8558,7 +8510,7 @@ Your net worth is managed by 0 accounts - 귀하의 순자산은 0개의 계정에서 관리됩니다. + 귀하의 순자산은 0개의 계좌에서 관리됩니다. apps/client/src/app/pages/i18n/i18n-page.html 33 @@ -8574,7 +8526,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 아시아 태평양 시장 비중(${valueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 167 @@ -8582,7 +8534,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - 현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 아시아 태평양 시장 비중(${valueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 171 @@ -8590,7 +8542,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 아시아 태평양 시장 비중(${valueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 175 @@ -8606,7 +8558,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 신흥국 시장 비중(${valueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 183 @@ -8614,7 +8566,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - 현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 신흥국 시장 비중(${valueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 187 @@ -8622,7 +8574,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 신흥국 시장 비중(${valueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 191 @@ -8638,7 +8590,7 @@ The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 유럽 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 유럽 시장 비중(${valueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 197 @@ -8646,7 +8598,7 @@ The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - 현재 투자의 유럽 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 유럽 시장 비중(${valueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 201 @@ -8654,7 +8606,7 @@ The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 유럽 시장 기여도(${valueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 유럽 시장 비중(${valueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 205 @@ -8670,7 +8622,7 @@ The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 일본 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 일본 시장 비중(${valueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 211 @@ -8678,7 +8630,7 @@ The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - 현재 투자의 일본 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 일본 시장 비중(${valueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 215 @@ -8686,7 +8638,7 @@ The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 일본 시장 기여도(${valueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 일본 시장 비중(${valueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 219 @@ -8702,7 +8654,7 @@ The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - 현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + 현재 투자 자산 중 북미 시장 비중(${valueRatio}%)이 ${thresholdMax}%를 초과합니다. apps/client/src/app/pages/i18n/i18n-page.html 225 @@ -8710,7 +8662,7 @@ The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - 현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + 현재 투자 자산 중 북미 시장 비중(${valueRatio}%)이 ${thresholdMin}% 미만입니다. apps/client/src/app/pages/i18n/i18n-page.html 229 @@ -8718,7 +8670,7 @@ The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - 현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + 현재 투자 자산 중 북미 시장 비중(${valueRatio}%)이 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. apps/client/src/app/pages/i18n/i18n-page.html 233 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b33aee404..b7f163afe 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -26,7 +26,7 @@ Het risico op verlies bij handelen kan aanzienlijk zijn. Het is niet aan te raden om geld te investeren dat je misschien op korte termijn nodig heeft. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -50,12 +50,16 @@ Type apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -66,7 +70,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -110,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -150,11 +154,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 @@ -194,7 +198,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -206,15 +210,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -234,7 +238,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -258,7 +262,7 @@ Verwijderen apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -282,7 +286,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -294,7 +298,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -305,12 +309,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Delete Jobs Taken verwijderen apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -318,7 +330,7 @@ Gegevensbron apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -334,7 +346,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -342,7 +354,7 @@ Pogingen apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -350,7 +362,11 @@ Aangemaakt apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -358,7 +374,7 @@ Voltooid apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -366,7 +382,7 @@ Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -398,11 +414,11 @@ Historische marktgegevens apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -410,7 +426,7 @@ Bekijk gegevens apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -418,7 +434,7 @@ Bekijk Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -426,7 +442,7 @@ Taak verwijderen apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -442,7 +458,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -458,7 +474,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -498,7 +514,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -606,7 +622,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -630,7 +646,7 @@ Wilt je deze gebruiker echt verwijderen? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -646,7 +662,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -690,7 +706,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 +718,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 +750,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 +774,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 @@ -838,15 +854,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -869,6 +885,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Aangemeld blijven @@ -962,15 +986,15 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -982,15 +1006,15 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1014,7 +1038,7 @@ Gegevensstoring melden apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1026,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 @@ -1042,7 +1066,7 @@ Toon alle libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1054,7 +1078,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1062,11 +1086,11 @@ 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 - 385 + 384 @@ -1074,11 +1098,11 @@ 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 - 395 + 394 @@ -1086,11 +1110,11 @@ 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 - 419 + 416 @@ -1106,11 +1130,11 @@ 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 - 425 + 422 @@ -1122,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 @@ -1138,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 @@ -1174,7 +1198,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 +1221,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Je couponcode is ingewisseld @@ -1230,11 +1262,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -1257,6 +1289,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Presentatie weergave @@ -1273,12 +1313,20 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Locale Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1366,15 +1414,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1418,7 +1466,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1438,7 +1486,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -1486,11 +1534,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 +1702,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1668,10 +1716,6 @@ Overview Overzicht - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -1682,7 +1726,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1690,7 +1734,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -1710,7 +1754,7 @@ Markten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -1718,7 +1762,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -1837,6 +1881,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Analysis Analyse @@ -1854,7 +1906,7 @@ Tijdlijn investeringen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -1870,7 +1922,7 @@ Verliezers apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -1930,7 +1982,7 @@ Huidige week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1954,7 +2006,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -1977,6 +2029,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Quantity Hoeveelheid @@ -1990,11 +2050,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -2006,7 +2066,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 @@ -2014,7 +2074,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2058,7 +2118,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2082,7 +2142,7 @@ Gegevens importeren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2090,7 +2150,7 @@ Importeren is voltooid apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2110,15 +2170,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,19 +2198,19 @@ Portefeuille apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -2170,7 +2230,7 @@ Duurzaam pensioeninkomen apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -2222,11 +2282,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 @@ -2266,7 +2326,15 @@ Concept libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -2274,7 +2342,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 +2406,7 @@ Verandering van Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2354,7 +2422,15 @@ van ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -2386,7 +2462,7 @@ Deze functie is momenteel niet beschikbaar. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2394,11 +2470,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 +2482,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 +2502,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2498,7 +2574,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -2506,7 +2582,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2554,7 +2630,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2562,7 +2638,7 @@ jaarlijkse rente apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -2578,7 +2654,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2602,7 +2678,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 +2686,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -2618,7 +2694,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 +2702,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2634,7 +2710,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -2670,11 +2746,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -2682,11 +2758,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 @@ -2754,7 +2830,7 @@ Totaalbedrag apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -2762,7 +2838,7 @@ Waardeontwikkeling van portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2778,7 +2854,7 @@ Spaarrente apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -2790,11 +2866,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2814,7 +2890,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2826,11 +2902,11 @@ libs/ui/src/lib/i18n.ts - 6 + 8 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html - 64 + 65 @@ -2838,7 +2914,7 @@ Symbool apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -2854,11 +2930,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2866,11 +2942,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 +2958,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2890,7 +2966,7 @@ Grondstof libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2902,7 +2978,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2910,7 +2986,7 @@ Vast inkomen libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2918,7 +2994,11 @@ Vastgoed libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2934,7 +3014,7 @@ Obligatie libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2942,7 +3022,7 @@ Cryptovaluta libs/ui/src/lib/i18n.ts - 56 + 58 @@ -2950,7 +3030,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -2958,7 +3038,7 @@ Beleggingsfonds libs/ui/src/lib/i18n.ts - 59 + 61 @@ -2966,7 +3046,7 @@ Edelmetaal libs/ui/src/lib/i18n.ts - 60 + 62 @@ -2974,7 +3054,7 @@ Private equity libs/ui/src/lib/i18n.ts - 61 + 63 @@ -2982,7 +3062,7 @@ Aandeel libs/ui/src/lib/i18n.ts - 62 + 64 @@ -2998,7 +3078,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -3006,11 +3086,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 + 448 @@ -3026,15 +3110,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3046,7 +3130,7 @@ Noord-Amerika libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3054,7 +3138,7 @@ Afrika libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3062,7 +3146,15 @@ Azië libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3070,7 +3162,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3078,7 +3170,7 @@ Als u vandaag met pensioen gaat, kunt u apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -3086,7 +3178,7 @@ Oceanië libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3094,7 +3186,7 @@ Zuid-Amerika libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3102,7 +3194,7 @@ De volgende bestandsformaten worden ondersteund: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3110,11 +3202,19 @@ Terug apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -3138,7 +3238,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 @@ -3174,11 +3274,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3186,7 +3286,7 @@ Tijdlijn dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3202,7 +3302,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3214,7 +3314,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3230,7 +3330,7 @@ Gegevens valideren... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3238,11 +3338,11 @@ Importeren apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3254,7 +3354,7 @@ Marktgegevens apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3302,7 +3402,7 @@ Laad dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3310,7 +3410,15 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3318,7 +3426,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 +3454,7 @@ Kern libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3354,7 +3462,7 @@ Toelage libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3362,7 +3470,7 @@ Hoger risico libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3370,7 +3478,7 @@ Lager risico libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3378,7 +3486,7 @@ Geen activiteiten apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3386,7 +3494,7 @@ Pensioen libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3402,7 +3510,7 @@ Satelliet libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3526,7 +3634,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 +3762,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 +3834,7 @@ Eenvoudig overstappen naar Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3750,7 +3858,7 @@ Eenvoudig overstappen naar Ghostfolio Premium of Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3758,7 +3866,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3802,7 +3910,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 @@ -3866,7 +3974,7 @@ Tegen apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -3882,7 +3990,7 @@ Huidig jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3898,11 +4006,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3918,7 +4026,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 +4034,7 @@ Wil je dit platform echt verwijderen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -3998,7 +4106,7 @@ Deze activiteit bestaat al. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4030,7 +4138,7 @@ Selecteer dividenden apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4038,7 +4146,7 @@ Selecteer activiteiten apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4062,7 +4170,7 @@ Huidige reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4070,7 +4178,7 @@ Langste reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4078,7 +4186,7 @@ Maanden libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4086,7 +4194,7 @@ Jaren libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4094,7 +4202,7 @@ Maand libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4102,7 +4210,7 @@ Jaar libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4262,7 +4370,15 @@ Verplichtingen libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4273,12 +4389,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -4506,7 +4630,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4514,7 +4638,7 @@ Waardevol libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4522,7 +4646,7 @@ ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4530,7 +4654,7 @@ ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4546,7 +4670,7 @@ Voorinstelling libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4562,15 +4686,7 @@ Azië en de Stille Oceaan libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japan - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4658,7 +4774,7 @@ zal dit naar verwachting stijgen tot apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4710,7 +4826,7 @@ Opdracht ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4766,7 +4882,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 +4934,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 +5029,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. @@ -5033,6 +5157,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Wat onze gebruikers zeggen @@ -5371,28 +5503,16 @@ 325 - - Switzerland - Zwitserland - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Wereldwijd apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5436,7 +5556,7 @@ en een veilige opnameratio (SWR) van apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5452,7 +5572,7 @@ Kies of sleep bestand hier apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5488,11 +5608,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5636,7 @@ Weet u zetker dat u dit label wilt verwijderen? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5616,7 +5736,7 @@ Bezittingen Profiel apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5624,7 +5744,11 @@ 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 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5635,6 +5759,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Voeg Handmatig Toe @@ -5656,7 +5788,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5664,7 +5796,7 @@ Laatste Recordhoogte libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5672,11 +5804,11 @@ per maand apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5708,7 +5840,7 @@ Oeps, geldoverdracht is mislukt. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5848,7 @@ Extreme Angst libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5856,7 @@ Extreme Hebzucht libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5864,7 @@ Neutraal libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5875,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 +5896,7 @@ 50-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5904,7 @@ 200-Daagse Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5912,7 @@ Contant Saldo apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5792,7 +5932,7 @@ Wilt u dit rekeningsaldo echt verwijderen? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5808,7 +5948,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 +5956,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5856,15 +5996,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 @@ -5878,6 +6010,10 @@ Job Queue Opdracht Wachtrij + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5888,7 +6024,7 @@ Markt data is vertraagd voor apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,15 +6040,15 @@ 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 - 89 + 92 @@ -5928,7 +6064,7 @@ Sluit Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5968,7 +6104,7 @@ Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5976,11 +6112,11 @@ 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 - 377 + 376 @@ -5988,7 +6124,7 @@ Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5996,11 +6132,11 @@ 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 - 381 + 380 @@ -6008,7 +6144,7 @@ Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6044,7 +6180,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 @@ -6056,7 +6192,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6064,11 +6200,11 @@ 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 - 419 + 416 @@ -6084,7 +6220,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6096,7 +6232,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6149,7 +6285,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 +6312,6 @@ 62 - - Indonesia - Indonesië - - libs/ui/src/lib/i18n.ts - 90 - - Activity Activiteit @@ -6205,7 +6333,7 @@ Opdracht Uitvoeren apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6213,7 +6341,7 @@ Prioriteit apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6221,7 +6349,7 @@ Deze actie is niet toegestaan. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6357,7 @@ Liquiditeit libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6373,7 @@ Aan- en Verkoop libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6277,7 +6405,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6325,7 +6453,7 @@ Opnemen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6349,31 +6477,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Verwijder Profielen - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Wilt u deze profielen echt verwijderen? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Oeps! Verwijderen van de profielen is mislukt. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6405,7 +6509,7 @@ Alternatief apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6413,7 +6517,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6421,7 +6525,7 @@ Budgetteren apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6481,7 +6585,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6489,7 +6601,7 @@ Familiekantoor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6497,7 +6609,7 @@ Investeerder apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6509,7 +6621,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6521,7 +6633,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6529,7 +6641,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6537,7 +6649,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6545,7 +6657,7 @@ Hulpmiddel apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6553,7 +6665,7 @@ Gebruikers Ervaring apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6561,7 +6673,7 @@ Vermogen apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6569,39 +6681,7 @@ Vermogensbeheer apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6612,116 +6692,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 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6729,7 +6705,7 @@ Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6729,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 @@ -6761,7 +6737,7 @@ opnemen, dit is gebaseerd op uw totale vermogen van apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6781,7 +6757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6801,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6809,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6853,7 +6829,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6861,7 +6837,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6873,7 +6849,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6865,7 @@ Ja libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6905,7 +6881,7 @@ Portfolio Momentopname apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6937,7 +6913,7 @@ Drempelwaarde Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6945,7 +6921,7 @@ Drempelwaarde Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7037,7 +7013,15 @@ , uitgaande van apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7060,6 +7044,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted kan niet zelf gehost worden @@ -7157,15 +7149,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 @@ -7239,7 +7223,7 @@ Drempebereik apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7371,7 +7355,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7395,7 +7379,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7419,11 +7403,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 +7447,7 @@ AI-prompt is naar het klembord gekopieerd apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7463,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7471,7 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7479,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7503,7 +7487,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7511,7 +7495,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,7 +7511,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 +7519,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7527,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,11 +7543,11 @@ Aanpassen libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7575,19 +7559,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7651,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 +7663,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 +7674,6 @@ 239 - - United Kingdom - Verenigd Koninkrijk - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Servicevoorwaarden @@ -7768,7 +7720,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 +7728,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 +7792,7 @@ iemand apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Wilt u dit item echt verwijderen? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Uitloggen apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,7 @@ Huidige maand apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8244,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 +8300,7 @@ Beheer activaprofiel apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Alternatieve belegging libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Verzamelobject libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Gemiddelde eenheidsprijs apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..b9621a202 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -215,7 +215,7 @@ Ryzyko strat na rynku może być znaczne. Nie jest zalecane inwestowanie pieniędzy, które mogą być potrzebne w krótkim okresie. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -251,12 +251,16 @@ Typ apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -267,7 +271,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -355,7 +359,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -395,11 +399,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 +431,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -447,7 +451,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -471,7 +475,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -483,15 +487,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -511,7 +515,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -535,7 +539,7 @@ Usuń apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -559,7 +563,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -571,7 +575,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -582,12 +586,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Asset Profile Profil Aktywów apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -595,11 +607,11 @@ Historyczne Dane Rynkowe apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -607,7 +619,7 @@ Źródło Danych apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -623,7 +635,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -631,7 +643,7 @@ Próby apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -639,7 +651,11 @@ Utworzono apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -647,7 +663,7 @@ Zakończono apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -655,7 +671,7 @@ Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -675,7 +691,7 @@ Usuń Zadania apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -683,7 +699,7 @@ Zobacz Dane apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -691,7 +707,7 @@ Wyświetl Stos Wywołań apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -699,7 +715,7 @@ Usuń Zadanie apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -715,7 +731,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -731,7 +747,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -759,7 +775,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 +787,7 @@ ETF-y bez Krajów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -779,7 +795,7 @@ ETF-y bez Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -787,7 +803,11 @@ Czy na pewno chcesz usunąć ten profil aktywów? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -795,7 +815,7 @@ Filtruj według... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -815,7 +835,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -874,6 +894,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh Odśwież @@ -887,11 +915,11 @@ Importuj apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -915,7 +943,7 @@ Kraj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -923,7 +951,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -935,15 +963,15 @@ Sektory apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -955,15 +983,15 @@ Kraje apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -971,7 +999,15 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -982,12 +1018,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -995,7 +1039,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1022,6 +1066,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Dodaj Ręcznie @@ -1050,6 +1102,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? @@ -1155,7 +1215,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1187,11 +1247,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1207,7 +1267,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 +1275,7 @@ Czy naprawdę chcesz usunąć tę platformę? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -1231,7 +1291,7 @@ Przez apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1247,7 +1307,7 @@ Obecny rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1295,7 +1355,7 @@ Czy naprawdę chcesz usunąć ten tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -1319,7 +1379,7 @@ Czy na pewno chcesz usunąć tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1335,7 +1395,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1387,11 +1447,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,19 +1475,19 @@ Portfel apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1439,11 +1499,11 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1459,7 +1519,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 +1531,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 +1555,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 +1579,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 +1587,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1535,7 +1595,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 +1603,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1643,7 +1703,7 @@ Obecny tydzień apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1663,7 +1723,7 @@ Całkowita Kwota apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -1679,7 +1739,7 @@ Stopa Oszczędności apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1731,15 +1791,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1762,6 +1822,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Pozostań zalogowany @@ -1919,11 +1987,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1931,7 +1999,7 @@ Zgłoś Błąd Danych apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -2079,7 +2147,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 @@ -2111,7 +2179,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -2119,11 +2187,11 @@ 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 - 385 + 384 @@ -2131,11 +2199,11 @@ 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 - 395 + 394 @@ -2143,11 +2211,11 @@ 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 - 419 + 416 @@ -2163,11 +2231,11 @@ 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 - 425 + 422 @@ -2210,6 +2278,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Kupon został zrealizowany @@ -2235,11 +2311,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -2282,6 +2358,14 @@ 279 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Widok Prezentera @@ -2306,6 +2390,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language Język @@ -2319,7 +2411,7 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2383,7 +2475,7 @@ prognozuje się wzrost tej kwoty do apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -2447,7 +2539,7 @@ Ta funkcja jest obecnie niedostępna. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2455,15 +2547,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 +2563,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 +2579,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 +2595,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 +2703,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2643,7 +2735,7 @@ Ups, transfer salda nie powiódł się. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2699,11 +2791,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 +2807,7 @@ Dane Rynkowe apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -2753,10 +2845,6 @@ Overview Przegląd - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -2767,7 +2855,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2775,7 +2863,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -2907,11 +2995,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 +3055,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -3087,7 +3175,7 @@ Rozpocznij apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3159,7 +3247,7 @@ Rynki apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -3167,7 +3255,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3330,8 +3418,16 @@ 149 - - Use Ghostfolio anonymously and own your financial data. + + 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. apps/client/src/app/pages/landing/landing-page.html @@ -3450,6 +3546,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Co mówią nasi użytkownicy @@ -3591,7 +3695,7 @@ oraz bezpiecznej stopy wypłaty (SWR) na poziomie apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -3615,7 +3719,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -3675,7 +3779,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3779,7 +3883,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -3787,7 +3899,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 +3915,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 +3931,7 @@ Importowanie danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3827,7 +3939,7 @@ Importowanie zakończone apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3843,7 +3955,7 @@ Weryfikacja danych... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3879,7 +3991,7 @@ Załaduj dywidendy apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3887,7 +3999,7 @@ Wybierz lub przeciągnij plik tutaj apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -3895,7 +4007,7 @@ Obsługiwane są następujące formaty plików: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3903,7 +4015,7 @@ Wybierz dywidendy apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -3911,7 +4023,7 @@ Wybór działań apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -3919,11 +4031,19 @@ Wróc apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -4018,6 +4138,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis Wyklucz z analizy @@ -4027,7 +4155,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4143,11 +4271,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4155,7 +4283,7 @@ rocznej stopy zwrotu apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -4171,7 +4299,7 @@ Miesięcznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4179,7 +4307,15 @@ Rocznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -4195,7 +4331,7 @@ Największy spadek apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4203,7 +4339,7 @@ Rozwój portfela apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4211,7 +4347,7 @@ Oś czasu inwestycji apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4219,7 +4355,7 @@ Obecna passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4227,7 +4363,7 @@ Najdłuższa passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4235,7 +4371,7 @@ Oś czasu dywidend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4263,15 +4399,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 +4571,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 +4595,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 @@ -4495,7 +4631,7 @@ Zrównoważony dochód na emeryturze apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -4632,11 +4768,11 @@ miesięcznie apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -4815,28 +4951,16 @@ 329 - - Switzerland - Szwajcaria - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Globalny apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4848,11 +4972,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 +5024,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 @@ -4960,7 +5084,7 @@ Przygotuj Wstępną Wersję libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -5004,7 +5128,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5012,7 +5136,7 @@ Ostatni Najwyższy Punkt w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5020,7 +5144,7 @@ Zmiana od Najwyższego Punktu w Historii libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5036,7 +5160,15 @@ od ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -5044,7 +5176,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5104,7 +5236,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5124,7 +5256,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 +5272,7 @@ Pokaż wszystko libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5152,11 +5284,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5168,7 +5300,7 @@ Azja-Pacyfik libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5184,7 +5316,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5196,11 +5328,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 +5348,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5228,7 +5360,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5236,7 +5368,7 @@ Główny libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5244,7 +5376,7 @@ Przełącz się z łatwością na Ghostfolio Premium lub Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5252,7 +5384,7 @@ Przełącz się z łatwością na Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5268,7 +5400,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5276,7 +5408,7 @@ Dotacja libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5284,7 +5416,7 @@ Wyższe Ryzyko libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5292,15 +5424,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 +5432,7 @@ Niższe Ryzyko libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5316,7 +5440,7 @@ Miesiąc libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5324,7 +5448,7 @@ Miesiące libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5332,11 +5456,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 + 448 @@ -5344,7 +5472,7 @@ Wstępnie ustawione libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5352,7 +5480,7 @@ Brak transakcji apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5360,7 +5488,7 @@ Świadczenia Emerytalne libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5376,7 +5504,7 @@ Satelita libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5384,7 +5512,7 @@ Symbol apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -5400,11 +5528,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5412,11 +5540,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 +5552,7 @@ Rok libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5444,7 +5572,7 @@ Lata libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5464,7 +5592,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5476,11 +5604,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5488,7 +5616,7 @@ Kosztowności libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5496,7 +5624,7 @@ Zobowiązanie libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5508,7 +5636,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5520,7 +5648,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5528,7 +5656,7 @@ Towar libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5540,7 +5668,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5548,7 +5676,7 @@ Stały Dochód libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5556,7 +5684,11 @@ Nieruchomość libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5572,7 +5704,7 @@ Obligacja libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5580,7 +5712,7 @@ Kryptowaluta libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5588,7 +5720,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5596,7 +5728,7 @@ Fundusz Wzajemny libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5604,7 +5736,7 @@ Metal Szlachetny libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5612,7 +5744,7 @@ Prywatny Kapitał libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5620,7 +5752,7 @@ Akcje libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5628,7 +5760,7 @@ Afryka libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5636,7 +5768,15 @@ Azja libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5644,7 +5784,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5652,7 +5792,7 @@ Ameryka Północna libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5660,7 +5800,7 @@ Gdybyś przeszedł na emeryturę dziś, mógłbyś wypłacać apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -5668,7 +5808,7 @@ Oceania libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5676,7 +5816,7 @@ Ameryka Południowa libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5684,7 +5824,7 @@ Skrajny Strach libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5692,7 +5832,7 @@ Skrajna Zachłanność libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5700,7 +5840,7 @@ Neutralny libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5736,15 +5876,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5756,7 +5896,7 @@ 50-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5904,7 @@ 200-Dniowy Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5912,7 @@ Salda Gotówkowe apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5792,7 +5932,7 @@ Czy na pewno chcesz usunąć saldo tego konta? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5808,7 +5948,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 +5956,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5856,15 +5996,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 @@ -5878,6 +6010,10 @@ Job Queue Kolejka Zadań + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5888,7 +6024,7 @@ Dane rynkowe są opóźnione o apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,15 +6040,15 @@ 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 - 89 + 92 @@ -5928,7 +6064,7 @@ Zamknij pozycję apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5968,7 +6104,7 @@ Dotychczasowy tydzień libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5976,11 +6112,11 @@ 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 - 377 + 376 @@ -5988,7 +6124,7 @@ Od początku miesiąca libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5996,11 +6132,11 @@ 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 - 381 + 380 @@ -6008,7 +6144,7 @@ Od początku roku libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6044,7 +6180,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 @@ -6056,7 +6192,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6064,11 +6200,11 @@ 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 - 419 + 416 @@ -6084,7 +6220,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6096,7 +6232,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6149,7 +6285,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 +6312,6 @@ 62 - - Indonesia - Indonezja - - libs/ui/src/lib/i18n.ts - 90 - - Activity Aktywność @@ -6205,7 +6333,7 @@ Wykonaj Zadanie apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6213,7 +6341,7 @@ Priorytet apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6221,7 +6349,7 @@ To działanie jest niedozwolone. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6357,7 @@ Płynność środków finansowych libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6373,7 @@ Kupno i Sprzedaż libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6277,7 +6405,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6325,7 +6453,7 @@ Uwzględnij w apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6349,31 +6477,7 @@ Punkty Odniesienia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Usuń Profile - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Czy na pewno chcesz usunąć te profile? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Ups! Nie udało się usunąć profili. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6405,7 +6509,7 @@ Alternatywa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6413,7 +6517,7 @@ Aplikacja apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6421,7 +6525,7 @@ Budżetowanie apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6481,7 +6585,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6489,7 +6601,7 @@ Biuro Rodzinne apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6497,7 +6609,7 @@ Inwestor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6509,7 +6621,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6521,7 +6633,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6529,7 +6641,7 @@ Prywatność apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6537,7 +6649,7 @@ Oprogramowanie apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6545,7 +6657,7 @@ Narzędzie apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6553,7 +6665,7 @@ Doświadczenie Użytkownika apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6561,7 +6673,7 @@ Majątek apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6569,39 +6681,7 @@ Zarządzanie Majątkiem apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6612,116 +6692,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 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - libs/ui/src/lib/i18n.ts - 103 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6729,7 +6705,7 @@ Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6729,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 @@ -6761,7 +6737,7 @@ , na podstawie całkowitej wartości aktywów wynoszącej apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6781,7 +6757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6801,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6809,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6853,7 +6829,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6861,7 +6837,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6873,7 +6849,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6865,7 @@ Tak libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6905,7 +6881,7 @@ Przegląd portfela apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6937,7 +6913,7 @@ Próg minimalny apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6945,7 +6921,7 @@ Próg maksymalny apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7037,7 +7013,15 @@ , przyjmując apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7060,6 +7044,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted nie może być hostowany samodzielnie @@ -7157,15 +7149,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 @@ -7239,7 +7223,7 @@ Zakres progów apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7371,7 +7355,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7395,7 +7379,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7419,11 +7403,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 +7447,7 @@ Prompt AI został skopiowany do schowka apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7463,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7471,7 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7479,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7503,7 +7487,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7511,7 +7495,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,7 +7511,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7519,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7527,7 @@ Otwórz Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,11 +7543,11 @@ Zmiana libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7575,19 +7559,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7651,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 +7663,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 +7674,6 @@ 239 - - United Kingdom - Wielka Brytania - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Warunki świadczenia usług @@ -7768,7 +7720,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 +7728,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 +7792,7 @@ ktoś apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Czy na pewno chcesz usunąć ten element? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Wyloguj się apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,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 +8244,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 +8300,7 @@ Zarządzaj profilem aktywów apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Inwestycja alternatywna libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Kolekcjonerskie libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Średnia cena jednostkowa apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..eb4492290 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -6,7 +6,7 @@ O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -42,12 +42,16 @@ Tipo apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -58,7 +62,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -118,7 +122,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -158,11 +162,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 +194,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -210,7 +214,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -250,7 +254,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -262,15 +266,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -290,7 +294,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -314,7 +318,7 @@ Eliminar apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -338,7 +342,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -350,7 +354,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -361,12 +365,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Data Source Fonte de dados apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -382,7 +394,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -390,7 +402,7 @@ Tentativas apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -398,7 +410,11 @@ Criado apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -406,7 +422,7 @@ Terminado apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -414,7 +430,7 @@ Estado apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -434,7 +450,7 @@ Eliminar Tarefas apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -454,11 +470,11 @@ Histórico de Dados de Mercado apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -466,7 +482,7 @@ Visualizar dados apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -474,7 +490,7 @@ Ver Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -482,7 +498,7 @@ Apagar Tarefa apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -498,7 +514,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -514,7 +530,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -542,7 +558,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -562,7 +578,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -686,7 +702,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -710,7 +726,7 @@ Deseja realmente excluir este utilizador? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -726,7 +742,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -762,11 +778,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,19 +798,19 @@ Portefólio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -806,11 +822,11 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -826,7 +842,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 +854,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 +878,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 +902,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 +910,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -902,7 +918,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 +926,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -930,7 +946,7 @@ annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -946,7 +962,7 @@ Valor Total apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -962,7 +978,7 @@ Taxa de Poupança apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1014,15 +1030,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1045,6 +1061,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Manter sessão iniciada @@ -1170,11 +1194,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1194,7 +1218,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -1202,7 +1226,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1214,15 +1238,15 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -1234,15 +1258,15 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1266,7 +1290,7 @@ Dados do Relatório com Problema apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1278,7 +1302,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 +1318,7 @@ Mostrar tudo libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -1306,7 +1330,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1314,11 +1338,11 @@ 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 - 385 + 384 @@ -1326,11 +1350,11 @@ 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 - 395 + 394 @@ -1338,11 +1362,11 @@ 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 - 419 + 416 @@ -1358,11 +1382,11 @@ 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 - 425 + 422 @@ -1370,7 +1394,7 @@ Esta funcionalidade está atualmente indisponível. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -1378,15 +1402,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 +1418,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 +1434,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 +1450,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 +1486,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 +1521,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 @@ -1530,11 +1562,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -1557,6 +1589,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Vista do Apresentador @@ -1573,6 +1613,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language Língua @@ -1598,7 +1646,7 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -1718,15 +1766,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1774,11 +1822,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 +1990,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -1956,10 +2004,6 @@ Overview Visão geral - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -1970,7 +2014,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1978,7 +2022,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -1998,7 +2042,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -2006,7 +2050,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -2074,7 +2118,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2106,7 +2150,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2130,7 +2174,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -2153,6 +2197,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Unit Price Preço por Unidade @@ -2162,7 +2214,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 @@ -2170,7 +2222,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2186,7 +2238,7 @@ A importar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -2194,7 +2246,7 @@ A importação foi concluída apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -2210,7 +2262,7 @@ Os seguintes formatos de ficheiro são suportados: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -2218,11 +2270,19 @@ Anterior apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -2317,6 +2377,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis Excluir da Análise @@ -2326,7 +2394,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -2390,7 +2458,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -2406,7 +2474,7 @@ Fundo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -2414,7 +2482,7 @@ Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -2422,7 +2490,7 @@ Cronograma de Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -2478,15 +2546,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 @@ -2522,7 +2590,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -2538,7 +2606,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 +2694,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 @@ -2670,7 +2738,15 @@ Rascunho libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -2678,7 +2754,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 +2818,7 @@ Diferença desde o Máximo Histórico libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -2758,7 +2834,15 @@ a partir do ATH (All Time High) libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -2794,7 +2878,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -2814,11 +2898,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -2838,7 +2922,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2850,11 +2934,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 +2954,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -2878,11 +2962,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 + 448 @@ -2890,7 +2978,7 @@ Símbolo apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -2906,11 +2994,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -2918,11 +3006,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 +3022,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -2942,7 +3030,7 @@ Matéria-prima libs/ui/src/lib/i18n.ts - 46 + 48 @@ -2954,7 +3042,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -2962,7 +3050,7 @@ Rendimento Fixo libs/ui/src/lib/i18n.ts - 48 + 50 @@ -2970,7 +3058,11 @@ Imobiliário libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -2986,7 +3078,7 @@ Obrigação libs/ui/src/lib/i18n.ts - 53 + 55 @@ -2994,7 +3086,7 @@ Criptomoedas libs/ui/src/lib/i18n.ts - 56 + 58 @@ -3002,7 +3094,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -3010,7 +3102,7 @@ Fundo de Investimento libs/ui/src/lib/i18n.ts - 59 + 61 @@ -3018,7 +3110,7 @@ Metal Precioso libs/ui/src/lib/i18n.ts - 60 + 62 @@ -3026,7 +3118,7 @@ Private Equity libs/ui/src/lib/i18n.ts - 61 + 63 @@ -3034,7 +3126,7 @@ Ação libs/ui/src/lib/i18n.ts - 62 + 64 @@ -3042,7 +3134,7 @@ África libs/ui/src/lib/i18n.ts - 69 + 71 @@ -3050,7 +3142,15 @@ Ásia libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -3058,7 +3158,7 @@ Europa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -3066,7 +3166,7 @@ América do Norte libs/ui/src/lib/i18n.ts - 72 + 74 @@ -3074,7 +3174,7 @@ If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -3082,7 +3182,7 @@ Oceânia libs/ui/src/lib/i18n.ts - 73 + 75 @@ -3090,7 +3190,7 @@ América do Sul libs/ui/src/lib/i18n.ts - 74 + 76 @@ -3114,15 +3214,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -3150,7 +3250,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 @@ -3166,7 +3266,7 @@ Dados de Mercado apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3190,7 +3290,7 @@ A validar dados... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3198,11 +3298,11 @@ Importar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3242,11 +3342,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3254,7 +3354,7 @@ Cronograma de Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3270,7 +3370,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3282,7 +3382,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -3302,7 +3402,7 @@ Carregar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3310,7 +3410,15 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3318,7 +3426,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 +3454,7 @@ Núcleo libs/ui/src/lib/i18n.ts - 10 + 12 @@ -3354,7 +3462,7 @@ Conceder libs/ui/src/lib/i18n.ts - 18 + 20 @@ -3362,7 +3470,7 @@ Risco mais Elevado libs/ui/src/lib/i18n.ts - 19 + 21 @@ -3370,7 +3478,7 @@ Risco menos Elevado libs/ui/src/lib/i18n.ts - 21 + 23 @@ -3378,7 +3486,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -3386,7 +3494,7 @@ Provisão de Reforma libs/ui/src/lib/i18n.ts - 27 + 29 @@ -3402,7 +3510,7 @@ Satélite libs/ui/src/lib/i18n.ts - 28 + 30 @@ -3526,7 +3634,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 +3762,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 +3834,7 @@ Mude para o Ghostfolio Premium facilmente libs/ui/src/lib/i18n.ts - 13 + 15 @@ -3750,7 +3858,7 @@ Mude para o Ghostfolio Premium ou Ghostfolio Open Source facilmente libs/ui/src/lib/i18n.ts - 12 + 14 @@ -3758,7 +3866,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -3802,7 +3910,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 @@ -3866,7 +3974,7 @@ By apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -3882,7 +3990,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -3898,11 +4006,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3918,7 +4026,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 +4034,7 @@ Deseja mesmo eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -3998,7 +4106,7 @@ Essa atividade já existe. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -4030,7 +4138,7 @@ Selecionar Dividendos apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4038,7 +4146,7 @@ Selecionar Atividades apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4062,7 +4170,7 @@ Série Atual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4070,7 +4178,7 @@ Série mais Longa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4078,7 +4186,7 @@ Meses libs/ui/src/lib/i18n.ts - 23 + 25 @@ -4086,7 +4194,7 @@ Anos libs/ui/src/lib/i18n.ts - 32 + 34 @@ -4094,7 +4202,7 @@ Mês libs/ui/src/lib/i18n.ts - 22 + 24 @@ -4102,7 +4210,7 @@ Ano libs/ui/src/lib/i18n.ts - 31 + 33 @@ -4262,7 +4370,15 @@ Responsabilidade libs/ui/src/lib/i18n.ts - 40 + 42 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -4273,12 +4389,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -4506,7 +4630,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -4514,7 +4638,7 @@ De valor libs/ui/src/lib/i18n.ts - 42 + 44 @@ -4522,7 +4646,7 @@ ETFs sem países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -4530,7 +4654,7 @@ ETFs sem setores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -4546,7 +4670,7 @@ Predefinição libs/ui/src/lib/i18n.ts - 26 + 28 @@ -4562,15 +4686,7 @@ Ásia-Pacífico libs/ui/src/lib/i18n.ts - 5 - - - - Japan - Japão - - libs/ui/src/lib/i18n.ts - 92 + 7 @@ -4658,7 +4774,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4710,7 +4826,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4766,7 +4882,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 +4934,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 +5029,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. @@ -5033,6 +5157,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Qual é o nosso users are saying @@ -5371,28 +5503,16 @@ 325 - - Switzerland - Suíça - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5436,7 +5556,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5452,7 +5572,7 @@ Selecione ou solte um arquivo aqui apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5488,11 +5608,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5636,7 @@ Você realmente deseja excluir esta tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5616,7 +5736,7 @@ Perfil de ativos apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5624,7 +5744,11 @@ Você realmente deseja excluir este perfil de ativo? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5635,6 +5759,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Adicionar manualmente @@ -5656,7 +5788,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5664,7 +5796,7 @@ Última alta de todos os tempos libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5672,11 +5804,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5708,7 +5840,7 @@ Ops, a transferência do saldo em dinheiro falhou. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -5716,7 +5848,7 @@ Medo Extremo libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5856,7 @@ Ganância Extrema libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5864,7 @@ Neutro libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5875,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 +5896,7 @@ Tendência de 50 dias libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5904,7 @@ Tendência de 200 dias libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5912,7 @@ Saldos de caixa apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5792,7 +5932,7 @@ Você realmente deseja excluir o saldo desta conta? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5808,7 +5948,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 +5956,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5856,15 +5996,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 @@ -5878,6 +6010,10 @@ Job Queue Fila de trabalhos + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5888,7 +6024,7 @@ Dados de mercado estão atrasados para apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,15 +6040,15 @@ 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 - 89 + 92 @@ -5928,7 +6064,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5968,7 +6104,7 @@ Semana até agora libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5976,11 +6112,11 @@ 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 - 377 + 376 @@ -5988,7 +6124,7 @@ Do mês até a data libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5996,11 +6132,11 @@ 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 - 381 + 380 @@ -6008,7 +6144,7 @@ No acumulado do ano libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6044,7 +6180,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 @@ -6056,7 +6192,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6064,11 +6200,11 @@ 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 - 419 + 416 @@ -6084,7 +6220,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6096,7 +6232,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6149,7 +6285,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 +6312,6 @@ 62 - - Indonesia - Indonésia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Atividade @@ -6205,7 +6333,7 @@ Executar trabalho apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6213,7 +6341,7 @@ Prioridade apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6221,7 +6349,7 @@ Esta ação não é permitida. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6357,7 @@ Liquidez libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6373,7 @@ Compre e venda libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6277,7 +6405,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6325,7 +6453,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6349,31 +6477,7 @@ Referências apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Excluir perfis - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Você realmente deseja excluir esses perfis? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Ops! Não foi possível excluir perfis. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6405,7 +6509,7 @@ Alternativo apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6413,7 +6517,7 @@ Aplicativo apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6421,7 +6525,7 @@ Orçamento apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6481,7 +6585,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6489,7 +6601,7 @@ Escritório Familiar apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6497,7 +6609,7 @@ Investidor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6509,7 +6621,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6521,7 +6633,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6529,7 +6641,7 @@ Privacidade apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6537,7 +6649,7 @@ Programas apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6545,7 +6657,7 @@ Ferramenta apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6553,7 +6665,7 @@ Experiência do usuário apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6561,7 +6673,7 @@ Fortuna apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6569,39 +6681,7 @@ Gestão de patrimônio apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6612,116 +6692,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 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6729,7 +6705,7 @@ Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6729,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 @@ -6761,7 +6737,7 @@ , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6781,7 +6757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6801,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6809,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6853,7 +6829,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6861,7 +6837,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6873,7 +6849,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6865,7 @@ Sim libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6905,7 +6881,7 @@ Visão geral do portfólio apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6937,7 +6913,7 @@ Limite mínimo apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6945,7 +6921,7 @@ Limite máximo apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7037,7 +7013,15 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7060,6 +7044,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted não pode ser auto-hospedado @@ -7157,15 +7149,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 @@ -7239,7 +7223,7 @@ Faixa limite apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7371,7 +7355,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7395,7 +7379,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7419,11 +7403,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 +7447,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7463,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7471,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7479,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7503,7 +7487,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7511,7 +7495,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,7 +7511,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7519,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7527,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,11 +7543,11 @@ Mudar libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7575,19 +7559,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7651,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 +7663,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 +7674,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Termos de Serviço @@ -7768,7 +7720,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 +7728,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 +7792,7 @@ someone apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8244,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 +8300,7 @@ Gerenciar perfil de ativos apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Investimento Alternativo libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Colecionável libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Preço médio unitário apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..6b8c8d662 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -187,7 +187,7 @@ Alım satımda kayıp riski büyük boyutta olabilir. Kısa vadede ihtiyaç duyabileceğiniz parayla yatırım yapmak tavsiye edilmez. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -223,12 +223,16 @@ Tip apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -239,7 +243,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -315,7 +319,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -355,11 +359,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 +391,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -407,7 +411,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -431,7 +435,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -443,15 +447,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -471,7 +475,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -495,7 +499,7 @@ Sil apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -519,7 +523,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -531,7 +535,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -542,12 +546,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Data Source Veri Kaynağı apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -563,7 +575,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -571,7 +583,7 @@ Deneme apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -579,7 +591,11 @@ Oluşturuldu apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -587,7 +603,7 @@ Tamamlandı apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -595,7 +611,7 @@ Durum apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -615,7 +631,7 @@ İşleri Sil apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -635,11 +651,11 @@ Tarihsel Piyasa Verisi apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -647,7 +663,7 @@ Veri Gör apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -655,7 +671,7 @@ Hata İzini Görüntüle apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -663,7 +679,7 @@ İşleri Sil apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -679,7 +695,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -695,7 +711,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -723,7 +739,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 +751,7 @@ Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -743,7 +759,7 @@ Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -751,7 +767,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -771,7 +787,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -847,7 +863,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -855,7 +871,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -867,15 +883,15 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -887,15 +903,15 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -903,7 +919,15 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -914,12 +938,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -927,7 +959,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -966,6 +998,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? @@ -1071,7 +1111,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1103,11 +1143,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1123,7 +1163,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 +1171,7 @@ Bu platformu silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -1147,7 +1187,7 @@ By apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1163,7 +1203,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1187,7 +1227,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 +1243,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1255,11 +1295,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,19 +1323,19 @@ Portföy apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1307,11 +1347,11 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1327,7 +1367,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 +1379,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 +1403,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 +1427,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 +1435,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1403,7 +1443,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 +1451,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1511,7 +1551,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1531,7 +1571,7 @@ Toplam Tutar apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -1547,7 +1587,7 @@ Tasarruf Oranı apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1599,15 +1639,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1630,6 +1670,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Oturumu açık tut @@ -1775,11 +1823,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1799,7 +1847,7 @@ Rapor Veri Sorunu apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1947,7 +1995,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 @@ -1979,7 +2027,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -1987,11 +2035,11 @@ 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 - 385 + 384 @@ -1999,11 +2047,11 @@ 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 - 395 + 394 @@ -2011,11 +2059,11 @@ 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 - 419 + 416 @@ -2031,11 +2079,11 @@ 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 - 425 + 422 @@ -2043,7 +2091,7 @@ Bu özellik şu an için mevcut değil. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2051,15 +2099,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 +2115,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 +2131,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 +2147,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 +2255,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2263,11 +2311,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 +2327,7 @@ Piyasa Verileri apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -2317,10 +2365,6 @@ Overview Özet - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -2331,7 +2375,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2339,7 +2383,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -2471,11 +2515,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 +2575,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -2663,7 +2707,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 +2779,7 @@ Piyasalar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -2743,7 +2787,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -2882,6 +2926,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. @@ -3002,6 +3054,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Kullanıcılarımızın görüşleri @@ -3123,7 +3183,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -3175,7 +3235,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3255,7 +3315,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -3263,7 +3331,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 +3347,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 +3363,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 +3371,7 @@ İçe aktarma tamamlandı apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3319,7 +3387,7 @@ Veri doğrulanıyor... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3355,7 +3423,7 @@ Temettü Yükle apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3363,7 +3431,7 @@ Aşağıdaki dosya formatları desteklenmektedir: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3371,7 +3439,7 @@ Temettü Seç apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -3379,7 +3447,7 @@ İşlemleri Seç apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -3387,11 +3455,19 @@ Geri apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -3399,11 +3475,11 @@ İçe Aktar apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -3502,6 +3578,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis Exclude from Analysis @@ -3511,7 +3595,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -3627,11 +3711,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -3639,7 +3723,7 @@ annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -3655,7 +3739,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -3663,7 +3747,15 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3679,7 +3771,7 @@ Alt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -3687,7 +3779,7 @@ Portföyün Gelişimi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -3695,7 +3787,7 @@ Yatırım Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -3703,7 +3795,7 @@ Güncel Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -3711,7 +3803,7 @@ En Uzun Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -3719,7 +3811,7 @@ Temettü Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -3747,15 +3839,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 +4011,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 +4035,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 @@ -3979,7 +4071,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -4299,28 +4391,16 @@ 329 - - Switzerland - İsviçre - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Küresel apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4332,11 +4412,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 +4448,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 +4483,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Kupon kodu kullanıldı @@ -4448,11 +4536,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -4475,6 +4563,14 @@ 67 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Sunum Görünümü @@ -4499,6 +4595,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language Dil @@ -4512,7 +4616,7 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -4564,7 +4668,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -4684,7 +4788,7 @@ Taslak libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -4716,7 +4820,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 +4836,15 @@ Tüm Zamanların En Yüksek Seviyesinden libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -4740,7 +4852,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -4800,7 +4912,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -4820,7 +4932,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 +4948,7 @@ Tümünü göster libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -4848,11 +4960,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -4864,7 +4976,7 @@ Asya Pasifik libs/ui/src/lib/i18n.ts - 5 + 7 @@ -4880,7 +4992,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4892,11 +5004,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 +5024,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4924,7 +5036,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -4932,7 +5044,7 @@ Temel libs/ui/src/lib/i18n.ts - 10 + 12 @@ -4940,7 +5052,7 @@ Ghostfolio Premium veya Ghostfolio Open Source’a kolayca geçin libs/ui/src/lib/i18n.ts - 12 + 14 @@ -4948,7 +5060,7 @@ Ghostfolio Premium’a kolayca geçin libs/ui/src/lib/i18n.ts - 13 + 15 @@ -4964,7 +5076,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -4972,7 +5084,7 @@ Hibe libs/ui/src/lib/i18n.ts - 18 + 20 @@ -4980,7 +5092,7 @@ Daha Yüksek Risk libs/ui/src/lib/i18n.ts - 19 + 21 @@ -4988,15 +5100,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 +5108,7 @@ Daha Düşük Risk libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5012,7 +5116,7 @@ Ay libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5020,7 +5124,7 @@ Ay libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5028,11 +5132,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 + 448 @@ -5040,7 +5148,7 @@ Önceden Ayarlanmış libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5048,7 +5156,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5056,7 +5164,7 @@ Yaşlılık Provizyonu libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5072,7 +5180,7 @@ Uydu libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5080,7 +5188,7 @@ Sembol apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -5096,11 +5204,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5108,11 +5216,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 +5228,7 @@ Yıl libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5140,7 +5248,7 @@ Yıl libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5160,7 +5268,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5168,7 +5276,7 @@ Kıymet libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5176,7 +5284,7 @@ Yükümlülük libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5188,7 +5296,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5200,7 +5308,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5208,7 +5316,7 @@ Emtia libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5220,7 +5328,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5228,7 +5336,7 @@ Sabit Gelir libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5236,7 +5344,11 @@ Gayrimenkul libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5252,7 +5364,7 @@ Bono libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5260,7 +5372,7 @@ Kriptopara libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5268,7 +5380,7 @@ Borsada İşlem Gören Fonlar (ETF) libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5276,7 +5388,7 @@ Borsada İşlem Görmeyen Fonlar (Mutual Fund) libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5284,7 +5396,7 @@ Kıymetli Metaller libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5292,7 +5404,7 @@ Özel Menkul Kıymetler libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5300,7 +5412,7 @@ Hisse Senetleri libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5308,7 +5420,7 @@ Afrika libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5316,7 +5428,15 @@ Asya libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5324,7 +5444,7 @@ Avrupa libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5332,7 +5452,7 @@ Kuzey Amerika libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5340,7 +5460,7 @@ If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -5348,7 +5468,7 @@ Okyanusya libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5356,7 +5476,7 @@ Güney Amerika libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5380,15 +5500,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5444,7 +5564,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -5484,7 +5604,7 @@ Dosya seçin ya da sürükleyin apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -5496,11 +5616,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5516,7 +5636,7 @@ Bu etiketi silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -5616,7 +5736,7 @@ Varlık Profili apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -5624,7 +5744,11 @@ Bu varlık profilini silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -5635,6 +5759,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Elle Giriş @@ -5656,7 +5788,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5664,7 +5796,7 @@ Son, ATH libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5672,11 +5804,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5708,7 +5840,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 +5848,7 @@ Aşırı Korku libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5724,7 +5856,7 @@ Aşırı Açgözlülük libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5732,7 +5864,7 @@ Nötr libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5743,6 +5875,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 +5896,7 @@ 50 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5764,7 +5904,7 @@ 200 Günlük Trend libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5772,7 +5912,7 @@ Nakit Bakiyeleri apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -5792,7 +5932,7 @@ Bu nakit bakiyesini silmeyi gerçekten istiyor musunuz? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -5808,7 +5948,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 +5956,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5856,15 +5996,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 @@ -5878,6 +6010,10 @@ Job Queue İş Kuyruğu + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5888,7 +6024,7 @@ Piyasa verileri gecikmeli apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5904,15 +6040,15 @@ 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 - 89 + 92 @@ -5928,7 +6064,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5968,7 +6104,7 @@ Hafta içi libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5976,11 +6112,11 @@ 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 - 377 + 376 @@ -5988,7 +6124,7 @@ Ay içi libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5996,11 +6132,11 @@ 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 - 381 + 380 @@ -6008,7 +6144,7 @@ Yıl içi libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6044,7 +6180,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 @@ -6056,7 +6192,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6064,11 +6200,11 @@ 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 - 419 + 416 @@ -6084,7 +6220,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6096,7 +6232,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6149,7 +6285,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 +6312,6 @@ 62 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Etkinlik @@ -6205,7 +6333,7 @@ İşlemi Yürüt apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6213,7 +6341,7 @@ Öncelik apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6221,7 +6349,7 @@ Bu işlem izin verilmiyor. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6229,7 +6357,7 @@ Likidite libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6245,7 +6373,7 @@ Satın ve satın libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6277,7 +6405,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6325,7 +6453,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6349,31 +6477,7 @@ Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - Profilleri Sil - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - Bu profilleri silmek istediğinize emin misiniz? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - Oops! Profilleri silmek mümkün olmadı. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6405,7 +6509,7 @@ Alternatif apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6413,7 +6517,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6421,7 +6525,7 @@ Bütçeleme apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6481,7 +6585,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6489,7 +6601,7 @@ Aile Ofisi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6497,7 +6609,7 @@ Yatırımcı apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6509,7 +6621,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6521,7 +6633,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6529,7 +6641,7 @@ Gizlilik apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6537,7 +6649,7 @@ Yazılım apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6545,7 +6657,7 @@ Araç apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6553,7 +6665,7 @@ Kullanıcı Deneyimi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6561,7 +6673,7 @@ Zenginlik apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6569,39 +6681,7 @@ Zenginlik Yönetimi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6612,116 +6692,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 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6729,7 +6705,7 @@ Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6753,7 +6729,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 @@ -6761,7 +6737,7 @@ , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6781,7 +6757,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6801,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6833,7 +6809,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6853,7 +6829,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6861,7 +6837,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6873,7 +6849,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6889,7 +6865,7 @@ Evet libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6905,7 +6881,7 @@ Portföy Anlık Görüntüsü apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6937,7 +6913,7 @@ Eşik Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6945,7 +6921,7 @@ Eşik Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7037,7 +7013,15 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7060,6 +7044,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted kendi sunucunuzda barındırılmaz @@ -7157,15 +7149,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 @@ -7239,7 +7223,7 @@ Eşik aralığı apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7371,7 +7355,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7395,7 +7379,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7419,11 +7403,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 +7447,7 @@ Yapay zeka istemi panoya kopyalandı apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7479,7 +7463,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7487,7 +7471,7 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7495,7 +7479,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7503,7 +7487,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7511,7 +7495,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,7 +7511,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7535,7 +7519,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7543,7 +7527,7 @@ Duck.ai’yi aç apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7559,11 +7543,11 @@ 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 - 381 + 380 @@ -7575,19 +7559,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7651,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 +7663,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 +7674,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 +7720,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 +7728,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 +7792,7 @@ birisi apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7872,7 +7824,7 @@ Bu öğeyi silmek istediğinize emin misiniz? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Oturumu kapat apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8127,7 +8079,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8292,7 +8244,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 +8300,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,7 +8308,7 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8364,7 +8316,7 @@ Collectible libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 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..7ea4854c1 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 @@ -102,7 +102,7 @@ Ризик втрат у торгівлі може бути суттєвим. Не рекомендується інвестувати гроші, які можуть знадобитися в короткостроковій перспективі. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -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 + 314 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 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -535,7 +535,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -559,7 +559,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -571,15 +571,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -599,7 +599,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -623,7 +623,7 @@ Видалити apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -647,7 +647,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -659,7 +659,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -670,17 +670,29 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Type Тип apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -691,7 +703,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -699,7 +711,7 @@ Профіль активу apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -707,11 +719,11 @@ Історичні ринкові дані apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -719,7 +731,7 @@ Знімок портфеля apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -727,7 +739,7 @@ Джерело даних apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -743,7 +755,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -751,7 +763,7 @@ Пріоритет apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -759,7 +771,7 @@ Спроби apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -767,7 +779,11 @@ Створено apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -775,7 +791,7 @@ Завершено apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -783,7 +799,7 @@ Статус apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -803,7 +819,7 @@ Видалити завдання apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -811,7 +827,7 @@ Переглянути дані apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -819,7 +835,7 @@ Переглянути трасування apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -827,7 +843,7 @@ Виконати завдання apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -835,7 +851,7 @@ Видалити завдання apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -843,7 +859,7 @@ Порівняльні показники apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -851,7 +867,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 +879,7 @@ ETF без країн apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -871,7 +887,7 @@ ETF без секторів apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -879,7 +895,7 @@ Фільтрувати за... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -915,7 +931,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -966,36 +982,24 @@ 66 - - Delete Profiles - Видалити профілі - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - Do you really want to delete this asset profile? Ви дійсно хочете видалити цей профіль активу? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 - - - Oops! Could not delete profiles. - Упс! Не вдалося видалити профілі. apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 66 - - Do you really want to delete these profiles? - Ви дійсно хочете видалити ці профілі? + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 + 67 @@ -1003,7 +1007,7 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -1011,7 +1015,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -1039,7 +1043,7 @@ Країна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -1047,7 +1051,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1059,15 +1063,15 @@ Сектори apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -1079,15 +1083,15 @@ Країни apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -1095,7 +1099,15 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -1106,12 +1118,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -1119,7 +1139,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -1127,11 +1147,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1147,7 +1167,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 +1175,7 @@ Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1182,6 +1202,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually Додати вручну @@ -1218,6 +1246,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Oops! Invalid currency. Упс! Невірна валюта. @@ -1295,7 +1331,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1307,7 +1343,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -1343,7 +1379,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1375,7 +1411,7 @@ Ви дійсно хочете видалити цю платформу? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -1388,10 +1424,10 @@ By - By + До apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1407,7 +1443,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1531,15 +1567,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1575,7 +1611,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1591,7 +1627,7 @@ Ви дійсно хочете видалити цей тег? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -1615,7 +1651,7 @@ Ви дійсно хочете видалити цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1671,11 +1707,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,19 +1735,19 @@ Портфель apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1723,11 +1759,11 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1743,7 +1779,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 +1807,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 +1823,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 +1835,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 @@ -1863,11 +1899,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1890,14 +1926,6 @@ 92 - - Indonesia - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity Активність @@ -1911,7 +1939,7 @@ Повідомити про збій даних apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -1959,7 +1987,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 +1995,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1975,7 +2003,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 +2011,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -2083,7 +2111,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -2103,12 +2131,12 @@ Загальна сума apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 Code - Code + Код apps/client/src/app/components/admin-overview/admin-overview.html 159 @@ -2119,7 +2147,7 @@ Ставка заощаджень apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -2158,6 +2186,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in Залишатися в системі @@ -2179,7 +2215,7 @@ Ринкові дані затримуються для apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -2295,7 +2331,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2319,7 +2355,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -2351,7 +2387,7 @@ Діапазон порогу apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -2359,7 +2395,7 @@ Мінімальний поріг apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -2367,7 +2403,7 @@ Максимальний поріг apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -2407,7 +2443,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 @@ -2567,7 +2603,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -2575,11 +2611,11 @@ З початку року 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 - 385 + 384 @@ -2587,11 +2623,11 @@ 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 - 395 + 394 @@ -2599,11 +2635,11 @@ 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 - 419 + 416 @@ -2619,11 +2655,11 @@ Максимум 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 - 425 + 422 @@ -2631,15 +2667,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 +2715,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 +2763,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 +2802,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed Код купона був обміняний @@ -2807,11 +2843,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -2859,7 +2895,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -2875,7 +2911,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -2886,6 +2922,14 @@ 328 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View Режим доповідача @@ -2910,6 +2954,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language Мова @@ -2931,7 +2983,7 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2995,7 +3047,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -3059,7 +3111,7 @@ Ця функція наразі недоступна. apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -3067,15 +3119,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 +3135,7 @@ Ця дія заборонена. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -3091,11 +3143,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 +3155,7 @@ Упс! Здається, ви робите занадто багато запитів. Будь ласка, пригальмуй трохи. apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -3115,11 +3167,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 +3256,7 @@ for - for + для apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 128 @@ -3223,15 +3275,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3255,7 +3307,7 @@ Упс, перенесення балансу готівки не вдалося. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -3311,11 +3363,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 @@ -3325,6 +3377,10 @@ Job Queue Черга завдань + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -3335,7 +3391,7 @@ Ринкові дані apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -3373,10 +3429,6 @@ Overview Огляд - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -3387,7 +3439,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3395,7 +3447,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -3535,11 +3587,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 +3612,7 @@ Duration - Duration + Тривалість apps/client/src/app/components/admin-overview/admin-overview.html 172 @@ -3740,7 +3792,7 @@ Почати apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3812,7 +3864,7 @@ Ринки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -3820,7 +3872,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3991,6 +4043,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. Використовуйте Ghostfolio анонімно та володійте своїми фінансовими даними. @@ -4111,6 +4171,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying Що говорять користувачі @@ -4260,7 +4328,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -4284,7 +4352,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -4344,7 +4412,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -4436,7 +4504,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -4452,7 +4520,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -4468,7 +4536,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -4476,7 +4552,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 +4568,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 +4584,7 @@ Імпортуються дані... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -4516,7 +4592,7 @@ Імпорт завершено apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -4532,7 +4608,7 @@ Перевірка даних... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -4568,7 +4644,7 @@ Завантажити дивіденди apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -4576,7 +4652,7 @@ Виберіть або перетягніть файл сюди apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -4584,7 +4660,7 @@ Підтримуються наступні формати файлів: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -4592,7 +4668,7 @@ Вибрати дивіденди apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -4600,7 +4676,7 @@ Виберіть активності apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -4608,11 +4684,19 @@ Назад apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -4620,11 +4704,11 @@ Імпорт apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -4723,6 +4807,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis Exclude from Analysis @@ -4732,7 +4824,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4864,11 +4956,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4884,20 +4976,20 @@ 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 - 89 + 92 here - here + тут apps/client/src/app/pages/pricing/pricing-page.html 347 @@ -4908,7 +5000,7 @@ Щомісячно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4916,7 +5008,15 @@ Щорічно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -4924,7 +5024,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -4972,7 +5072,7 @@ Низ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4980,7 +5080,7 @@ Еволюція портфеля apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4988,7 +5088,7 @@ Інвестиційний графік apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4996,7 +5096,7 @@ Поточна серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -5004,7 +5104,7 @@ Найдовша серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -5012,7 +5112,7 @@ Графік дивідендів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -5060,7 +5160,7 @@ , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -5080,15 +5180,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 +5213,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 +5360,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 @@ -5332,7 +5432,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -5490,28 +5590,16 @@ 42 - - Switzerland - Швейцарія - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global Глобальний apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -5519,7 +5607,7 @@ Альтернатива apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -5527,7 +5615,7 @@ Додаток apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -5535,7 +5623,7 @@ Бюджетування apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -5595,7 +5683,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -5603,7 +5699,7 @@ Сімейний офіс apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -5611,7 +5707,7 @@ Інвестор apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -5623,7 +5719,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -5635,7 +5731,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -5643,7 +5739,7 @@ Конфіденційність apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -5651,7 +5747,7 @@ Програмне забезпечення apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -5659,7 +5755,7 @@ Інструмент apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -5667,7 +5763,7 @@ Користувацький досвід apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -5675,7 +5771,7 @@ Багатство apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -5683,7 +5779,7 @@ Управління багатством apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 100 + 103 @@ -5731,11 +5827,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -5895,7 +5991,15 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -5918,6 +6022,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted не може бути self-hosted @@ -6055,11 +6167,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 +6219,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 @@ -6143,7 +6255,7 @@ Ви дійсно хочете видалити цей рахунок? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -6183,7 +6295,7 @@ Чернетка libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -6223,7 +6335,7 @@ Тиждень до дати libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -6231,11 +6343,11 @@ 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 - 377 + 376 @@ -6243,7 +6355,7 @@ Місяць до дати libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -6251,11 +6363,11 @@ 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 - 381 + 380 @@ -6263,7 +6375,7 @@ Рік до дати libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -6271,7 +6383,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 @@ -6283,7 +6395,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6291,11 +6403,11 @@ роки 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 - 419 + 416 @@ -6339,7 +6451,7 @@ Тренд на 50 днів libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -6347,7 +6459,7 @@ Тренд на 200 днів libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -6355,7 +6467,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -6363,7 +6475,7 @@ Останній рекордний максимум libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -6371,7 +6483,7 @@ Зміна від Історичного Максимуму libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -6387,15 +6499,23 @@ від ІМ libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 Loan - Loan + Позика libs/ui/src/lib/i18n.ts - 58 + 60 @@ -6443,7 +6563,7 @@ annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -6471,7 +6591,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -6498,6 +6618,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Allocation Розподіл @@ -6507,7 +6635,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 +6651,7 @@ Показати все libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -6535,11 +6663,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -6551,7 +6679,7 @@ Азія-Тихоокеанський регіон libs/ui/src/lib/i18n.ts - 5 + 7 @@ -6567,7 +6695,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6579,11 +6707,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 +6727,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6611,7 +6739,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -6619,7 +6747,7 @@ Купівля та продаж libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6631,7 +6759,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6675,7 +6803,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6683,7 +6811,7 @@ Ядро libs/ui/src/lib/i18n.ts - 10 + 12 @@ -6691,7 +6819,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6711,7 +6839,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6719,7 +6847,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6731,7 +6859,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6739,7 +6867,7 @@ Переключитися на Ghostfolio Premium або Ghostfolio з відкритим вихідним кодом легко libs/ui/src/lib/i18n.ts - 12 + 14 @@ -6747,7 +6875,7 @@ Переключитися на Ghostfolio Premium легко libs/ui/src/lib/i18n.ts - 13 + 15 @@ -6763,7 +6891,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -6771,7 +6899,7 @@ Грант libs/ui/src/lib/i18n.ts - 18 + 20 @@ -6779,7 +6907,7 @@ Вищий ризик libs/ui/src/lib/i18n.ts - 19 + 21 @@ -6787,7 +6915,7 @@ Така активність вже існує. libs/ui/src/lib/i18n.ts - 20 + 22 @@ -6795,7 +6923,7 @@ Нижчий ризик libs/ui/src/lib/i18n.ts - 21 + 23 @@ -6803,7 +6931,7 @@ Місяць libs/ui/src/lib/i18n.ts - 22 + 24 @@ -6811,7 +6939,7 @@ Місяців libs/ui/src/lib/i18n.ts - 23 + 25 @@ -6819,11 +6947,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 + 448 @@ -6831,7 +6963,7 @@ Отримайте доступ до 80 000+ тікерів з понад 50 бірж libs/ui/src/lib/i18n.ts - 25 + 27 @@ -6839,7 +6971,7 @@ Пресет libs/ui/src/lib/i18n.ts - 26 + 28 @@ -6847,7 +6979,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -6855,7 +6987,7 @@ Пенсійне накопичення libs/ui/src/lib/i18n.ts - 27 + 29 @@ -6871,7 +7003,7 @@ Супутник libs/ui/src/lib/i18n.ts - 28 + 30 @@ -6879,7 +7011,7 @@ Символ apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -6895,11 +7027,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -6907,11 +7039,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 +7051,7 @@ Рік libs/ui/src/lib/i18n.ts - 31 + 33 @@ -6939,12 +7071,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 +7087,7 @@ Так libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6975,7 +7107,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -6987,11 +7119,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -6999,7 +7131,7 @@ Цінний libs/ui/src/lib/i18n.ts - 42 + 44 @@ -7007,7 +7139,7 @@ Зобов’язання libs/ui/src/lib/i18n.ts - 40 + 42 @@ -7019,7 +7151,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -7031,7 +7163,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -7039,7 +7171,7 @@ Товар libs/ui/src/lib/i18n.ts - 46 + 48 @@ -7051,7 +7183,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -7059,7 +7191,7 @@ Фіксований дохід libs/ui/src/lib/i18n.ts - 48 + 50 @@ -7067,7 +7199,7 @@ Ліквідність libs/ui/src/lib/i18n.ts - 49 + 51 @@ -7075,12 +7207,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 +7227,7 @@ Облігація libs/ui/src/lib/i18n.ts - 53 + 55 @@ -7099,7 +7235,7 @@ Криптовалюта libs/ui/src/lib/i18n.ts - 56 + 58 @@ -7107,7 +7243,7 @@ ETF libs/ui/src/lib/i18n.ts - 57 + 59 @@ -7115,7 +7251,7 @@ Взаємний фонд libs/ui/src/lib/i18n.ts - 59 + 61 @@ -7123,7 +7259,7 @@ Дорогоцінний метал libs/ui/src/lib/i18n.ts - 60 + 62 @@ -7131,7 +7267,7 @@ Приватний капітал libs/ui/src/lib/i18n.ts - 61 + 63 @@ -7139,7 +7275,7 @@ Акція libs/ui/src/lib/i18n.ts - 62 + 64 @@ -7147,7 +7283,7 @@ Африка libs/ui/src/lib/i18n.ts - 69 + 71 @@ -7155,7 +7291,15 @@ Азія libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -7163,7 +7307,7 @@ Європа libs/ui/src/lib/i18n.ts - 71 + 73 @@ -7171,7 +7315,7 @@ Північна Америка libs/ui/src/lib/i18n.ts - 72 + 74 @@ -7179,7 +7323,7 @@ If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -7187,7 +7331,7 @@ Океанія libs/ui/src/lib/i18n.ts - 73 + 75 @@ -7195,39 +7339,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 +7350,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 +7363,7 @@ Екстремальна жадібність libs/ui/src/lib/i18n.ts - 107 + 80 @@ -7387,7 +7371,7 @@ Нейтрально libs/ui/src/lib/i18n.ts - 110 + 83 @@ -7427,15 +7411,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -7471,23 +7455,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 +7479,23 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 Mode - Mode + Режим apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 Selector - Selector + Селектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7519,7 +7503,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7527,15 +7511,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 +7527,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,38 +7540,38 @@ Change - Change + Змінити libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7622,30 +7606,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 +7632,7 @@ Continue - Continue + Продовжити apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html 57 @@ -7691,11 +7651,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 +7663,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 +7674,6 @@ 239 - - United Kingdom - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service Terms of Service @@ -7732,7 +7684,7 @@ terms-of-service - terms-of-service + umovy-nadannia-posluh kebab-case libs/common/src/lib/routes/routes.ts @@ -7768,7 +7720,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 +7728,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 +7789,10 @@ someone - someone + когось apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7853,7 +7805,7 @@ Watchlist - Watchlist + Список спостереження apps/client/src/app/components/home-watchlist/home-watchlist.html 4 @@ -7872,7 +7824,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7880,7 +7832,7 @@ Log out apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -7897,7 +7849,7 @@ changelog - changelog + zhurnal-zmin kebab-case libs/common/src/lib/routes/routes.ts @@ -8030,7 +7982,7 @@ personal-finance-tools - personal-finance-tools + instrumenty-osobystykh-finansiv kebab-case libs/common/src/lib/routes/routes.ts @@ -8047,7 +7999,7 @@ markets - markets + rynky kebab-case libs/common/src/lib/routes/routes.ts @@ -8108,7 +8060,7 @@ Available - Available + Доступно apps/client/src/app/components/data-provider-status/data-provider-status.component.html 3 @@ -8116,7 +8068,7 @@ Unavailable - Unavailable + Недоступно apps/client/src/app/components/data-provider-status/data-provider-status.component.html 5 @@ -8127,12 +8079,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 +8092,7 @@ Investment - Investment + Інвестиція apps/client/src/app/pages/i18n/i18n-page.html 15 @@ -8164,7 +8116,7 @@ Equity - Equity + Акції apps/client/src/app/pages/i18n/i18n-page.html 41 @@ -8252,7 +8204,7 @@ Investment - Investment + Інвестиція apps/client/src/app/pages/i18n/i18n-page.html 95 @@ -8276,7 +8228,7 @@ start - start + pochatok kebab-case libs/common/src/lib/routes/routes.ts @@ -8292,12 +8244,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 +8265,7 @@ Stocks - Stocks + Акції apps/client/src/app/components/markets/markets.component.ts 51 @@ -8325,7 +8277,7 @@ Cryptocurrencies - Cryptocurrencies + Криптовалюти apps/client/src/app/components/markets/markets.component.ts 52 @@ -8348,7 +8300,7 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8356,15 +8308,15 @@ Alternative Investment libs/ui/src/lib/i18n.ts - 45 + 47 Collectible - Collectible + Колекційний предмет libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8372,7 +8324,7 @@ Average Unit Price apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -8421,7 +8373,7 @@ Fees - Fees + Комісії apps/client/src/app/pages/i18n/i18n-page.html 161 @@ -8429,7 +8381,7 @@ Liquidity - Liquidity + Ліквідність apps/client/src/app/pages/i18n/i18n-page.html 70 @@ -8565,7 +8517,7 @@ Asia-Pacific - Asia-Pacific + Азіатсько-Тихоокеанський регіон apps/client/src/app/pages/i18n/i18n-page.html 165 @@ -8629,7 +8581,7 @@ Europe - Europe + Європа apps/client/src/app/pages/i18n/i18n-page.html 195 @@ -8661,7 +8613,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..54f8a7bfc 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -203,7 +203,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -235,12 +235,16 @@ Type apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -251,7 +255,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -316,7 +320,7 @@ Cash Balances apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -338,7 +342,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -378,11 +382,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 +412,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -428,7 +432,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -451,7 +455,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -463,15 +467,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -490,7 +494,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -513,7 +517,7 @@ Delete apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -537,7 +541,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -549,7 +553,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -559,29 +563,36 @@ 146 + + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Asset Profile apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 Historical Market Data apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 Data Source apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -597,35 +608,39 @@ libs/ui/src/lib/i18n.ts - 14 + 16 Attempts apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 Created apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 Finished apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 Status apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -643,28 +658,28 @@ Delete Jobs apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 View Data apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 View Stacktrace apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 Delete Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -678,7 +693,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -693,7 +708,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -719,7 +734,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 +745,32 @@ 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 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -770,7 +789,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -837,6 +856,13 @@ 284 + + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh @@ -855,11 +881,11 @@ Import apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -881,7 +907,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -889,7 +915,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -900,15 +926,15 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -919,22 +945,29 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -944,18 +977,25 @@ 32 + + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -980,6 +1020,13 @@ 16 + + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually @@ -1006,6 +1053,13 @@ 119 + + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? @@ -1098,7 +1152,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1126,11 +1180,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1145,14 +1199,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 + 114 @@ -1166,7 +1220,7 @@ By apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1180,7 +1234,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1223,7 +1277,7 @@ Do you really want to delete this tag? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -1244,7 +1298,7 @@ Do you really want to delete this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1259,7 +1313,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1305,11 +1359,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,19 +1384,19 @@ Portfolio apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1353,11 +1407,11 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1371,7 +1425,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 +1436,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 +1459,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 +1481,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 +1489,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 +1504,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1538,7 +1592,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1556,7 +1610,7 @@ Total Amount apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -1570,7 +1624,7 @@ Savings Rate apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1620,15 +1674,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1650,6 +1704,13 @@ 46 + + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in @@ -1790,18 +1851,18 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 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 + 456 @@ -1938,7 +1999,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 @@ -1969,40 +2030,40 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 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 - 385 + 384 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 - 395 + 394 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 - 419 + 416 @@ -2016,11 +2077,11 @@ 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 - 425 + 422 @@ -2058,6 +2119,13 @@ 174 + + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed @@ -2080,11 +2148,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -2123,6 +2191,13 @@ 279 + + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View @@ -2144,6 +2219,13 @@ 9 + + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language @@ -2155,7 +2237,7 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2212,7 +2294,7 @@ this is projected to increase to apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -2269,33 +2351,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 +2388,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 +2403,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 +2503,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2452,7 +2534,7 @@ Oops, cash balance transfer has failed. apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2501,11 +2583,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 +2598,7 @@ Market Data apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -2551,10 +2633,6 @@ Overview - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -2565,7 +2643,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2573,7 +2651,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -2703,11 +2781,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 +2836,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -2864,7 +2942,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 +3011,7 @@ Markets apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -2941,7 +3019,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3089,6 +3167,13 @@ 149 + + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. @@ -3201,6 +3286,13 @@ 217 + + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying @@ -3325,7 +3417,7 @@ and a safe withdrawal rate (SWR) of apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -3346,7 +3438,7 @@ Job ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -3402,7 +3494,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3496,14 +3588,21 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 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 +3617,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 +3632,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 +3653,7 @@ Validating data... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3586,46 +3685,53 @@ Load Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 Choose or drop a file here apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 The following file formats are supported: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 Select Dividends apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 Select Activities apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 Back apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -3710,6 +3816,13 @@ 150 + + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis @@ -3718,7 +3831,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -3824,18 +3937,18 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 annual interest rate apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -3849,14 +3962,21 @@ 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 + + + + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -3870,42 +3990,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 +4050,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 +4206,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 +4228,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 @@ -4140,7 +4260,7 @@ Sustainable retirement income apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -4262,11 +4382,11 @@ per month apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -4441,26 +4561,15 @@ 329 - - Switzerland - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4471,11 +4580,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 +4628,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 @@ -4551,7 +4660,7 @@ Do you really want to delete this account balance? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -4580,7 +4689,7 @@ Draft libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -4619,35 +4728,35 @@ 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 , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 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 +4770,21 @@ from ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -4722,7 +4838,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -4740,7 +4856,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 +4871,7 @@ Show all libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -4766,11 +4882,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -4781,7 +4897,7 @@ Asia-Pacific libs/ui/src/lib/i18n.ts - 5 + 7 @@ -4796,7 +4912,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4808,11 +4924,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 +4943,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4839,28 +4955,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,102 +4991,99 @@ 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 + 448 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 Symbol apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -4986,29 +5099,29 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 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 +5139,7 @@ Years libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5044,7 +5157,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5055,25 +5168,25 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 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 +5197,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5095,14 +5208,14 @@ libs/ui/src/lib/i18n.ts - 54 + 56 Commodity libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5113,21 +5226,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,119 +5258,126 @@ 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 If you retire today, you would be able to withdraw apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 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 +5410,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5319,28 +5443,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 + 573 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 @@ -5374,6 +5491,10 @@ Job Queue + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5383,7 +5504,7 @@ Market data is delayed for apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5397,7 +5518,7 @@ Close Holding apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5419,15 +5540,15 @@ 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 - 89 + 92 @@ -5455,43 +5576,43 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 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 - 381 + 380 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 - 377 + 376 @@ -5523,7 +5644,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 @@ -5535,18 +5656,18 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 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 - 419 + 416 @@ -5583,7 +5704,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5594,7 +5715,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -5619,7 +5740,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 +5764,6 @@ 61 - - Indonesia - - libs/ui/src/lib/i18n.ts - 90 - - Activity @@ -5668,35 +5782,35 @@ Execute Job apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 This action is not allowed. apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 Priority apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 Liquidity libs/ui/src/lib/i18n.ts - 49 + 51 Buy and sell libs/ui/src/lib/i18n.ts - 8 + 10 @@ -5738,7 +5852,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -5773,7 +5887,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -5790,32 +5904,11 @@ 179 - - Do you really want to delete these profiles? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Delete Profiles - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Oops! Could not delete profiles. - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 - - Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 + 130 @@ -5843,7 +5936,7 @@ Wealth apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -5902,77 +5995,49 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 - - - - Thailand - - libs/ui/src/lib/i18n.ts - 100 - - - - India - - libs/ui/src/lib/i18n.ts 89 - - Austria + + Oops! Could not delete the asset profile. - libs/ui/src/lib/i18n.ts - 80 - - - - Poland - - libs/ui/src/lib/i18n.ts - 95 - - - - Italy - - libs/ui/src/lib/i18n.ts - 91 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 User Experience apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 Tool apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 Investor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 Wealth Management apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 100 + 103 @@ -5982,39 +6047,18 @@ 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 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6025,49 +6069,21 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 99 Budgeting apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 - - - - Belgium - - libs/ui/src/lib/i18n.ts - 81 + 88 @@ -6078,63 +6094,28 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 94 Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 - - - - Finland - - libs/ui/src/lib/i18n.ts - 86 + 97 - - France + + Do you really want to delete these asset profiles? - libs/ui/src/lib/i18n.ts - 87 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6145,7 +6126,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6189,7 +6170,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6203,14 +6184,14 @@ Yes libs/ui/src/lib/i18n.ts - 33 + 35 , based on your total assets of apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6224,7 +6205,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6244,7 +6225,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6252,7 +6233,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6264,7 +6245,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6278,7 +6259,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 @@ -6292,7 +6273,7 @@ Threshold Max apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -6313,14 +6294,14 @@ Portfolio Snapshot apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 Threshold Min apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6409,7 +6390,14 @@ , assuming a apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -6430,6 +6418,13 @@ 195 + + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted @@ -6506,13 +6501,6 @@ 40 - - Ukraine - - libs/ui/src/lib/i18n.ts - 101 - - Set API key @@ -6524,7 +6512,7 @@ Get access to 80’000+ tickers from over 50 exchanges libs/ui/src/lib/i18n.ts - 25 + 27 @@ -6599,7 +6587,7 @@ Threshold range apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -6715,7 +6703,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6739,7 +6727,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6776,11 +6764,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 +6789,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -6815,63 +6803,63 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 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 + 499 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,11 +6873,11 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -6900,19 +6888,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -6929,13 +6917,6 @@ 67 - - Singapore - - libs/ui/src/lib/i18n.ts - 97 - - Total amount @@ -6943,20 +6924,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 +6970,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 +6991,6 @@ 239 - - United Kingdom - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service @@ -7072,14 +7032,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 +7074,7 @@ someone apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7143,14 +7103,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 +7331,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -7530,7 +7490,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 +7526,28 @@ Manage Asset Profile apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 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 + 123 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..115b71897 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -216,7 +216,7 @@ 交易存在巨大亏损风险,因此不应投入您短期内可能急需的资金。 apps/client/src/app/components/footer/footer.component.html - 182 + 180 @@ -252,12 +252,16 @@ 类型 apps/client/src/app/components/admin-jobs/admin-jobs.html - 57 + 48 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 28 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 156 + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html 15 @@ -268,7 +272,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 187 + 185 @@ -340,7 +344,7 @@ 现金余额 apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html - 142 + 145 @@ -364,7 +368,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 310 + 314 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -404,11 +408,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 +440,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 317 + 321 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -456,7 +460,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 307 + 305 @@ -480,7 +484,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 34 + 39 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -492,15 +496,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 288 + 286 libs/ui/src/lib/activities-table/activities-table.component.html - 324 + 322 libs/ui/src/lib/holdings-table/holdings-table.component.html - 93 + 98 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -520,7 +524,7 @@ apps/client/src/app/components/admin-market-data/admin-market-data.html - 267 + 278 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -544,7 +548,7 @@ 删除 apps/client/src/app/components/admin-market-data/admin-market-data.html - 289 + 300 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -568,7 +572,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 80 + 85 libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -580,7 +584,7 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 176 + 187 @@ -591,12 +595,20 @@ 146 + + Paid + Paid + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 117 + + Asset Profile 资产概况 apps/client/src/app/components/admin-jobs/admin-jobs.html - 61 + 52 @@ -604,11 +616,11 @@ 历史市场数据 apps/client/src/app/components/admin-jobs/admin-jobs.html - 63 + 54 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 449 + 453 @@ -616,7 +628,7 @@ 数据源 apps/client/src/app/components/admin-jobs/admin-jobs.html - 91 + 82 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -632,7 +644,7 @@ libs/ui/src/lib/i18n.ts - 14 + 16 @@ -640,7 +652,7 @@ 尝试次数 apps/client/src/app/components/admin-jobs/admin-jobs.html - 129 + 120 @@ -648,7 +660,11 @@ 创建 apps/client/src/app/components/admin-jobs/admin-jobs.html - 143 + 134 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 140 @@ -656,7 +672,7 @@ 完成 apps/client/src/app/components/admin-jobs/admin-jobs.html - 152 + 143 @@ -664,7 +680,7 @@ 状态 apps/client/src/app/components/admin-jobs/admin-jobs.html - 161 + 152 apps/client/src/app/components/admin-settings/admin-settings.component.html @@ -684,7 +700,7 @@ 删除任务 apps/client/src/app/components/admin-jobs/admin-jobs.html - 202 + 193 @@ -692,7 +708,7 @@ 查看数据 apps/client/src/app/components/admin-jobs/admin-jobs.html - 217 + 208 @@ -700,7 +716,7 @@ 查看堆栈跟踪 apps/client/src/app/components/admin-jobs/admin-jobs.html - 225 + 216 @@ -708,7 +724,7 @@ 删除任务 apps/client/src/app/components/admin-jobs/admin-jobs.html - 233 + 224 @@ -724,7 +740,7 @@ Find an account... libs/ui/src/lib/assistant/assistant.component.ts - 471 + 468 @@ -740,7 +756,7 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 196 + 194 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html @@ -768,7 +784,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 +796,7 @@ 没有国家的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 135 + 140 @@ -788,7 +804,7 @@ 无行业类别的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 140 + 145 @@ -796,7 +812,11 @@ 您确实要删除此资产配置文件吗? apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 37 + 28 + + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 66 @@ -804,7 +824,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 368 + 374 @@ -824,7 +844,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 45 + 50 @@ -883,6 +903,14 @@ 284 + + Healthcare + Healthcare + + libs/ui/src/lib/i18n.ts + 92 + + Refresh 刷新 @@ -896,11 +924,11 @@ 导入 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 155 + 158 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 190 + 193 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html @@ -924,7 +952,7 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 273 + 277 apps/client/src/app/components/admin-users/admin-users.html @@ -932,7 +960,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 276 + 280 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -944,15 +972,15 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 279 + 283 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 398 + 402 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 282 + 286 apps/client/src/app/pages/public/public-page.html @@ -964,15 +992,15 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 289 + 293 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 409 + 413 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 294 + 298 @@ -980,7 +1008,15 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 387 + 391 + + + + Technology + Technology + + libs/ui/src/lib/i18n.ts + 96 @@ -991,12 +1027,20 @@ 32 + + Total + Total + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 150 + + Scraper Configuration 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 472 + 476 @@ -1004,7 +1048,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 437 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1031,6 +1075,14 @@ 16 + + Industrials + Industrials + + libs/ui/src/lib/i18n.ts + 93 + + Add Manually 手动添加 @@ -1059,6 +1111,14 @@ 119 + + Consumer Cyclical + Consumer Cyclical + + libs/ui/src/lib/i18n.ts + 88 + + Do you really want to delete this coupon? 您确实要删除此优惠券吗? @@ -1164,7 +1224,7 @@ libs/ui/src/lib/account-balances/account-balances.component.html - 93 + 98 @@ -1196,11 +1256,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 424 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 551 + 555 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1216,7 +1276,7 @@ 资产概况已保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 618 + 624 @@ -1224,7 +1284,7 @@ 您真的要删除这个平台吗? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 111 + 114 @@ -1240,7 +1300,7 @@ 预计到 apps/client/src/app/pages/portfolio/fire/fire-page.html - 139 + 140 @@ -1256,7 +1316,7 @@ 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 209 + 212 @@ -1304,7 +1364,7 @@ 您真的要删除此标签吗? apps/client/src/app/components/admin-tag/admin-tag.component.ts - 108 + 116 @@ -1328,7 +1388,7 @@ 您真的要删除该用户吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 215 + 236 @@ -1344,7 +1404,7 @@ apps/client/src/app/components/header/header.component.html - 231 + 235 @@ -1396,11 +1456,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,19 +1484,19 @@ 投资组合 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 140 + 139 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 - 95 + 98 libs/common/src/lib/routes/routes.ts @@ -1448,11 +1508,11 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 379 + 383 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts - 152 + 151 @@ -1468,7 +1528,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 +1540,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 +1564,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 +1588,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 +1596,7 @@ libs/ui/src/lib/i18n.ts - 108 + 81 @@ -1544,7 +1604,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 +1612,7 @@ libs/ui/src/lib/i18n.ts - 109 + 82 @@ -1652,7 +1712,7 @@ 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 201 + 204 @@ -1672,7 +1732,7 @@ 总金额 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 147 + 143 @@ -1688,7 +1748,7 @@ 储蓄率 apps/client/src/app/components/investment-chart/investment-chart.component.ts - 205 + 201 @@ -1740,15 +1800,15 @@ apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 97 + 100 apps/client/src/app/pages/portfolio/fire/fire-page.html - 83 + 84 apps/client/src/app/pages/portfolio/fire/fire-page.html - 161 + 162 apps/client/src/app/pages/pricing/pricing-page.html @@ -1771,6 +1831,14 @@ 46 + + Energy + Energy + + libs/ui/src/lib/i18n.ts + 90 + + Stay signed in 保持登录 @@ -1928,11 +1996,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 217 + 215 libs/ui/src/lib/holdings-table/holdings-table.component.html - 69 + 74 @@ -1940,7 +2008,7 @@ 报告数据故障 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 452 + 456 @@ -2088,7 +2156,7 @@ 升级计划 apps/client/src/app/components/header/header.component.html - 193 + 197 apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html @@ -2120,7 +2188,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 373 + 372 @@ -2128,11 +2196,11 @@ 年初至今 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 - 385 + 384 @@ -2140,11 +2208,11 @@ 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 - 395 + 394 @@ -2152,11 +2220,11 @@ 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 - 419 + 416 @@ -2172,11 +2240,11 @@ 最大限度 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 - 425 + 422 @@ -2219,6 +2287,14 @@ 174 + + Consumer Defensive + Consumer Defensive + + libs/ui/src/lib/i18n.ts + 89 + + Coupon code has been redeemed 优惠券代码已被兑换 @@ -2244,11 +2320,11 @@ apps/client/src/app/pages/portfolio/fire/fire-page.html - 80 + 81 apps/client/src/app/pages/portfolio/fire/fire-page.html - 158 + 159 apps/client/src/app/pages/pricing/pricing-page.html @@ -2291,6 +2367,14 @@ 279 + + Utilities + Utilities + + libs/ui/src/lib/i18n.ts + 97 + + Presenter View 演示者视图 @@ -2315,6 +2399,14 @@ 9 + + Coupon + Coupon + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 122 + + Language 语言 @@ -2328,7 +2420,7 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 510 + 514 apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -2392,7 +2484,7 @@ 预计将增至 apps/client/src/app/pages/portfolio/fire/fire-page.html - 147 + 148 @@ -2456,7 +2548,7 @@ 此功能目前无法使用。 apps/client/src/app/core/http-response.interceptor.ts - 55 + 52 @@ -2464,15 +2556,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 +2572,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 +2588,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 +2604,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 +2712,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 + 382 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2652,7 +2744,7 @@ 糟糕,现金余额转账失败。 apps/client/src/app/pages/accounts/accounts-page.component.ts - 341 + 337 @@ -2708,11 +2800,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 +2816,7 @@ 市场数据 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 400 + 404 libs/common/src/lib/routes/routes.ts @@ -2762,10 +2854,6 @@ Overview 概述 - - apps/client/src/app/components/admin-jobs/admin-jobs.html - 7 - apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html 114 @@ -2776,7 +2864,7 @@ apps/client/src/app/components/header/header.component.html - 247 + 251 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2784,7 +2872,7 @@ apps/client/src/app/pages/admin/admin-page.component.ts - 41 + 68 apps/client/src/app/pages/resources/resources-page.component.ts @@ -2916,11 +3004,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 +3064,7 @@ apps/client/src/app/components/header/header.component.html - 356 + 361 apps/client/src/app/pages/features/features-page.html @@ -3096,7 +3184,7 @@ 立即开始 apps/client/src/app/components/header/header.component.html - 432 + 437 apps/client/src/app/pages/features/features-page.html @@ -3168,7 +3256,7 @@ 市场 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 381 + 385 apps/client/src/app/components/footer/footer.component.html @@ -3176,7 +3264,7 @@ apps/client/src/app/components/header/header.component.html - 403 + 408 apps/client/src/app/components/home-market/home-market.html @@ -3339,6 +3427,14 @@ 149 + + Basic Materials + Basic Materials + + libs/ui/src/lib/i18n.ts + 86 + + Use Ghostfolio anonymously and own your financial data. 匿名使用 Ghostfolio 并拥有您的财务数据。 @@ -3467,6 +3563,14 @@ 217 + + Oops! Could not delete the asset profiles. + Oops! Could not delete the asset profiles. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 52 + + What our users are saying 听听我们的用户怎么说 @@ -3608,7 +3712,7 @@ 和安全取款率 (SWR) 为 apps/client/src/app/pages/portfolio/fire/fire-page.html - 108 + 109 @@ -3632,7 +3736,7 @@ 作业 ID apps/client/src/app/components/admin-jobs/admin-jobs.html - 43 + 34 @@ -3692,7 +3796,7 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 342 + 346 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -3796,7 +3900,15 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 241 + 239 + + + + Subscriptions + Subscriptions + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 131 @@ -3804,7 +3916,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 +3932,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 +3948,7 @@ 正在导入数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 171 + 172 @@ -3844,7 +3956,7 @@ 导入已完成 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 181 + 182 @@ -3860,7 +3972,7 @@ 验证数据... apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts - 291 + 293 @@ -3896,7 +4008,7 @@ 加载股息 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 68 + 71 @@ -3904,7 +4016,7 @@ 在此处选择或放置文件 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 84 + 87 @@ -3912,7 +4024,7 @@ 支持以下文件格式: apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 90 + 93 @@ -3920,7 +4032,7 @@ 选择股息 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 113 + 116 @@ -3928,7 +4040,7 @@ 选择活动 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 115 + 118 @@ -3936,11 +4048,19 @@ 后退 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 146 + 149 apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html - 182 + 185 + + + + Price + Price + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 166 @@ -4035,6 +4155,14 @@ 150 + + Trial + Trial + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts + 121 + + Exclude from Analysis 排除在分析之外 @@ -4044,7 +4172,7 @@ libs/ui/src/lib/i18n.ts - 16 + 18 @@ -4160,11 +4288,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 78 libs/ui/src/lib/i18n.ts - 37 + 39 @@ -4172,7 +4300,7 @@ 年利率 apps/client/src/app/pages/portfolio/fire/fire-page.html - 185 + 186 @@ -4188,7 +4316,7 @@ 每月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 92 @@ -4196,7 +4324,15 @@ 每年 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 93 + + + + Expires + Expires + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 194 @@ -4212,7 +4348,7 @@ 底部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 352 + 354 @@ -4220,7 +4356,7 @@ 投资组合演变 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 405 + 409 @@ -4228,7 +4364,7 @@ 投资时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 434 + 438 @@ -4236,7 +4372,7 @@ 当前连胜 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 455 + 459 @@ -4244,7 +4380,7 @@ 最长连续纪录 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 464 + 468 @@ -4252,7 +4388,7 @@ 股息时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 493 + 497 @@ -4280,15 +4416,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 +4588,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 +4612,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 @@ -4512,7 +4648,7 @@ 可持续的退休收入 apps/client/src/app/pages/portfolio/fire/fire-page.html - 41 + 42 @@ -4649,11 +4785,11 @@ 每月 apps/client/src/app/pages/portfolio/fire/fire-page.html - 94 + 95 apps/client/src/app/pages/portfolio/fire/fire-page.html - 172 + 173 @@ -4844,28 +4980,16 @@ 329 - - Switzerland - 瑞士 - - apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 - - - libs/ui/src/lib/i18n.ts - 99 - - Global 全球的 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 59 + 60 libs/ui/src/lib/i18n.ts - 17 + 19 @@ -4877,11 +5001,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 +5053,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 @@ -4965,7 +5089,7 @@ 您确实要删除该帐户余额吗? libs/ui/src/lib/account-balances/account-balances.component.ts - 113 + 127 @@ -4997,7 +5121,7 @@ 草稿 libs/ui/src/lib/activities-table/activities-table.component.html - 168 + 167 @@ -5041,7 +5165,7 @@ 50 天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 32 + 43 @@ -5049,7 +5173,7 @@ 200天趋势 libs/ui/src/lib/benchmark/benchmark.component.html - 61 + 72 @@ -5057,7 +5181,7 @@ , apps/client/src/app/pages/portfolio/fire/fire-page.html - 145 + 146 @@ -5065,7 +5189,7 @@ 上次历史最高纪录 libs/ui/src/lib/benchmark/benchmark.component.html - 90 + 101 @@ -5073,7 +5197,7 @@ 较历史最高纪录涨跌 libs/ui/src/lib/benchmark/benchmark.component.html - 117 + 128 @@ -5089,7 +5213,15 @@ 从 ATH libs/ui/src/lib/benchmark/benchmark.component.html - 119 + 130 + + + + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + {VAR_PLURAL, plural, =1 {Profile} other {Profiles}} + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 249 @@ -5097,7 +5229,7 @@ Loan libs/ui/src/lib/i18n.ts - 58 + 60 @@ -5157,7 +5289,7 @@ libs/ui/src/lib/i18n.ts - 39 + 41 @@ -5177,7 +5309,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 +5325,7 @@ 显示所有 libs/ui/src/lib/holdings-table/holdings-table.component.html - 212 + 217 @@ -5205,11 +5337,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 339 + 337 libs/ui/src/lib/i18n.ts - 4 + 6 libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html @@ -5221,7 +5353,7 @@ 亚太 libs/ui/src/lib/i18n.ts - 5 + 7 @@ -5237,7 +5369,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 327 + 331 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5249,11 +5381,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 +5401,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 343 + 347 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5281,7 +5413,7 @@ libs/ui/src/lib/i18n.ts - 7 + 9 @@ -5289,7 +5421,7 @@ 核心 libs/ui/src/lib/i18n.ts - 10 + 12 @@ -5297,7 +5429,7 @@ 轻松切换到 Ghostfolio Premium 或 Ghostfolio Open Source libs/ui/src/lib/i18n.ts - 12 + 14 @@ -5305,7 +5437,7 @@ 轻松切换到 Ghostfolio Premium libs/ui/src/lib/i18n.ts - 13 + 15 @@ -5321,7 +5453,7 @@ libs/ui/src/lib/i18n.ts - 15 + 17 @@ -5329,7 +5461,7 @@ 授予 libs/ui/src/lib/i18n.ts - 18 + 20 @@ -5337,7 +5469,7 @@ 风险较高 libs/ui/src/lib/i18n.ts - 19 + 21 @@ -5345,15 +5477,7 @@ 这项活动已经存在。 libs/ui/src/lib/i18n.ts - 20 - - - - Japan - 日本 - - libs/ui/src/lib/i18n.ts - 92 + 22 @@ -5361,7 +5485,7 @@ 降低风险 libs/ui/src/lib/i18n.ts - 21 + 23 @@ -5369,7 +5493,7 @@ libs/ui/src/lib/i18n.ts - 22 + 24 @@ -5377,7 +5501,7 @@ 几个月 libs/ui/src/lib/i18n.ts - 23 + 25 @@ -5385,11 +5509,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 + 448 @@ -5397,7 +5525,7 @@ 预设 libs/ui/src/lib/i18n.ts - 26 + 28 @@ -5405,7 +5533,7 @@ No Activities apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 145 + 150 @@ -5413,7 +5541,7 @@ 退休金 libs/ui/src/lib/i18n.ts - 27 + 29 @@ -5421,7 +5549,7 @@ 卫星 libs/ui/src/lib/i18n.ts - 28 + 30 @@ -5429,7 +5557,7 @@ 代码 apps/client/src/app/components/admin-jobs/admin-jobs.html - 77 + 68 apps/client/src/app/components/admin-market-data/admin-market-data.html @@ -5445,11 +5573,11 @@ apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 314 + 318 libs/ui/src/lib/i18n.ts - 29 + 31 @@ -5457,11 +5585,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 +5597,7 @@ libs/ui/src/lib/i18n.ts - 31 + 33 @@ -5489,7 +5617,7 @@ libs/ui/src/lib/i18n.ts - 32 + 34 @@ -5509,7 +5637,7 @@ libs/ui/src/lib/i18n.ts - 36 + 38 @@ -5521,11 +5649,11 @@ libs/ui/src/lib/activities-table/activities-table.component.html - 265 + 263 libs/ui/src/lib/i18n.ts - 38 + 40 @@ -5533,7 +5661,7 @@ 贵重物品 libs/ui/src/lib/i18n.ts - 42 + 44 @@ -5541,7 +5669,7 @@ 负债 libs/ui/src/lib/i18n.ts - 40 + 42 @@ -5553,7 +5681,7 @@ libs/ui/src/lib/i18n.ts - 41 + 43 @@ -5565,7 +5693,7 @@ libs/ui/src/lib/i18n.ts - 54 + 56 @@ -5573,7 +5701,7 @@ 商品 libs/ui/src/lib/i18n.ts - 46 + 48 @@ -5585,7 +5713,7 @@ libs/ui/src/lib/i18n.ts - 47 + 49 @@ -5593,7 +5721,7 @@ 固定收益 libs/ui/src/lib/i18n.ts - 48 + 50 @@ -5601,7 +5729,11 @@ 房地产 libs/ui/src/lib/i18n.ts - 50 + 52 + + + libs/ui/src/lib/i18n.ts + 95 @@ -5617,7 +5749,7 @@ 债券 libs/ui/src/lib/i18n.ts - 53 + 55 @@ -5625,7 +5757,7 @@ 加密货币 libs/ui/src/lib/i18n.ts - 56 + 58 @@ -5633,7 +5765,7 @@ 交易所交易基金 libs/ui/src/lib/i18n.ts - 57 + 59 @@ -5641,7 +5773,7 @@ 共同基金 libs/ui/src/lib/i18n.ts - 59 + 61 @@ -5649,7 +5781,7 @@ 贵金属 libs/ui/src/lib/i18n.ts - 60 + 62 @@ -5657,7 +5789,7 @@ 私募股权 libs/ui/src/lib/i18n.ts - 61 + 63 @@ -5665,7 +5797,7 @@ 股票 libs/ui/src/lib/i18n.ts - 62 + 64 @@ -5673,7 +5805,7 @@ 非洲 libs/ui/src/lib/i18n.ts - 69 + 71 @@ -5681,7 +5813,15 @@ 亚洲 libs/ui/src/lib/i18n.ts - 70 + 72 + + + + Communication Services + Communication Services + + libs/ui/src/lib/i18n.ts + 87 @@ -5689,7 +5829,7 @@ 欧洲 libs/ui/src/lib/i18n.ts - 71 + 73 @@ -5697,7 +5837,7 @@ 北美 libs/ui/src/lib/i18n.ts - 72 + 74 @@ -5705,7 +5845,7 @@ 如果您今天退休,您将能够提取 apps/client/src/app/pages/portfolio/fire/fire-page.html - 68 + 69 @@ -5713,7 +5853,7 @@ 大洋洲 libs/ui/src/lib/i18n.ts - 73 + 75 @@ -5721,7 +5861,7 @@ 南美洲 libs/ui/src/lib/i18n.ts - 74 + 76 @@ -5729,7 +5869,7 @@ 极度恐惧 libs/ui/src/lib/i18n.ts - 106 + 79 @@ -5737,7 +5877,7 @@ 极度贪婪 libs/ui/src/lib/i18n.ts - 107 + 80 @@ -5745,7 +5885,7 @@ 中性的 libs/ui/src/lib/i18n.ts - 110 + 83 @@ -5781,15 +5921,15 @@ libs/ui/src/lib/benchmark/benchmark.component.html - 209 + 220 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 453 + 450 libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts - 467 + 464 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5817,7 +5957,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 743 + 749 @@ -5825,7 +5965,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 569 + 573 @@ -5833,15 +5973,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 @@ -5879,6 +6011,10 @@ Job Queue 任务队列 + + apps/client/src/app/pages/admin/admin-page.component.ts + 84 + libs/common/src/lib/routes/routes.ts 46 @@ -5889,7 +6025,7 @@ 市场数据延迟 apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts - 94 + 92 @@ -5905,7 +6041,7 @@ 关闭持仓 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 442 + 446 @@ -5929,15 +6065,15 @@ 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 - 89 + 92 @@ -5969,7 +6105,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 385 + 384 @@ -5977,7 +6113,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 376 @@ -5985,7 +6121,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 381 + 380 @@ -5993,11 +6129,11 @@ 本月至今 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 - 381 + 380 @@ -6005,11 +6141,11 @@ 本周至今 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 - 377 + 376 @@ -6045,7 +6181,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 @@ -6057,7 +6193,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 395 + 394 @@ -6065,11 +6201,11 @@ 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 - 419 + 416 @@ -6110,7 +6246,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 592 + 596 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6122,7 +6258,7 @@ Find a holding... libs/ui/src/lib/assistant/assistant.component.ts - 472 + 469 @@ -6150,7 +6286,7 @@ 哎呀!看来您提出了太多要求。请慢一点。 apps/client/src/app/core/http-response.interceptor.ts - 106 + 103 @@ -6177,14 +6313,6 @@ 61 - - Indonesia - 印度尼西亚 - - libs/ui/src/lib/i18n.ts - 90 - - Activity 活动 @@ -6206,7 +6334,7 @@ 执行作业 apps/client/src/app/components/admin-jobs/admin-jobs.html - 229 + 220 @@ -6214,7 +6342,7 @@ 优先级 apps/client/src/app/components/admin-jobs/admin-jobs.html - 105 + 96 @@ -6222,7 +6350,7 @@ 不允许执行此操作。 apps/client/src/app/core/http-response.interceptor.ts - 67 + 64 @@ -6230,7 +6358,7 @@ 流动性 libs/ui/src/lib/i18n.ts - 49 + 51 @@ -6246,7 +6374,7 @@ 买入和卖出 libs/ui/src/lib/i18n.ts - 8 + 10 @@ -6278,7 +6406,7 @@ Jump to a page... libs/ui/src/lib/assistant/assistant.component.ts - 473 + 470 @@ -6326,7 +6454,7 @@ 包含在 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 377 + 381 @@ -6350,31 +6478,7 @@ 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 125 - - - - Delete Profiles - 删除配置文件 - - apps/client/src/app/components/admin-market-data/admin-market-data.html - 242 - - - - Do you really want to delete these profiles? - 您确定要删除这些配置文件吗? - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 68 - - - - Oops! Could not delete profiles. - 哎呀!无法删除配置文件。 - - apps/client/src/app/components/admin-market-data/admin-market-data.service.ts - 56 + 130 @@ -6406,7 +6510,7 @@ 另类 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 86 @@ -6414,7 +6518,7 @@ 应用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 87 @@ -6422,7 +6526,7 @@ 预算管理 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 88 @@ -6482,7 +6586,15 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 89 + + + + Oops! Could not delete the asset profile. + Oops! Could not delete the asset profile. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 51 @@ -6490,7 +6602,7 @@ 家族办公室 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 87 + 90 @@ -6498,7 +6610,7 @@ 投资者 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 93 @@ -6510,7 +6622,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 91 + 94 @@ -6522,7 +6634,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 96 @@ -6530,7 +6642,7 @@ 隐私 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 97 @@ -6538,7 +6650,7 @@ 软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 99 @@ -6546,7 +6658,7 @@ 工具 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 100 @@ -6554,7 +6666,7 @@ 用户体验 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 101 @@ -6562,7 +6674,7 @@ 财富 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 102 @@ -6570,39 +6682,7 @@ 财富管理 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 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 + 103 @@ -6613,116 +6693,12 @@ 474 - - Canada - 加拿大 + + Do you really want to delete these asset profiles? + Do you really want to delete these asset profiles? - 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 + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 67 @@ -6730,7 +6706,7 @@ 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 734 + 740 @@ -6754,7 +6730,7 @@ 哎呀!无法更新访问权限。 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts - 181 + 194 @@ -6762,7 +6738,7 @@ 基于您总资产的 apps/client/src/app/pages/portfolio/fire/fire-page.html - 96 + 97 @@ -6782,7 +6758,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 597 + 601 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6826,7 +6802,7 @@ libs/ui/src/lib/i18n.ts - 9 + 11 @@ -6834,7 +6810,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 599 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6854,7 +6830,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 124 + 131 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -6862,7 +6838,7 @@ apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html - 133 + 229 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -6874,7 +6850,7 @@ libs/ui/src/lib/i18n.ts - 11 + 13 @@ -6890,7 +6866,7 @@ libs/ui/src/lib/i18n.ts - 33 + 35 @@ -6906,7 +6882,7 @@ 投资组合快照 apps/client/src/app/components/admin-jobs/admin-jobs.html - 65 + 56 @@ -6938,7 +6914,7 @@ 最小阈值 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 52 + 58 @@ -6946,7 +6922,7 @@ 阈值上限 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 87 + 93 @@ -7038,7 +7014,15 @@ , 假设一个 apps/client/src/app/pages/portfolio/fire/fire-page.html - 174 + 175 + + + + Financial Services + Financial Services + + libs/ui/src/lib/i18n.ts + 91 @@ -7061,6 +7045,14 @@ 195 + + Delete + Delete + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 244 + + cannot be self-hosted 无法自托管 @@ -7158,15 +7150,7 @@ 获取来自 50 多个交易所的 80,000+ 股票代码访问权限 libs/ui/src/lib/i18n.ts - 25 - - - - Ukraine - 乌克兰 - - libs/ui/src/lib/i18n.ts - 101 + 27 @@ -7240,7 +7224,7 @@ 阈值范围 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 9 + 15 @@ -7372,7 +7356,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 608 + 612 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7396,7 +7380,7 @@ apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html - 130 + 139 apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html @@ -7420,11 +7404,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 +7448,7 @@ AI 提示已复制到剪贴板 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 211 @@ -7480,7 +7464,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7488,7 +7472,7 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7496,7 +7480,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 482 + 486 @@ -7504,7 +7488,7 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 519 + 523 @@ -7512,7 +7496,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 535 + 539 @@ -7520,7 +7504,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 495 + 499 @@ -7528,7 +7512,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 235 + 239 @@ -7536,7 +7520,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 239 + 243 @@ -7544,7 +7528,7 @@ 打开 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 212 @@ -7560,11 +7544,11 @@ 涨跌 libs/ui/src/lib/holdings-table/holdings-table.component.html - 138 + 143 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 381 + 380 @@ -7576,19 +7560,19 @@ 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 - 381 + 380 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts - 394 + 393 @@ -7623,30 +7607,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 +7652,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 +7664,7 @@ 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 240 + 261 @@ -7715,14 +7675,6 @@ 239 - - United Kingdom - 英国 - - libs/ui/src/lib/i18n.ts - 102 - - Terms of Service 服务条款 @@ -7769,7 +7721,7 @@ () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 675 + 681 @@ -7777,7 +7729,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 683 + 689 @@ -7841,7 +7793,7 @@ 某人 apps/client/src/app/pages/public/public-page.component.ts - 62 + 63 @@ -7873,7 +7825,7 @@ 您确定要删除此项目吗? libs/ui/src/lib/benchmark/benchmark.component.ts - 137 + 141 @@ -7881,7 +7833,7 @@ 登出 apps/client/src/app/components/header/header.component.html - 325 + 330 @@ -8128,7 +8080,7 @@ 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 205 + 208 @@ -8293,7 +8245,7 @@ 您真的想要生成一个新的安全令牌吗? apps/client/src/app/components/user-account-access/user-account-access.component.ts - 172 + 184 @@ -8349,7 +8301,7 @@ 管理资产概况 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html - 467 + 471 @@ -8357,7 +8309,7 @@ 另类投资 libs/ui/src/lib/i18n.ts - 45 + 47 @@ -8365,7 +8317,7 @@ 收藏品 libs/ui/src/lib/i18n.ts - 55 + 57 @@ -8373,7 +8325,7 @@ 平均单位价格 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts - 113 + 123 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index f596de5f4..45901baec 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -1,5 +1,6 @@ import { InfoResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; +import { registerChartConfiguration } from '@ghostfolio/ui/chart'; import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { GfNotificationModule } from '@ghostfolio/ui/notifications'; @@ -58,6 +59,8 @@ import { environment } from './environments/environment'; enableProdMode(); } + registerChartConfiguration(); + await bootstrapApplication(GfAppComponent, { providers: [ authInterceptorProviders, diff --git a/apps/client/src/styles.scss b/apps/client/src/styles.scss index 4321622a1..045de2eb6 100644 --- a/apps/client/src/styles.scss +++ b/apps/client/src/styles.scss @@ -1,10 +1,11 @@ @use '@angular/material' as mat; +@use 'sass:color'; -@import './styles/bootstrap'; -@import './styles/table'; -@import './styles/variables'; +@use './styles/bootstrap'; +@use './styles/table' as table; +@use './styles/variables' as variables; -@import 'svgmap/style.min'; +@use 'svgmap/style.min'; :root { --dark-background: rgb(25, 25, 25); @@ -12,8 +13,10 @@ --light-background: rgb(255, 255, 255); --dark-primary-text: - #{red($dark-primary-text)}, #{green($dark-primary-text)}, - #{blue($dark-primary-text)}, #{alpha($dark-primary-text)}; + #{color.channel(variables.$dark-primary-text, 'red')}, + #{color.channel(variables.$dark-primary-text, 'green')}, + #{color.channel(variables.$dark-primary-text, 'blue')}, + #{color.channel(variables.$dark-primary-text, 'alpha')}; --dark-secondary-text: 0, 0, 0, 0.54; --dark-accent-text: 0, 0, 0, 0.87; --dark-warn-text: 0, 0, 0, 0.87; @@ -21,8 +24,10 @@ --dark-dividers: 0, 0, 0, 0.12; --dark-focused: 0, 0, 0, 0.12; --light-primary-text: - #{red($light-primary-text)}, #{green($light-primary-text)}, - #{blue($light-primary-text)}, #{alpha($light-primary-text)}; + #{color.channel(variables.$light-primary-text, 'red')}, + #{color.channel(variables.$light-primary-text, 'green')}, + #{color.channel(variables.$light-primary-text, 'blue')}, + #{color.channel(variables.$light-primary-text, 'alpha')}; --light-secondary-text: 255, 255, 255, 0.7; --light-accent-text: 255, 255, 255, 1; --light-warn-text: 255, 255, 255, 1; @@ -240,7 +245,7 @@ body { } .gf-table { - @include gf-table(true); + @include table.gf-table(true); } .mat-mdc-dialog-container { @@ -353,7 +358,7 @@ ngx-skeleton-loader { } .gf-table { - @include gf-table; + @include table.gf-table; } .gf-text-wrap-balance { diff --git a/apps/client/src/styles/theme.scss b/apps/client/src/styles/theme.scss index f8a194651..75ecc210d 100644 --- a/apps/client/src/styles/theme.scss +++ b/apps/client/src/styles/theme.scss @@ -312,7 +312,10 @@ $gf-typography: ( @include mat.checkbox-overrides( ( - selected-icon-color: var(--gf-theme-primary-500) + selected-focus-icon-color: var(--gf-theme-primary-500), + selected-hover-icon-color: var(--gf-theme-primary-500), + selected-icon-color: var(--gf-theme-primary-500), + selected-pressed-icon-color: var(--gf-theme-primary-500) ) ); @@ -392,8 +395,11 @@ $gf-typography: ( @include mat.tabs-overrides( ( + active-focus-indicator-color: var(--gf-theme-primary-500), active-focus-label-text-color: var(--gf-theme-primary-500), + active-hover-indicator-color: var(--gf-theme-primary-500), active-hover-label-text-color: var(--gf-theme-primary-500), + active-indicator-color: var(--gf-theme-primary-500), active-label-text-color: var(--gf-theme-primary-500), active-ripple-color: var(--gf-theme-primary-500), inactive-ripple-color: var(--gf-theme-primary-500) diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 28d902d71..4924aaeea 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -13,8 +13,6 @@ export const ghostfolioFearAndGreedIndexSymbol = `${ghostfolioScraperApiSymbolPr export const ghostfolioFearAndGreedIndexSymbolCryptocurrencies = `${ghostfolioPrefix}_FEAR_AND_GREED_INDEX_CRYPTOCURRENCIES`; export const ghostfolioFearAndGreedIndexSymbolStocks = `${ghostfolioPrefix}_FEAR_AND_GREED_INDEX_STOCKS`; -export const locale = 'en-US'; - export const primaryColorHex = '#36cfcc'; export const primaryColorRgb = { r: 54, @@ -85,6 +83,7 @@ export const DEFAULT_DATE_FORMAT_MONTH_YEAR = 'MMM yyyy'; export const DEFAULT_DATE_RANGE: DateRange = 'max'; export const DEFAULT_HOST = '0.0.0.0'; export const DEFAULT_LANGUAGE_CODE = 'en'; +export const DEFAULT_LOCALE = 'en-US'; export const DEFAULT_PAGE_SIZE = 50; export const DEFAULT_PORT = 3333; export const DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY = 1; @@ -252,6 +251,8 @@ export const PROPERTY_IS_DATA_GATHERING_ENABLED = 'IS_DATA_GATHERING_ENABLED'; export const PROPERTY_IS_READ_ONLY_MODE = 'IS_READ_ONLY_MODE'; export const PROPERTY_IS_USER_SIGNUP_ENABLED = 'IS_USER_SIGNUP_ENABLED'; export const PROPERTY_OPENROUTER_MODEL = 'OPENROUTER_MODEL'; +export const PROPERTY_OPENROUTER_MODEL_WEB_FETCH = 'OPENROUTER_MODEL_WEB_FETCH'; +export const PROPERTY_REFERRAL_PARTNERS = 'REFERRAL_PARTNERS'; export const PROPERTY_SLACK_COMMUNITY_USERS = 'SLACK_COMMUNITY_USERS'; export const PROPERTY_STRIPE_CONFIG = 'STRIPE_CONFIG'; export const PROPERTY_SYSTEM_MESSAGE = 'SYSTEM_MESSAGE'; @@ -282,6 +283,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/dtos/index.ts b/libs/common/src/lib/dtos/index.ts index 346a6434f..cd3675aa5 100644 --- a/libs/common/src/lib/dtos/index.ts +++ b/libs/common/src/lib/dtos/index.ts @@ -14,6 +14,7 @@ import { DeleteOwnUserDto } from './delete-own-user.dto'; import { TransferBalanceDto } from './transfer-balance.dto'; import { UpdateAccessDto } from './update-access.dto'; import { UpdateAccountDto } from './update-account.dto'; +import { UpdateAssetProfileDataDto } from './update-asset-profile-data.dto'; import { UpdateAssetProfileDto } from './update-asset-profile.dto'; import { UpdateBulkMarketDataDto } from './update-bulk-market-data.dto'; import { UpdateMarketDataDto } from './update-market-data.dto'; @@ -41,6 +42,7 @@ export { TransferBalanceDto, UpdateAccessDto, UpdateAccountDto, + UpdateAssetProfileDataDto, UpdateAssetProfileDto, UpdateBulkMarketDataDto, UpdateMarketDataDto, diff --git a/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts b/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts new file mode 100644 index 000000000..a2f600fcd --- /dev/null +++ b/libs/common/src/lib/dtos/update-asset-profile-data.dto.ts @@ -0,0 +1,16 @@ +import { Prisma } from '@prisma/client'; +import { IsArray, IsOptional } from 'class-validator'; + +export class UpdateAssetProfileDataDto { + @IsArray() + @IsOptional() + countries?: Prisma.InputJsonArray; + + @IsArray() + @IsOptional() + holdings?: Prisma.InputJsonArray; + + @IsArray() + @IsOptional() + sectors?: Prisma.InputJsonArray; +} diff --git a/libs/common/src/lib/dtos/update-asset-profile.dto.ts b/libs/common/src/lib/dtos/update-asset-profile.dto.ts index a4981493e..1c8af3e72 100644 --- a/libs/common/src/lib/dtos/update-asset-profile.dto.ts +++ b/libs/common/src/lib/dtos/update-asset-profile.dto.ts @@ -36,6 +36,10 @@ export class UpdateAssetProfileDto { @IsOptional() dataSource?: DataSource; + @IsArray() + @IsOptional() + holdings?: Prisma.InputJsonArray; + @IsBoolean() @IsOptional() isActive?: boolean; diff --git a/libs/common/src/lib/helper.spec.ts b/libs/common/src/lib/helper.spec.ts index a339c6dab..6a6fe4773 100644 --- a/libs/common/src/lib/helper.spec.ts +++ b/libs/common/src/lib/helper.spec.ts @@ -1,6 +1,8 @@ import { extractNumberFromString, - getNumberFormatGroup + getNumberFormatGroup, + isCurrency, + isCurrencySymbol } from '@ghostfolio/common/helper'; describe('Helper', () => { @@ -116,4 +118,61 @@ describe('Helper', () => { expect(getNumberFormatGroup()).toEqual(','); }); }); + + describe('Is currency', () => { + it('ISO 4217 currency code', () => { + expect(isCurrency('USD')).toEqual(true); + }); + + it('Derived currency', () => { + expect(isCurrency('GBp')).toEqual(true); + }); + + it('Non-currency', () => { + expect(isCurrency('AAPL')).toEqual(false); + }); + + it('Empty currency', () => { + expect(isCurrency('')).toEqual(false); + }); + }); + + describe('Is currency symbol', () => { + it('Currency symbol (default currency as base)', () => { + expect(isCurrencySymbol('USDCHF')).toEqual(true); + expect(isCurrencySymbol('USDZAR')).toEqual(true); + }); + + it('Currency symbol (default currency as quote)', () => { + expect(isCurrencySymbol('EURUSD')).toEqual(true); + }); + + it('Currency symbol (derived currency)', () => { + expect(isCurrencySymbol('USDGBp')).toEqual(true); + }); + + it('Stock symbol with currency-like prefix', () => { + expect(isCurrencySymbol('ERNA.L')).toEqual(false); + }); + + it('Cryptocurrency symbol', () => { + expect(isCurrencySymbol('BTCUSD')).toEqual(false); + }); + + it('Stock symbol', () => { + expect(isCurrencySymbol('AAPL')).toEqual(false); + }); + + it('Symbol with non-currency suffix', () => { + expect(isCurrencySymbol('USD.AX')).toEqual(false); + }); + + it('Plain currency code', () => { + expect(isCurrencySymbol('USD')).toEqual(false); + }); + + it('Empty symbol', () => { + expect(isCurrencySymbol('')).toEqual(false); + }); + }); }); diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index c5f6cbbb9..5bd6671f2 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 { @@ -29,16 +36,16 @@ import { get, isNil, isString } from 'lodash'; import { DEFAULT_CURRENCY, + DEFAULT_LOCALE, DERIVED_CURRENCIES, ghostfolioFearAndGreedIndexSymbol, ghostfolioFearAndGreedIndexSymbolCryptocurrencies, ghostfolioFearAndGreedIndexSymbolStocks, - ghostfolioScraperApiSymbolPrefix, - locale + ghostfolioScraperApiSymbolPrefix } from './config'; import { - AdminMarketDataItem, AssetProfileIdentifier, + AssetProfileItem, Benchmark } from './interfaces'; import { BenchmarkTrend, ColorScheme } from './types'; @@ -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 @@ -106,7 +149,7 @@ export function canDeleteAssetProfile({ symbol, watchedByCount }: Pick< - AdminMarketDataItem, + AssetProfileItem, 'activitiesCount' | 'isBenchmark' | 'symbol' | 'watchedByCount' >): boolean { return ( @@ -215,6 +258,18 @@ export function getCurrencyFromSymbol(aSymbol = '') { return aSymbol.replace(DEFAULT_CURRENCY, ''); } +export function getCountryName({ code }: { code: string }): string { + try { + return ( + new Intl.DisplayNames([document.documentElement.lang || DEFAULT_LOCALE], { + type: 'region' + }).of(code) ?? code + ); + } catch { + return code; + } +} + export function getDateFnsLocale(aLanguageCode?: string) { if (aLanguageCode === 'ca') { return ca; @@ -283,7 +338,7 @@ export function getEmojiFlag(aCountryCode: string) { } export function getLocale() { - return navigator.language ?? locale; + return navigator.language ?? DEFAULT_LOCALE; } export function getLowercase(object: object, path: string) { @@ -388,6 +443,20 @@ export function isCurrency(aCurrency: string) { return isISO4217CurrencyCode(aCurrency) || isDerivedCurrency(aCurrency); } +export function isCurrencySymbol(aSymbol: string) { + if (!aSymbol) { + return false; + } + + return ( + aSymbol.length >= 2 * DEFAULT_CURRENCY.length && + isCurrency( + aSymbol.substring(0, aSymbol.length - DEFAULT_CURRENCY.length) + ) && + isCurrency(aSymbol.substring(aSymbol.length - DEFAULT_CURRENCY.length)) + ); +} + export function isDerivedCurrency(aCurrency: string) { if (aCurrency === 'USX') { return true; diff --git a/libs/common/src/lib/interfaces/admin-user.interface.ts b/libs/common/src/lib/interfaces/admin-user.interface.ts index 4cb02b16e..a7cda68a8 100644 --- a/libs/common/src/lib/interfaces/admin-user.interface.ts +++ b/libs/common/src/lib/interfaces/admin-user.interface.ts @@ -12,4 +12,5 @@ export interface AdminUser { provider: Provider; role: Role; subscription?: Subscription; + subscriptions?: Subscription[]; } diff --git a/libs/common/src/lib/interfaces/admin-market-data.interface.ts b/libs/common/src/lib/interfaces/asset-profile-item.interface.ts similarity index 79% rename from libs/common/src/lib/interfaces/admin-market-data.interface.ts rename to libs/common/src/lib/interfaces/asset-profile-item.interface.ts index 953f94e26..14e8471c1 100644 --- a/libs/common/src/lib/interfaces/admin-market-data.interface.ts +++ b/libs/common/src/lib/interfaces/asset-profile-item.interface.ts @@ -1,14 +1,10 @@ import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; -export interface AdminMarketData { - count: number; - marketData: AdminMarketDataItem[]; -} - -export interface AdminMarketDataItem { +export interface AssetProfileItem { activitiesCount: number; assetClass?: AssetClass; assetSubClass?: AssetSubClass; + comment?: string; countriesCount: number; currency: string; dataSource: DataSource; @@ -16,6 +12,7 @@ export interface AdminMarketDataItem { id: string; isActive: boolean; isBenchmark?: boolean; + isin?: string; isUsedByUsersWithSubscription?: boolean; lastMarketPrice: number; marketDataItemCount: number; diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index f21830684..44c180726 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -4,13 +4,10 @@ import type { Activity, ActivityError } from './activities.interface'; import type { AdminData } from './admin-data.interface'; import type { AdminJobs } from './admin-jobs.interface'; import type { AdminMarketDataDetails } from './admin-market-data-details.interface'; -import type { - AdminMarketData, - AdminMarketDataItem -} from './admin-market-data.interface'; import type { AdminUser } from './admin-user.interface'; import type { AssetClassSelectorOption } from './asset-class-selector-option.interface'; import type { AssetProfileIdentifier } from './asset-profile-identifier.interface'; +import type { AssetProfileItem } from './asset-profile-item.interface'; import type { BenchmarkProperty } from './benchmark-property.interface'; import type { Benchmark } from './benchmark.interface'; import type { Coupon } from './coupon.interface'; @@ -25,7 +22,10 @@ import type { HoldingWithParents } from './holding-with-parents.interface'; import type { Holding } from './holding.interface'; import type { InfoItem } from './info-item.interface'; import type { InvestmentItem } from './investment-item.interface'; -import type { LineChartItem } from './line-chart-item.interface'; +import type { + LineChartItem, + NullableLineChartItem +} from './line-chart-item.interface'; import type { LookupItem } from './lookup-item.interface'; import type { MarketData } from './market-data.interface'; import type { PortfolioChart } from './portfolio-chart.interface'; @@ -35,6 +35,7 @@ import type { PortfolioPosition } from './portfolio-position.interface'; import type { PortfolioReportRule } from './portfolio-report-rule.interface'; import type { PortfolioSummary } from './portfolio-summary.interface'; import type { Product } from './product'; +import type { ReferralPartner } from './referral-partner.interface'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; import type { AccountResponse } from './responses/account-response.interface'; @@ -46,6 +47,7 @@ import type { AdminUsersResponse } from './responses/admin-users-response.interf import type { AiPromptResponse } from './responses/ai-prompt-response.interface'; import type { AiServiceHealthResponse } from './responses/ai-service-health-response.interface'; import type { ApiKeyResponse } from './responses/api-key-response.interface'; +import type { AssetProfilesResponse } from './responses/asset-profiles-response.interface'; import type { AssetResponse } from './responses/asset-response.interface'; import type { BenchmarkMarketDataDetailsResponse } from './responses/benchmark-market-data-details-response.interface'; import type { BenchmarkResponse } from './responses/benchmark-response.interface'; @@ -112,9 +114,7 @@ export { ActivityResponse, AdminData, AdminJobs, - AdminMarketData, AdminMarketDataDetails, - AdminMarketDataItem, AdminUser, AdminUserResponse, AdminUsersResponse, @@ -124,6 +124,8 @@ export { AssertionCredentialJSON, AssetClassSelectorOption, AssetProfileIdentifier, + AssetProfileItem, + AssetProfilesResponse, AssetResponse, AttestationCredentialJSON, Benchmark, @@ -160,6 +162,7 @@ export { MarketData, MarketDataDetailsResponse, MarketDataOfMarketsResponse, + NullableLineChartItem, OAuthResponse, PlatformsResponse, PortfolioChart, @@ -179,6 +182,7 @@ export { PublicKeyCredentialRequestOptionsJSON, PublicPortfolioResponse, QuotesResponse, + ReferralPartner, ResponseError, RuleSettings, ScraperConfiguration, diff --git a/libs/common/src/lib/interfaces/line-chart-item.interface.ts b/libs/common/src/lib/interfaces/line-chart-item.interface.ts index e010ddfe6..43208f853 100644 --- a/libs/common/src/lib/interfaces/line-chart-item.interface.ts +++ b/libs/common/src/lib/interfaces/line-chart-item.interface.ts @@ -1,4 +1,6 @@ -export interface LineChartItem { +export interface LineChartItem { date: string; - value: number; + value: T; } + +export type NullableLineChartItem = LineChartItem; 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/interfaces/referral-partner.interface.ts b/libs/common/src/lib/interfaces/referral-partner.interface.ts new file mode 100644 index 000000000..435070fa5 --- /dev/null +++ b/libs/common/src/lib/interfaces/referral-partner.interface.ts @@ -0,0 +1,3 @@ +export interface ReferralPartner { + name: string; +} diff --git a/libs/common/src/lib/interfaces/responses/asset-profiles-response.interface.ts b/libs/common/src/lib/interfaces/responses/asset-profiles-response.interface.ts new file mode 100644 index 000000000..e73e4c64f --- /dev/null +++ b/libs/common/src/lib/interfaces/responses/asset-profiles-response.interface.ts @@ -0,0 +1,6 @@ +import { AssetProfileItem } from '../asset-profile-item.interface'; + +export interface AssetProfilesResponse { + assetProfiles: AssetProfileItem[]; + count: number; +} diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index 76bc7dc02..3b07666c9 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -9,6 +9,19 @@ import { Tag } from '@prisma/client'; export interface PortfolioHoldingResponse { activitiesCount: number; + assetProfile: Pick< + EnhancedSymbolProfile, + | 'assetClass' + | 'assetSubClass' + | 'countries' + | 'currency' + | 'dataSource' + | 'isin' + | 'name' + | 'sectors' + | 'symbol' + | 'userId' + >; averagePrice: number; dataProviderInfo: DataProviderInfo; dateOfFirstActivity: string; @@ -31,7 +44,10 @@ export interface PortfolioHoldingResponse { netPerformanceWithCurrencyEffect: number; performances: Benchmark['performances']; quantity: number; + + /* @deprecated */ SymbolProfile: EnhancedSymbolProfile; + tags: Tag[]; value: number; } diff --git a/libs/common/src/lib/interfaces/user.interface.ts b/libs/common/src/lib/interfaces/user.interface.ts index e60f01915..619d4ee71 100644 --- a/libs/common/src/lib/interfaces/user.interface.ts +++ b/libs/common/src/lib/interfaces/user.interface.ts @@ -3,6 +3,7 @@ import { AccountWithPlatform } from '@ghostfolio/common/types'; import { Access, Tag } from '@prisma/client'; +import { ReferralPartner } from './referral-partner.interface'; import { SubscriptionOffer } from './subscription-offer.interface'; import { SystemMessage } from './system-message.interface'; import { UserSettings } from './user-settings.interface'; @@ -15,6 +16,7 @@ export interface User { dateOfFirstActivity: Date; id: string; permissions: string[]; + referralPartners?: ReferralPartner[]; settings: UserSettings; systemMessage?: SystemMessage; subscription: { diff --git a/libs/common/src/lib/personal-finance-tools.ts b/libs/common/src/lib/personal-finance-tools.ts index 063b4254c..744081464 100644 --- a/libs/common/src/lib/personal-finance-tools.ts +++ b/libs/common/src/lib/personal-finance-tools.ts @@ -1,13 +1,25 @@ import { Product } from '@ghostfolio/common/interfaces'; export const personalFinanceTools: Product[] = [ + { + hasFreePlan: true, + hasSelfHostingAbility: true, + key: 'acemoney', + name: 'AceMoney', + note: 'License is a perpetual license', + origin: 'US', + pricingPerYear: '$44.95', + slogan: 'Lifetime Personal Finance Control, One Single Payment.', + url: 'https://www.mechcad.net' + }, { founded: 2023, hasSelfHostingAbility: false, 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 +27,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 +54,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 +64,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 +76,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 +87,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 +105,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 +126,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 +135,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 +146,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 +157,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 +175,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 +213,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 +223,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 +235,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 +254,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 +293,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 +305,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 +317,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 +329,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 +339,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 +350,37 @@ 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: 2015, + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'everydollar', + name: 'EveryDollar', + origin: 'US', + slogan: 'Plan, track, find more margin', + url: 'https://www.ramseysolutions.com/money/everydollar' }, { founded: 2020, @@ -333,19 +388,32 @@ 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' + }, + { + hasFreePlan: false, + hasSelfHostingAbility: true, + key: 'expersoft', + name: 'Expersoft', + origin: 'CH', + slogan: 'Investment Management Platforms', + url: 'https://www.expersoft.com' }, { founded: 2018, hasFreePlan: false, hasSelfHostingAbility: false, + isArchived: true, key: 'fey', name: 'Fey', - origin: 'Canada', + note: 'Fey was discontinued in 2025', + origin: 'CA', pricingPerYear: '$300', - slogan: 'Make better investments.' + slogan: 'Make better investments.', + url: 'https://fey.com' }, { founded: 2023, @@ -354,9 +422,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 +433,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 +454,46 @@ 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: 2015, + hasFreePlan: false, + key: 'fincite', + name: 'Fincite', + origin: 'DE', + slogan: 'Wealth Management Software', + url: 'https://fincite.de' }, { 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 +502,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 +513,21 @@ 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' + }, + { + founded: 1993, + hasSelfHostingAbility: true, + key: 'fund-manager', + name: 'Fund Manager', + note: 'License is a perpetual license', + origin: 'US', + pricingPerYear: '$99', + slogan: 'Powerful portfolio management software', + url: 'https://www.fundmanagersoftware.com' }, { hasFreePlan: true, @@ -445,10 +542,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 +555,19 @@ 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, + hasSelfHostingAbility: false, + key: 'goodbudget', + name: 'Goodbudget', + origin: 'US', + slogan: 'Budget with a why', + url: 'https://goodbudget.com' }, { hasFreePlan: true, @@ -468,17 +576,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 +607,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 +617,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 +627,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 +636,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 +647,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 +659,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 +670,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 +680,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 +691,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 +702,19 @@ 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: 2020, + hasFreePlan: false, + hasSelfHostingAbility: false, + key: 'lunch-money', + name: 'Lunch Money', + origin: 'CA', + slogan: 'Delightfully simple personal finance and budgeting', + url: 'https://lunchmoney.app' }, { founded: 2018, @@ -583,9 +722,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 +734,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 +758,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 +770,21 @@ 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' + }, + { + hasFreePlan: false, + hasSelfHostingAbility: false, + key: 'mezzi', + name: 'Mezzi', + origin: 'US', + pricingPerYear: '$48', + slogan: 'Self-manage your wealth. Get fiduciary advice.', + url: 'https://www.mezzi.com' }, { founded: 1991, @@ -639,7 +793,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 +801,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 +812,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 +823,36 @@ 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' + }, + { + hasFreePlan: true, + hasSelfHostingAbility: true, + key: 'moneywell', + name: 'MoneyWell', + origin: 'US', + slogan: 'Personal Budgeting Software for Mac and iOS', + url: 'https://moneywell.app' }, { 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 +860,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 +870,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 +881,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 +902,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 +913,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 +934,44 @@ 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' + }, + { + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'patrice', + languages: [ + 'Deutsch', + 'English', + 'Español', + 'Français', + 'Italiano', + 'Português' + ], + name: 'Patrice', + pricingPerYear: '€49', + slogan: 'Votre patrimoine, enfin clair', + url: 'https://mypatrice.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 +979,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 +991,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 +1011,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 +1023,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 +1035,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 +1047,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 +1066,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 +1077,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 +1088,37 @@ 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' + }, + { + hasSelfHostingAbility: false, + key: 'quantive', + name: 'Quantive', + slogan: 'See your financial life clearly', + url: 'https://usequantive.app' + }, + { + 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 +1127,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 +1136,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 +1155,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 +1174,19 @@ 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: 2020, + hasFreePlan: false, + hasSelfHostingAbility: false, + key: 'simplifi', + name: 'Simplifi by Quicken', + origin: 'US', + url: 'https://www.quicken.com/products/simplifi' }, { founded: 2014, @@ -940,9 +1194,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 +1205,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 +1221,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 +1247,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 +1258,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 +1290,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 +1322,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 +1332,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,19 +1343,30 @@ 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 }, + { + hasFreePlan: true, + hasSelfHostingAbility: false, + key: 'valuedge', + name: 'ValuEdge', + pricingPerYear: '€78', + slogan: 'Track your real portfolio. Not a watchlist.', + url: 'https://valuedge.app' + }, { founded: 2020, 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 +1374,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 +1386,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 +1396,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 +1408,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 +1419,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 +1430,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 +1439,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 +1458,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 +1468,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 +1479,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.html b/libs/ui/src/lib/account-balances/account-balances.component.html index 29037a985..ee1450435 100644 --- a/libs/ui/src/lib/account-balances/account-balances.component.html +++ b/libs/ui/src/lib/account-balances/account-balances.component.html @@ -16,7 +16,12 @@ - + (); 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); @@ -83,12 +85,24 @@ export class GfAccountBalancesComponent implements OnChanges, OnInit { public dataSource = new MatTableDataSource< AccountBalancesResponse['balances'][0] >(); + public maxDate = new Date(); private dateAdapter = inject>(DateAdapter); private notificationService = inject(NotificationService); 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/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html index 1ba0ecc56..daedd5d66 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -49,7 +49,7 @@ Name - + @if (element.platform?.url) { Name -

    -
    - {{ element.SymbolProfile?.name }} - @if (element.isDraft) { - Draft - } -
    +
    + {{ element.SymbolProfile?.name }} + @if (element.isDraft) { + Draft + }
    @if ( element.SymbolProfile?.dataSource !== 'MANUAL' && @@ -347,7 +345,9 @@ [url]="element.account?.platform?.url" /> } - {{ element.account?.name }} + {{ + element.account?.name + }}
    diff --git a/libs/ui/src/lib/assistant/assistant.component.ts b/libs/ui/src/lib/assistant/assistant.component.ts index 3c162a310..3f8efa6ec 100644 --- a/libs/ui/src/lib/assistant/assistant.component.ts +++ b/libs/ui/src/lib/assistant/assistant.component.ts @@ -3,7 +3,7 @@ import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces'; import { InternalRoute } from '@ghostfolio/common/routes/interfaces/internal-route.interface'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { AccountWithPlatform, DateRange } from '@ghostfolio/common/types'; -import { AdminService, DataService } from '@ghostfolio/ui/services'; +import { DataService } from '@ghostfolio/ui/services'; import { FocusKeyManager } from '@angular/cdk/a11y'; import { @@ -155,7 +155,6 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { private preselectionTimeout: ReturnType; public constructor( - private adminService: AdminService, private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, private destroyRef: DestroyRef @@ -397,19 +396,17 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { }); } - if (this.user?.settings?.isExperimentalFeatures) { - this.dateRangeOptions = this.dateRangeOptions.concat( - eachYearOfInterval({ - end: new Date(), - start: this.user?.dateOfFirstActivity ?? new Date() + this.dateRangeOptions = this.dateRangeOptions.concat( + eachYearOfInterval({ + end: new Date(), + start: this.user?.dateOfFirstActivity ?? new Date() + }) + .map((date) => { + return { label: format(date, 'yyyy'), value: format(date, 'yyyy') }; }) - .map((date) => { - return { label: format(date, 'yyyy'), value: format(date, 'yyyy') }; - }) - .slice(0, -1) - .reverse() - ); - } + .slice(0, -1) + .reverse() + ); if ( this.user?.dateOfFirstActivity && @@ -676,8 +673,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { private searchAssetProfiles( aSearchTerm: string ): Observable { - return this.adminService - .fetchAdminMarketData({ + return this.dataService + .fetchAssetProfiles({ filters: [ { id: aSearchTerm, @@ -690,8 +687,8 @@ export class GfAssistantComponent implements OnChanges, OnDestroy, OnInit { catchError(() => { return EMPTY; }), - map(({ marketData }) => { - return marketData.map( + map(({ assetProfiles }) => { + return assetProfiles.map( ({ assetSubClass, currency, dataSource, name, symbol }) => { return { currency, diff --git a/libs/ui/src/lib/chart/chart.registry.ts b/libs/ui/src/lib/chart/chart.registry.ts index 465d6e716..a6a8b3e55 100644 --- a/libs/ui/src/lib/chart/chart.registry.ts +++ b/libs/ui/src/lib/chart/chart.registry.ts @@ -1,6 +1,7 @@ import { getTooltipPositionerMapTop } from '@ghostfolio/common/chart-helper'; -import { Tooltip, TooltipPositionerFunction, ChartType } from 'chart.js'; +import { Chart, Tooltip, TooltipPositionerFunction, ChartType } from 'chart.js'; +import annotationPlugin from 'chartjs-plugin-annotation'; interface VerticalHoverLinePluginOptions { color?: string; @@ -23,6 +24,10 @@ export function registerChartConfiguration() { return; } + // Register the annotation plugin early so that every chart is initialized + // with its state and does not crash on interaction + Chart.register(annotationPlugin); + Tooltip.positioners.top = function (_elements, eventPosition) { return getTooltipPositionerMapTop(this.chart, eventPosition); }; diff --git a/libs/ui/src/lib/fab/fab.component.scss b/libs/ui/src/lib/fab/fab.component.scss index ab6353981..78cfe47e2 100644 --- a/libs/ui/src/lib/fab/fab.component.scss +++ b/libs/ui/src/lib/fab/fab.component.scss @@ -1,14 +1,32 @@ :host { - bottom: calc(constant(safe-area-inset-bottom) + 2rem); - bottom: calc(env(safe-area-inset-bottom) + 2rem); - position: fixed; - right: 2rem; - z-index: 999; + 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) { - bottom: calc(constant(safe-area-inset-bottom) + 5rem); - bottom: calc(env(safe-area-inset-bottom) + 5rem); + 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/fire-calculator/fire-calculator.component.html b/libs/ui/src/lib/fire-calculator/fire-calculator.component.html index 4f9ac456c..125c69a12 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.html +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.html @@ -81,7 +81,7 @@
    diff --git a/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts b/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts index 0872c2aac..ad80499d7 100644 --- a/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts +++ b/libs/ui/src/lib/fire-calculator/fire-calculator.component.stories.ts @@ -1,4 +1,4 @@ -import { locale } from '@ghostfolio/common/config'; +import { DEFAULT_LOCALE } from '@ghostfolio/common/config'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; @@ -47,7 +47,7 @@ export const Simple: Story = { annualInterestRate: 5, currency: 'USD', fireWealth: 50000, - locale: locale, + locale: DEFAULT_LOCALE, savingsRate: 1000 } }; diff --git a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts index cde180dd9..f99c34b03 100644 --- a/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts +++ b/libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts @@ -68,7 +68,7 @@ export class GfHistoricalMarketDataEditorComponent @Input() currency: string; @Input() dataSource: DataSource; - @Input() dateOfFirstActivity: string; + @Input() dateOfFirstActivity: Date; @Input() symbol: string; @Input() user: User; @@ -124,7 +124,7 @@ export class GfHistoricalMarketDataEditorComponent public ngOnChanges() { if (this.dateOfFirstActivity) { - let date = parseISO(this.dateOfFirstActivity); + let date = this.dateOfFirstActivity; const missingMarketData: { date: Date; marketPrice?: number }[] = []; @@ -174,7 +174,7 @@ export class GfHistoricalMarketDataEditorComponent const dates = Object.keys(this.marketDataByMonth).sort(); const startDateString = first(dates); const startDate = min([ - parseISO(this.dateOfFirstActivity), + this.dateOfFirstActivity, ...(startDateString ? [parseISO(startDateString)] : []) ]); const endDateString = last(dates); 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/line-chart/line-chart.component.html b/libs/ui/src/lib/line-chart/line-chart.component.html index e9a5bbbe0..7f115967f 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.html +++ b/libs/ui/src/lib/line-chart/line-chart.component.html @@ -7,7 +7,4 @@ }" /> } - + diff --git a/libs/ui/src/lib/line-chart/line-chart.component.ts b/libs/ui/src/lib/line-chart/line-chart.component.ts index dd972bc5a..92ee8e4ec 100644 --- a/libs/ui/src/lib/line-chart/line-chart.component.ts +++ b/libs/ui/src/lib/line-chart/line-chart.component.ts @@ -12,7 +12,6 @@ import { import { LineChartItem } from '@ghostfolio/common/interfaces'; import { ColorScheme } from '@ghostfolio/common/types'; -import { CommonModule } from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, @@ -43,7 +42,7 @@ import { registerChartConfiguration } from '../chart'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, NgxSkeletonLoaderModule], + imports: [NgxSkeletonLoaderModule], selector: 'gf-line-chart', styleUrls: ['./line-chart.component.scss'], templateUrl: './line-chart.component.html' diff --git a/libs/ui/src/lib/page-tabs/interfaces/interfaces.ts b/libs/ui/src/lib/page-tabs/interfaces/interfaces.ts index 7b18b26ec..3d44d2870 100644 --- a/libs/ui/src/lib/page-tabs/interfaces/interfaces.ts +++ b/libs/ui/src/lib/page-tabs/interfaces/interfaces.ts @@ -1,6 +1,11 @@ -export interface TabConfiguration { +interface BaseTabConfiguration { iconName: string; label: string; - routerLink: string[]; showCondition?: boolean; } + +export type TabConfiguration = BaseTabConfiguration & + ( + | { onClick: () => void; routerLink?: never } + | { onClick?: never; routerLink: string[] } + ); diff --git a/libs/ui/src/lib/page-tabs/page-tabs.component.html b/libs/ui/src/lib/page-tabs/page-tabs.component.html index fa9af9b11..2898bcc79 100644 --- a/libs/ui/src/lib/page-tabs/page-tabs.component.html +++ b/libs/ui/src/lib/page-tabs/page-tabs.component.html @@ -10,21 +10,44 @@ > @for (tab of tabs(); track tab) { @if (tab.showCondition !== false) { - - -
    -
    + @if (tab.onClick) { + + } @else { + + + + } } } + + + +
    +
    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 0b377e57a..ffb3ff33c 100644 --- a/libs/ui/src/lib/page-tabs/page-tabs.component.scss +++ b/libs/ui/src/lib/page-tabs/page-tabs.component.scss @@ -6,6 +6,10 @@ height: 100%; width: 100%; + .external-link-icon { + font-size: 0.75rem; + } + @include mat.tabs-overrides( ( active-indicator-height: 0, @@ -37,7 +41,12 @@ @include mat.tabs-overrides( ( - container-height: 2rem + active-focus-label-text-color: rgba(var(--palette-foreground-base), 1), + active-hover-label-text-color: rgba(var(--palette-foreground-base), 1), + active-label-text-color: rgba(var(--palette-foreground-base), 1), + active-ripple-color: rgba(var(--palette-foreground-base), 1), + container-height: 2rem, + inactive-ripple-color: rgba(var(--palette-foreground-base), 1) ) ); @@ -51,7 +60,20 @@ flex-direction: column; .mat-mdc-tab-link { + border-radius: 0.25rem; + font-weight: 400; justify-content: flex-start; + margin: 0 0.5rem 0.1rem 0.5rem; + + &.mdc-tab--active { + background-color: rgba(var(--palette-foreground-base), 0.05); + font-weight: 500; + } + + .mdc-tab__content, + .mdc-tab__text-label { + width: 100%; + } } } } @@ -61,8 +83,32 @@ :host-context(.theme-dark) { @media (min-width: 576px) { - .mat-mdc-tab-header { - background-color: rgba(var(--palette-foreground-base-dark), 0.02); + @include mat.tabs-overrides( + ( + active-focus-label-text-color: rgba( + var(--palette-foreground-base-dark), + 1 + ), + active-hover-label-text-color: rgba( + var(--palette-foreground-base-dark), + 1 + ), + active-label-text-color: rgba(var(--palette-foreground-base-dark), 1), + active-ripple-color: rgba(var(--palette-foreground-base-dark), 1), + inactive-ripple-color: rgba(var(--palette-foreground-base-dark), 1) + ) + ); + + ::ng-deep { + .mat-mdc-tab-header { + background-color: rgba(var(--palette-foreground-base-dark), 0.02); + + .mat-mdc-tab-link { + &.mdc-tab--active { + background-color: rgba(var(--palette-foreground-base-dark), 0.05); + } + } + } } } } diff --git a/libs/ui/src/lib/page-tabs/page-tabs.component.ts b/libs/ui/src/lib/page-tabs/page-tabs.component.ts index 61c2caf05..92f0f60d7 100644 --- a/libs/ui/src/lib/page-tabs/page-tabs.component.ts +++ b/libs/ui/src/lib/page-tabs/page-tabs.component.ts @@ -1,3 +1,4 @@ +import { NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -7,13 +8,15 @@ import { import { MatTabsModule } from '@angular/material/tabs'; import { RouterModule } from '@angular/router'; import { IonIcon } from '@ionic/angular/standalone'; +import { addIcons } from 'ionicons'; +import { openOutline } from 'ionicons/icons'; import { DeviceDetectorService } from 'ngx-device-detector'; import { TabConfiguration } from './interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [IonIcon, MatTabsModule, RouterModule], + imports: [IonIcon, MatTabsModule, NgTemplateOutlet, RouterModule], selector: 'gf-page-tabs', styleUrls: ['./page-tabs.component.scss'], templateUrl: './page-tabs.component.html' @@ -26,5 +29,7 @@ export class GfPageTabsComponent { public constructor() { this.deviceType = this.deviceService.getDeviceInfo().deviceType; + + addIcons({ openOutline }); } } diff --git a/libs/ui/src/lib/portfolio-proportion-chart/interfaces/interfaces.ts b/libs/ui/src/lib/portfolio-proportion-chart/interfaces/interfaces.ts new file mode 100644 index 000000000..25d12b049 --- /dev/null +++ b/libs/ui/src/lib/portfolio-proportion-chart/interfaces/interfaces.ts @@ -0,0 +1,5 @@ +import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; + +export type PortfolioProportionChartClickEvent = + | AssetProfileIdentifier + | { accountId: string }; diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html index c7de5ef4d..75e545d30 100644 --- a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html +++ b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.html @@ -7,7 +7,4 @@ }" /> } - + diff --git a/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts b/libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts index 4021bf97f..bf6fd193e 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 @@ -1,13 +1,9 @@ import { getTooltipOptions } from '@ghostfolio/common/chart-helper'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { getLocale, getSum, getTextColor } from '@ghostfolio/common/helper'; -import { - AssetProfileIdentifier, - PortfolioPosition -} from '@ghostfolio/common/interfaces'; +import { PortfolioPosition } from '@ghostfolio/common/interfaces'; import { ColorScheme } from '@ghostfolio/common/types'; -import { CommonModule } from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, @@ -37,7 +33,7 @@ import Color from 'color'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import OpenColor from 'open-color'; -import { translate } from '../i18n'; +import { PortfolioProportionChartClickEvent } from './interfaces/interfaces'; const { blue, @@ -56,7 +52,7 @@ const { @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, NgxSkeletonLoaderModule], + imports: [NgxSkeletonLoaderModule], selector: 'gf-portfolio-proportion-chart', styleUrls: ['./portfolio-proportion-chart.component.scss'], templateUrl: './portfolio-proportion-chart.component.html' @@ -83,7 +79,8 @@ export class GfPortfolioProportionChartComponent public chart: Chart<'doughnut'>; public isLoading = true; - protected readonly proportionChartClicked = output(); + protected readonly proportionChartClicked = + output(); private readonly OTHER_KEY = 'OTHER'; @@ -358,11 +355,11 @@ export class GfPortfolioProportionChartComponent const dataIndex = activeElements[0].index; const symbol = chart.data.labels?.[dataIndex] as string; - const dataSource = this.data[symbol].dataSource; + const dataSource = this.data[symbol]?.dataSource; - if (dataSource) { - this.proportionChartClicked.emit({ dataSource, symbol }); - } + this.proportionChartClicked.emit( + dataSource ? { dataSource, symbol } : { accountId: symbol } + ); } catch {} }, onHover: (event, chartElement) => { @@ -390,7 +387,7 @@ export class GfPortfolioProportionChartComponent return value > 0 ? isUUID(symbol) - ? (translate(this.data[symbol]?.name) ?? symbol) + ? (this.data[symbol]?.name ?? symbol) : symbol : ''; }, @@ -453,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/premium-indicator/premium-indicator.component.html b/libs/ui/src/lib/premium-indicator/premium-indicator.component.html index 3141414e7..71baae6cb 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.html +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.html @@ -1,7 +1,7 @@ diff --git a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts index b3ccfd88f..0c3cd6ad7 100644 --- a/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts +++ b/libs/ui/src/lib/premium-indicator/premium-indicator.component.ts @@ -1,6 +1,5 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes'; -import { CommonModule } from '@angular/common'; import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, @@ -14,7 +13,7 @@ import { diamondOutline } from 'ionicons/icons'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, IonIcon, RouterModule], + imports: [IonIcon, RouterModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-premium-indicator', styleUrls: ['./premium-indicator.component.scss'], diff --git a/libs/ui/src/lib/services/admin.service.ts b/libs/ui/src/lib/services/admin.service.ts index 094001c2f..0eea768d6 100644 --- a/libs/ui/src/lib/services/admin.service.ts +++ b/libs/ui/src/lib/services/admin.service.ts @@ -11,32 +11,26 @@ import { import { AdminData, AdminJobs, - AdminMarketData, AdminUserResponse, AdminUsersResponse, AssetProfileIdentifier, DataProviderGhostfolioStatusResponse, DataProviderHistoricalResponse, - EnhancedSymbolProfile, - Filter + EnhancedSymbolProfile } from '@ghostfolio/common/interfaces'; import { DateRange } from '@ghostfolio/common/types'; import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; -import { SortDirection } from '@angular/material/sort'; import { DataSource, MarketData, Platform } from '@prisma/client'; import { JobStatus } from 'bull'; import { isNumber } from 'lodash'; -import { DataService } from './data.service'; - @Injectable({ providedIn: 'root' }) export class AdminService { - private readonly dataService = inject(DataService); private readonly environment = inject(GF_ENVIRONMENT); private readonly http = inject(HttpClient); @@ -81,42 +75,6 @@ export class AdminService { return this.http.get('/api/v1/admin'); } - public fetchAdminMarketData({ - filters, - skip, - sortColumn, - sortDirection, - take - }: { - filters?: Filter[]; - skip?: number; - sortColumn?: string; - sortDirection?: SortDirection; - take: number; - }) { - let params = this.dataService.buildFiltersAsQueryParams({ filters }); - - if (skip) { - params = params.append('skip', skip); - } - - if (sortColumn) { - params = params.append('sortColumn', sortColumn); - } - - if (sortDirection) { - params = params.append('sortDirection', sortDirection); - } - - if (take) { - params = params.append('take', take); - } - - return this.http.get('/api/v1/admin/market-data', { - params - }); - } - public fetchGhostfolioDataProviderStatus(aApiKey: string) { const headers = new HttpHeaders({ [HEADER_KEY_SKIP_INTERCEPTOR]: 'true', diff --git a/libs/ui/src/lib/services/data.service.ts b/libs/ui/src/lib/services/data.service.ts index 2ae07708d..079ea1bf6 100644 --- a/libs/ui/src/lib/services/data.service.ts +++ b/libs/ui/src/lib/services/data.service.ts @@ -28,6 +28,7 @@ import { AiPromptResponse, ApiKeyResponse, AssetProfileIdentifier, + AssetProfilesResponse, AssetResponse, BenchmarkMarketDataDetailsResponse, BenchmarkResponse, @@ -378,6 +379,42 @@ export class DataService { ); } + public fetchAssetProfiles({ + filters, + skip, + sortColumn, + sortDirection, + take + }: { + filters?: Filter[]; + skip?: number; + sortColumn?: string; + sortDirection?: SortDirection; + take: number; + }) { + let params = this.buildFiltersAsQueryParams({ filters }); + + if (skip) { + params = params.append('skip', skip); + } + + if (sortColumn) { + params = params.append('sortColumn', sortColumn); + } + + if (sortDirection) { + params = params.append('sortDirection', sortDirection); + } + + if (take) { + params = params.append('take', take); + } + + return this.http.get('/api/v1/asset-profiles', { + params + }); + } + public fetchBenchmarkForUser({ dataSource, filters, @@ -445,10 +482,27 @@ export class DataService { }: { dataSource: DataSource; symbol: string; - }) { - return this.http.get( - `/api/v1/portfolio/holding/${dataSource}/${symbol}` - ); + }): Observable< + Omit & { + dateOfFirstActivity: Date | undefined; + } + > { + return this.http + .get( + `/api/v1/portfolio/holding/${dataSource}/${symbol}` + ) + .pipe( + map((response) => { + const dateOfFirstActivity = response.dateOfFirstActivity + ? parseISO(response.dateOfFirstActivity) + : undefined; + + return { + ...response, + dateOfFirstActivity + }; + }) + ); } public fetchInfo(): InfoItem { diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.html b/libs/ui/src/lib/treemap-chart/treemap-chart.component.html index c7de5ef4d..75e545d30 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.html +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.html @@ -7,7 +7,4 @@ }" /> } - + diff --git a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts index 910914230..36ea0023a 100644 --- a/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts +++ b/libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -10,7 +10,6 @@ import { } from '@ghostfolio/common/interfaces'; import { ColorScheme, DateRange } from '@ghostfolio/common/types'; -import { CommonModule } from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, @@ -45,7 +44,7 @@ const { gray, green, red } = OpenColor; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, NgxSkeletonLoaderModule], + imports: [NgxSkeletonLoaderModule], selector: 'gf-treemap-chart', styleUrls: ['./treemap-chart.component.scss'], templateUrl: './treemap-chart.component.html' 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..899441b7b 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 }); + + return names; + }, {}); + setTimeout(() => { this.isLoading = false; diff --git a/package-lock.json b/package-lock.json index e7b5a2bca..0fceee455 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "3.7.0", + "version": "3.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "3.7.0", + "version": "3.12.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -21,9 +21,9 @@ "@angular/platform-browser-dynamic": "21.2.7", "@angular/router": "21.2.7", "@angular/service-worker": "21.2.7", - "@bull-board/api": "7.1.5", - "@bull-board/express": "7.1.5", - "@bull-board/nestjs": "7.1.5", + "@bull-board/api": "7.2.1", + "@bull-board/express": "7.2.1", + "@bull-board/nestjs": "7.2.1", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.1", "@internationalized/number": "3.6.6", @@ -63,7 +63,7 @@ "countries-and-timezones": "3.9.0", "countries-list": "3.3.0", "countup.js": "2.10.0", - "date-fns": "4.1.0", + "date-fns": "4.4.0", "dotenv": "17.2.3", "dotenv-expand": "12.0.3", "envalid": "8.1.1", @@ -91,11 +91,11 @@ "reflect-metadata": "0.2.2", "rxjs": "7.8.1", "stripe": "21.0.1", - "svgmap": "2.19.3", + "svgmap": "2.21.0", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", "undici": "7.24.4", - "yahoo-finance2": "3.14.2", + "yahoo-finance2": "3.15.3", "zone.js": "0.16.1" }, "devDependencies": { @@ -3523,33 +3523,33 @@ "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@bull-board/api": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-7.1.5.tgz", - "integrity": "sha512-EW0sbTtGIysu9vipdVpPQeToPqOpPgVZTt+pn1Ut3gbSS/GLWbEgIfFtMmSQDUoSL9WH00RzjgUY5K+43nWh0A==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@bull-board/api/-/api-7.2.1.tgz", + "integrity": "sha512-ldRG4POJLHf6oDrbDA7AsbTKliBmV4eySlwdUAumiRDtfvtbRSdXGE4Md2uPDova1r/ck7ExEe1+pHEQAZElqw==", "license": "MIT", "dependencies": { "redis-info": "^3.1.0" }, "peerDependencies": { - "@bull-board/ui": "7.1.5" + "@bull-board/ui": "7.2.1" } }, "node_modules/@bull-board/express": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-7.1.5.tgz", - "integrity": "sha512-kp4SzhVjZlykryiQwcOhJjDhiLbBnZoAMoSgEstzqQ0raLw+jERRC6ryJ0MIQO+SO+Jv9EjjxrXCR8O2YSP/eg==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@bull-board/express/-/express-7.2.1.tgz", + "integrity": "sha512-tBr/xV5letzKYPRGRkilTQZmfoCoy3mCuUo4M2dDoDKOhbrF360mK5v9/rIcSgYSyI9c7BgEgrve80LhmexNxQ==", "license": "MIT", "dependencies": { - "@bull-board/api": "7.1.5", - "@bull-board/ui": "7.1.5", - "ejs": "^5.0.2", + "@bull-board/api": "7.2.1", + "@bull-board/ui": "7.2.1", + "ejs": "^6.0.1", "express": "^5.2.1" } }, "node_modules/@bull-board/express/node_modules/ejs": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.2.tgz", - "integrity": "sha512-IpbUaI/CAW86l3f+T8zN0iggSc0LmMZLcIW5eRVStLVNCoTXkE0YlncbbH50fp8Cl6zHIky0sW2uUbhBqGw0Jw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-6.0.1.tgz", + "integrity": "sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==", "license": "Apache-2.0", "bin": { "ejs": "bin/cli.js" @@ -3559,12 +3559,12 @@ } }, "node_modules/@bull-board/nestjs": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-7.1.5.tgz", - "integrity": "sha512-1y+HkjnDaZoSCXJRsiYfBNBVx+PX3I8x3Uv+SSJuSpt2vHifMRwFbChO3XDxeWXetT1eR+yqPVq6ub5eJwNOYQ==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@bull-board/nestjs/-/nestjs-7.2.1.tgz", + "integrity": "sha512-Uq2Z3+0ORgHJSw4TDV1kBrHdksRnK8CZdda63hrStduPnvKHPBxIZUGNfBN/vL08UqizpNkjFmNyNXiHOgf0LQ==", "license": "MIT", "peerDependencies": { - "@bull-board/api": "^7.1.5", + "@bull-board/api": "^7.2.1", "@nestjs/bull-shared": "^10.0.0 || ^11.0.0", "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0", "@nestjs/core": "^9.0.0 || ^10.0.0 || ^11.0.0", @@ -3573,12 +3573,12 @@ } }, "node_modules/@bull-board/ui": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-7.1.5.tgz", - "integrity": "sha512-2IkatKwNRx/1M9/lAZIptcxS1FPNq6icpp2M46Upwd4olVxs/ujF9Kvs+Ff9ExtIO/OgYfwx7mG2IprGZ+nQCg==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@bull-board/ui/-/ui-7.2.1.tgz", + "integrity": "sha512-O4ykrXrl2UJNHnhJrCvJxrw1ar+DlUBgyZUeZ8Ci+Ne5Wbq6rBv1gfpQH54/eu3IFbLso0S/kjc6WUGb2HPqZw==", "license": "MIT", "dependencies": { - "@bull-board/api": "7.1.5" + "@bull-board/api": "7.2.1" } }, "node_modules/@cacheable/utils": { @@ -4556,7 +4556,6 @@ "version": "1.19.11", "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.11.tgz", "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=18.14.1" @@ -7344,7 +7343,6 @@ "version": "1.26.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", - "dev": true, "license": "MIT", "dependencies": { "@hono/node-server": "^1.19.9", @@ -18893,7 +18891,6 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "devOptional": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -20491,9 +20488,9 @@ } }, "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", "license": "MIT", "funding": { "type": "github", @@ -22011,7 +22008,6 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "dev": true, "license": "MIT", "dependencies": { "eventsource-parser": "^3.0.1" @@ -22155,7 +22151,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.2.tgz", "integrity": "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==", - "dev": true, "license": "MIT", "dependencies": { "ip-address": "10.1.0" @@ -23811,7 +23806,6 @@ "version": "4.12.14", "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz", "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=16.9.0" @@ -24553,7 +24547,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "dev": true, "license": "MIT", "engines": { "node": ">= 12" @@ -25222,7 +25215,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true, "license": "ISC" }, "node_modules/isobject": { @@ -28477,7 +28469,6 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -28652,7 +28643,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -32293,7 +32283,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -32531,7 +32520,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=16.20.0" @@ -35418,7 +35406,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "devOptional": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -35431,7 +35418,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -36530,9 +36516,9 @@ "license": "BSD-2-Clause" }, "node_modules/svgmap": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/svgmap/-/svgmap-2.19.3.tgz", - "integrity": "sha512-LjKVzKgANVMRiHqFQVz57FqqX7tVm+EskubySCWb5kvizdeDBanscPA/c4tmK/48VCvYxrR1ecBbqStcD6HYfQ==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/svgmap/-/svgmap-2.21.0.tgz", + "integrity": "sha512-KQNP4rkkYe3D4EgqSxX+QoRzl13oDaOt5Oqe/ClIJme/u/AaQXMU+SXgt7iL4rfqK+lRc+15dXp+y7+zQg5WiA==", "license": "MIT", "dependencies": { "svg-pan-zoom": "^3.6.2" @@ -39554,7 +39540,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -39879,19 +39864,23 @@ } }, "node_modules/yahoo-finance2": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.14.2.tgz", - "integrity": "sha512-s+F7TWQT7zAtjhfC7rFHEX16Xfq36u3wceysINP7V+esF3mAYyk9slxZU+fEdkxaTuCT0+PnikHdekMX4UPMrg==", + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/yahoo-finance2/-/yahoo-finance2-3.15.3.tgz", + "integrity": "sha512-AFmVZ4ACg3QFT2a/hyJv4Scp2J45gm/6xetVgvUvXzZypqsqbgreXJad4i+qm0onj6yeCf2fPhvow7Eh0CwwzA==", "license": "MIT", "dependencies": { "@deno/shim-deno": "~0.18.0", + "@modelcontextprotocol/sdk": "npm:@modelcontextprotocol/sdk@^1.26.0", "fetch-mock-cache": "npm:fetch-mock-cache@^2.1.3", "json-schema": "^0.4.0", "tough-cookie": "npm:tough-cookie@^5.1.1", - "tough-cookie-file-store": "npm:tough-cookie-file-store@^2.0.3" + "tough-cookie-file-store": "npm:tough-cookie-file-store@^2.0.3", + "zod": "npm:zod@^3.25.0" }, "bin": { - "yahoo-finance": "esm/bin/yahoo-finance.js" + "yahoo-finance": "esm/bin/yahoo-finance.js", + "yahoo-finance-mcp": "esm/bin/yahoo-finance-mcp.js", + "yahoo-finance2": "esm/bin/yahoo-finance.js" }, "engines": { "node": ">=20.0.0" @@ -40149,7 +40138,6 @@ "version": "3.25.2", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", - "dev": true, "license": "ISC", "peerDependencies": { "zod": "^3.25.28 || ^4" diff --git a/package.json b/package.json index 4fa3e522a..6ec921f21 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "3.7.0", + "version": "3.12.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -65,9 +65,9 @@ "@angular/platform-browser-dynamic": "21.2.7", "@angular/router": "21.2.7", "@angular/service-worker": "21.2.7", - "@bull-board/api": "7.1.5", - "@bull-board/express": "7.1.5", - "@bull-board/nestjs": "7.1.5", + "@bull-board/api": "7.2.1", + "@bull-board/express": "7.2.1", + "@bull-board/nestjs": "7.2.1", "@codewithdan/observable-store": "2.2.15", "@date-fns/utc": "2.1.1", "@internationalized/number": "3.6.6", @@ -107,7 +107,7 @@ "countries-and-timezones": "3.9.0", "countries-list": "3.3.0", "countup.js": "2.10.0", - "date-fns": "4.1.0", + "date-fns": "4.4.0", "dotenv": "17.2.3", "dotenv-expand": "12.0.3", "envalid": "8.1.1", @@ -135,11 +135,11 @@ "reflect-metadata": "0.2.2", "rxjs": "7.8.1", "stripe": "21.0.1", - "svgmap": "2.19.3", + "svgmap": "2.21.0", "tablemark": "4.1.0", "twitter-api-v2": "1.29.0", "undici": "7.24.4", - "yahoo-finance2": "3.14.2", + "yahoo-finance2": "3.15.3", "zone.js": "0.16.1" }, "devDependencies": {