Browse Source

Merge branch 'main' into pr/5848

pull/7146/head
Thomas Kaul 3 weeks ago
parent
commit
f80e0551a8
  1. 1
      .gitignore
  2. 82
      CHANGELOG.md
  3. 8
      apps/api/src/app/activities/activities.service.ts
  4. 4
      apps/api/src/app/admin/admin.controller.ts
  5. 2
      apps/api/src/app/admin/admin.module.ts
  6. 84
      apps/api/src/app/admin/admin.service.ts
  7. 2
      apps/api/src/app/admin/queue/queue.service.ts
  8. 11
      apps/api/src/app/asset/asset.controller.ts
  9. 4
      apps/api/src/app/asset/asset.module.ts
  10. 58
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts
  11. 11
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts
  12. 61
      apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts
  13. 8
      apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts
  14. 9
      apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts
  15. 61
      apps/api/src/app/endpoints/market-data/market-data.controller.ts
  16. 12
      apps/api/src/app/endpoints/market-data/market-data.module.ts
  17. 30
      apps/api/src/app/endpoints/watchlist/watchlist.service.ts
  18. 17
      apps/api/src/app/import/import.service.ts
  19. 2
      apps/api/src/app/info/info.service.ts
  20. 4
      apps/api/src/app/portfolio/current-rate.service.ts
  21. 3
      apps/api/src/app/portfolio/portfolio.service.spec.ts
  22. 25
      apps/api/src/app/portfolio/portfolio.service.ts
  23. 43
      apps/api/src/app/symbol/symbol.service.ts
  24. 8
      apps/api/src/events/asset-profile-changed.listener.ts
  25. 6
      apps/api/src/helper/country.helper.ts
  26. 67
      apps/api/src/helper/data-source.helper.ts
  27. 2
      apps/api/src/interceptors/performance-logging/performance-logging.service.ts
  28. 2
      apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts
  29. 26
      apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
  30. 8
      apps/api/src/services/benchmark/benchmark.service.ts
  31. 5
      apps/api/src/services/configuration/configuration.service.ts
  32. 47
      apps/api/src/services/cron/cron.module.ts
  33. 10
      apps/api/src/services/cron/cron.service.ts
  34. 7
      apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts
  35. 166
      apps/api/src/services/data-provider/data-provider.service.ts
  36. 6
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  37. 1
      apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
  38. 45
      apps/api/src/services/data-provider/manual/manual.service.ts
  39. 19
      apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
  40. 25
      apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts
  41. 2
      apps/api/src/services/interfaces/environment.interface.ts
  42. 87
      apps/api/src/services/market-data/market-data.service.ts
  43. 3
      apps/api/src/services/queues/data-gathering/data-gathering.module.ts
  44. 21
      apps/api/src/services/queues/data-gathering/data-gathering.processor.ts
  45. 265
      apps/api/src/services/queues/data-gathering/data-gathering.service.ts
  46. 37
      apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts
  47. 2
      apps/api/src/services/symbol-profile/symbol-profile.service.ts
  48. 4
      apps/api/src/services/twitter-bot/twitter-bot.service.ts
  49. 12
      apps/client/src/app/app.component.ts
  50. 2
      apps/client/src/app/components/access-table/access-table.component.html
  51. 10
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  52. 2
      apps/client/src/app/components/admin-jobs/admin-jobs.html
  53. 27
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  54. 5
      apps/client/src/app/components/admin-market-data/admin-market-data.html
  55. 23
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  56. 24
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html
  57. 6
      apps/client/src/app/components/admin-platform/admin-platform.component.html
  58. 6
      apps/client/src/app/components/admin-platform/admin-platform.component.ts
  59. 30
      apps/client/src/app/components/admin-settings/admin-settings.component.scss
  60. 6
      apps/client/src/app/components/admin-tag/admin-tag.component.html
  61. 6
      apps/client/src/app/components/admin-tag/admin-tag.component.ts
  62. 71
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  63. 54
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  64. 4
      apps/client/src/app/components/home-market/home-market.component.ts
  65. 2
      apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
  66. 8
      apps/client/src/app/components/user-account-settings/user-account-settings.html
  67. 10
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
  68. 25
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
  69. 7
      apps/client/src/app/pages/accounts/transfer-balance/interfaces/interfaces.ts
  70. 78
      apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
  71. 6
      apps/client/src/app/pages/api/api-page.component.ts
  72. 8
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html
  73. 11
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.scss
  74. 333
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  75. 2
      apps/client/src/app/pages/portfolio/allocations/allocations-page.html
  76. 6
      apps/client/src/app/pages/portfolio/allocations/interfaces/interfaces.ts
  77. 131
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  78. 116
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.html
  79. 242
      apps/client/src/locales/messages.ca.xlf
  80. 242
      apps/client/src/locales/messages.de.xlf
  81. 242
      apps/client/src/locales/messages.es.xlf
  82. 242
      apps/client/src/locales/messages.fr.xlf
  83. 242
      apps/client/src/locales/messages.it.xlf
  84. 242
      apps/client/src/locales/messages.ko.xlf
  85. 242
      apps/client/src/locales/messages.nl.xlf
  86. 242
      apps/client/src/locales/messages.pl.xlf
  87. 242
      apps/client/src/locales/messages.pt.xlf
  88. 242
      apps/client/src/locales/messages.tr.xlf
  89. 242
      apps/client/src/locales/messages.uk.xlf
  90. 208
      apps/client/src/locales/messages.xlf
  91. 242
      apps/client/src/locales/messages.zh.xlf
  92. 11
      libs/common/src/lib/config.ts
  93. 12
      libs/common/src/lib/dtos/update-asset-profile.dto.ts
  94. 19
      libs/common/src/lib/helper.ts
  95. 8
      libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts
  96. 2
      libs/common/src/lib/interfaces/holding.interface.ts
  97. 4
      libs/common/src/lib/interfaces/index.ts
  98. 2
      libs/common/src/lib/interfaces/responses/asset-profile-response.interface.ts
  99. 13
      libs/common/src/lib/interfaces/responses/export-response.interface.ts
  100. 4
      libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts

1
.gitignore

@ -32,6 +32,7 @@ npm-debug.log
.env.prod
.github/instructions/nx.instructions.md
.nx/cache
.nx/migrate-runs
.nx/polygraph
.nx/self-healing
.nx/workspace-data

82
CHANGELOG.md

@ -5,16 +5,95 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Unreleased
## 3.17.0 - 2026-06-26
### Added
- Added `zod` as a root dependency to resolve peer dependency warnings
### Changed
- Improved the error message styling in the import activities dialog
- Improved the grantee display in the access table to share the portfolio
- Improved the country mapping for data providers
- Upgraded `bull-board` from version `7.2.1` to `8.0.1`
- Upgraded `Nx` from version `22.7.5` to `23.0.1`
- Upgraded `prettier` from version `3.8.3` to `3.8.4`
### Fixed
- Improved the table headers’ alignment in the queue jobs table of the admin control panel
## 3.16.0 - 2026-06-24
### Added
- Extended the user account settings with a copy-to-clipboard button for the user id
- Added pagination to the platform management of the admin control panel
- Added pagination to the tag management of the admin control panel
- Extended the asset profile details dialog of the admin control panel with a copy-to-clipboard button for the ISIN number
- Extended the asset profile details dialog of the admin control panel with a copy-to-clipboard button for the symbol
### Changed
- Improved the throughput of the market data gathering queue by applying the rate limit per data source
- Decreased the rate limiter duration of the market data gathering queue jobs from 4 to 3 seconds
- Removed the deprecated `SymbolProfile` field from the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol`
- Upgraded `@simplewebauthn/browser` and `@simplewebauthn/server` from version `13.2.2` to `13.3`
### Fixed
- Fixed an issue with hourly market data updates not refreshing prices for asset profiles with `MANUAL` data source
- Fixed an issue with the log context formatting in the performance logging service
## 3.15.1 - 2026-06-23
### 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
- Upgraded `@internationalized/number` from version `3.6.6` to `3.6.7`
### Fixed
- Fixed an issue where symbols with special characters caused API request failures by URL encoding the symbol
- Fixed the disabled state of the delete action in the asset profiles actions menu of the historical market data table in the admin control panel
- Fixed the persistence of an empty `locale` string in the scraper configuration
- Fixed a transaction timeout that prevented gathering historical market data for symbols with a long history
- Fixed an exception in various portfolio endpoints when historical exchange rate data is missing
## 3.14.0 - 2026-06-22
### Added
- Exposed the `ENABLE_FEATURE_CRON` environment variable to control scheduled cron job execution
- Exposed the `PROCESSOR_GATHER_STATISTICS_CONCURRENCY` environment variable to control the concurrency of the statistics gathering queue processor
### Changed
- Consolidated the exchange rates to be gathered with hourly market data
- Improved the language localization for German (`de`)
- Upgraded `@openrouter/ai-sdk-provider` from version `2.9.0` to `2.9.1`
- Upgraded `undici` from version `7.24.4` to `8.5.0`
### Fixed
- Fixed an issue in the data provider service where asset profiles and historical data could be missing for symbols that exist in multiple data sources by keying the responses by the asset profile identifier
- Resolved an exception in the benchmarks service when the current market price is unavailable
## 3.13.0 - 2026-06-20
### Added
- Added an icon to indicate external links in the page tabs component
- Added the Korean (`ko`) language to the footer
- Added a data gathering frequency (`DAILY` or `HOURLY`) to the asset profile to control the market data gathering interval
### Changed
- Changed the _Fear & Greed Index_ (market mood) in the markets overview to use the stored market data instead of a live quote
- Moved the endpoint to get the asset profiles from `GET api/v1/admin/market-data` to `GET api/v1/asset-profiles`
- Moved the endpoint to get the asset profile details from `GET api/v1/market-data/:dataSource/:symbol` to `GET api/v1/asset-profiles/:dataSource/:symbol`
- 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
@ -25,6 +104,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Fixed an issue with the localization of the country names
- Fixed an issue in the data provider service where quotes could be missing for symbols that exist in multiple data sources by keying the quotes response by the asset profile identifier
## 3.12.0 - 2026-06-17

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

@ -746,10 +746,10 @@ export class ActivitiesService {
const value = new Big(order.quantity).mul(order.unitPrice).toNumber();
const [
feeInAssetProfileCurrency,
feeInBaseCurrency,
unitPriceInAssetProfileCurrency,
valueInBaseCurrency
feeInAssetProfileCurrency = 0,
feeInBaseCurrency = 0,
unitPriceInAssetProfileCurrency = 0,
valueInBaseCurrency = 0
] = await Promise.all([
this.exchangeRateDataService.toCurrencyAtDate(
order.fee,

4
apps/api/src/app/admin/admin.controller.ts

@ -86,8 +86,8 @@ export class AdminController {
@HasPermission(permissions.accessAdminControl)
@Post('gather')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public async gather7Days(): Promise<void> {
this.dataGatheringService.gather7Days();
public async gatherRecentMarketData(): Promise<void> {
this.dataGatheringService.gatherRecentMarketData();
}
@HasPermission(permissions.accessAdminControl)

2
apps/api/src/app/admin/admin.module.ts

@ -1,4 +1,3 @@
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 { BenchmarkModule } from '@ghostfolio/api/services/benchmark/benchmark.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
@ -19,7 +18,6 @@ import { QueueModule } from './queue/queue.module';
@Module({
imports: [
ActivitiesModule,
BenchmarkModule,
ConfigurationModule,
DataGatheringQueueModule,

84
apps/api/src/app/admin/admin.service.ts

@ -1,4 +1,3 @@
import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
import { environment } from '@ghostfolio/api/environments/environment';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
@ -12,14 +11,15 @@ import {
PROPERTY_IS_READ_ONLY_MODE,
PROPERTY_IS_USER_SIGNUP_ENABLED
} from '@ghostfolio/common/config';
import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper';
import {
getAssetProfileIdentifier,
getCurrencyFromSymbol
} from '@ghostfolio/common/helper';
import {
AdminData,
AdminMarketDataDetails,
AdminUserResponse,
AdminUsersResponse,
AssetProfileIdentifier,
EnhancedSymbolProfile
AssetProfileIdentifier
} from '@ghostfolio/common/interfaces';
import {
@ -42,7 +42,6 @@ import { StatusCodes, getReasonPhrase } from 'http-status-codes';
@Injectable()
export class AdminService {
public constructor(
private readonly activitiesService: ActivitiesService,
private readonly configurationService: ConfigurationService,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
@ -72,14 +71,17 @@ export class AdminService {
{ dataSource, symbol }
]);
if (!assetProfiles[symbol]?.currency) {
const assetProfile =
assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })];
if (!assetProfile?.currency) {
throw new BadRequestException(
`Asset profile not found for ${symbol} (${dataSource})`
);
}
return this.symbolProfileService.add(
assetProfiles[symbol] as Prisma.SymbolProfileCreateInput
assetProfile as Prisma.SymbolProfileCreateInput
);
} catch (error) {
if (
@ -176,61 +178,6 @@ export class AdminService {
};
}
public async getMarketDataBySymbol({
dataSource,
symbol
}: AssetProfileIdentifier): Promise<AdminMarketDataDetails> {
let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0;
let currency: EnhancedSymbolProfile['currency'] = '-';
let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity'];
const isCurrencyAssetProfile = isCurrency(getCurrencyFromSymbol(symbol));
if (isCurrencyAssetProfile) {
currency = getCurrencyFromSymbol(symbol);
({ activitiesCount, dateOfFirstActivity } =
await this.activitiesService.getStatisticsByCurrency(currency));
}
const [[assetProfile], marketData] = await Promise.all([
this.symbolProfileService.getSymbolProfiles([
{
dataSource,
symbol
}
]),
this.marketDataService.marketDataItems({
orderBy: {
date: 'asc'
},
where: {
dataSource,
symbol
}
})
]);
if (assetProfile) {
assetProfile.dataProviderInfo = this.dataProviderService
.getDataProvider(assetProfile.dataSource)
.getDataProviderInfo();
}
return {
marketData,
assetProfile: assetProfile ?? {
activitiesCount,
currency,
dataSource,
dateOfFirstActivity,
symbol,
assetClass: isCurrencyAssetProfile ? AssetClass.LIQUIDITY : undefined,
assetSubClass: isCurrencyAssetProfile ? AssetSubClass.CASH : undefined,
isActive: true
}
};
}
public async getUser(id: string): Promise<AdminUserResponse> {
const [user] = await this.getUsersWithAnalytics({
where: { id }
@ -241,7 +188,7 @@ export class AdminService {
}
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
const subscriptions = await this.prismaService.subscription.findMany({
user.subscriptions = await this.prismaService.subscription.findMany({
orderBy: {
expiresAt: 'desc'
},
@ -249,13 +196,6 @@ export class AdminService {
userId: id
}
});
user.subscriptions = subscriptions.map((subscription) => {
return {
...subscription,
price: subscription.price ?? 0
};
});
}
return user;
@ -287,6 +227,7 @@ export class AdminService {
comment,
countries,
currency,
dataGatheringFrequency,
dataSource: newDataSource,
holdings,
isActive,
@ -370,6 +311,7 @@ export class AdminService {
const updatedSymbolProfile: Prisma.SymbolProfileUpdateInput = {
comment,
currency,
dataGatheringFrequency,
dataSource,
isActive,
scraperConfiguration,

2
apps/api/src/app/admin/queue/queue.service.ts

@ -56,7 +56,7 @@ export class QueueService {
}
public async getJobs({
limit = 1000,
limit = 5000,
status = QUEUE_JOB_STATUS_LIST
}: {
limit?: number;

11
apps/api/src/app/asset/asset.controller.ts

@ -1,4 +1,4 @@
import { AdminService } from '@ghostfolio/api/app/admin/admin.service';
import { AssetProfilesService } from '@ghostfolio/api/app/endpoints/asset-profiles/asset-profiles.service';
import { TransformDataSourceInRequestInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor';
import { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import type { AssetResponse } from '@ghostfolio/common/interfaces';
@ -9,7 +9,9 @@ import { pick } from 'lodash';
@Controller('asset')
export class AssetController {
public constructor(private readonly adminService: AdminService) {}
public constructor(
private readonly assetProfilesService: AssetProfilesService
) {}
@Get(':dataSource/:symbol')
@UseInterceptors(TransformDataSourceInRequestInterceptor)
@ -19,7 +21,10 @@ export class AssetController {
@Param('symbol') symbol: string
): Promise<AssetResponse> {
const { assetProfile, marketData } =
await this.adminService.getMarketDataBySymbol({ dataSource, symbol });
await this.assetProfilesService.getAssetProfile({
dataSource,
symbol
});
return {
marketData,

4
apps/api/src/app/asset/asset.module.ts

@ -1,4 +1,4 @@
import { AdminModule } from '@ghostfolio/api/app/admin/admin.module';
import { AssetProfilesModule } from '@ghostfolio/api/app/endpoints/asset-profiles/asset-profiles.module';
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';
@ -9,7 +9,7 @@ import { AssetController } from './asset.controller';
@Module({
controllers: [AssetController],
imports: [
AdminModule,
AssetProfilesModule,
TransformDataSourceInRequestModule,
TransformDataSourceInResponseModule
]

58
apps/api/src/app/endpoints/asset-profiles/asset-profiles.controller.ts

@ -1,11 +1,17 @@
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 { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos';
import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper';
import { AssetProfileResponse } from '@ghostfolio/common/interfaces';
import {
AssetProfilesResponse,
EnhancedSymbolProfile
} from '@ghostfolio/common/interfaces';
import { hasPermission } from '@ghostfolio/common/permissions';
import { permissions } from '@ghostfolio/common/permissions';
import { MarketDataPreset, RequestWithUser } from '@ghostfolio/common/types';
@ -18,7 +24,8 @@ import {
Param,
Patch,
Query,
UseGuards
UseGuards,
UseInterceptors
} from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
@ -32,7 +39,8 @@ export class AssetProfilesController {
public constructor(
private readonly apiService: ApiService,
private readonly assetProfilesService: AssetProfilesService,
@Inject(REQUEST) private readonly request: RequestWithUser
@Inject(REQUEST) private readonly request: RequestWithUser,
private readonly symbolProfileService: SymbolProfileService
) {}
@Get()
@ -64,6 +72,52 @@ export class AssetProfilesController {
});
}
@Get(':dataSource/:symbol')
@UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInRequestInterceptor)
@UseInterceptors(TransformDataSourceInResponseInterceptor)
public async getAssetProfile(
@Param('dataSource') dataSource: DataSource,
@Param('symbol') symbol: string
): Promise<AssetProfileResponse> {
const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([
{ dataSource, symbol }
]);
if (!assetProfile && !isCurrency(getCurrencyFromSymbol(symbol))) {
throw new HttpException(
getReasonPhrase(StatusCodes.NOT_FOUND),
StatusCodes.NOT_FOUND
);
}
const canReadAllAssetProfiles = hasPermission(
this.request.user.permissions,
permissions.readMarketData
);
const canReadOwnAssetProfile =
assetProfile?.userId === this.request.user.id &&
hasPermission(
this.request.user.permissions,
permissions.readMarketDataOfOwnAssetProfile
);
if (!canReadAllAssetProfiles && !canReadOwnAssetProfile) {
throw new HttpException(
assetProfile?.userId
? getReasonPhrase(StatusCodes.NOT_FOUND)
: getReasonPhrase(StatusCodes.FORBIDDEN),
assetProfile?.userId ? StatusCodes.NOT_FOUND : StatusCodes.FORBIDDEN
);
}
return this.assetProfilesService.getAssetProfile({
dataSource,
symbol
});
}
@HasPermission(permissions.accessAdminControl)
@Patch(':dataSource/:symbol')
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)

11
apps/api/src/app/endpoints/asset-profiles/asset-profiles.module.ts

@ -1,7 +1,11 @@
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 { 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 { MarketDataModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module';
import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module';
@ -12,13 +16,18 @@ import { AssetProfilesService } from './asset-profiles.service';
@Module({
controllers: [AssetProfilesController],
exports: [AssetProfilesService],
imports: [
ActivitiesModule,
ApiModule,
BenchmarkModule,
DataProviderModule,
ExchangeRateDataModule,
MarketDataModule,
PrismaModule,
SymbolProfileModule
SymbolProfileModule,
TransformDataSourceInRequestModule,
TransformDataSourceInResponseModule
],
providers: [AssetProfilesService]
})

61
apps/api/src/app/endpoints/asset-profiles/asset-profiles.service.ts

@ -1,6 +1,8 @@
import { ActivitiesService } from '@ghostfolio/api/app/activities/activities.service';
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 { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { UpdateAssetProfileDataDto } from '@ghostfolio/common/dtos';
@ -11,8 +13,9 @@ import {
isCurrency
} from '@ghostfolio/common/helper';
import {
AssetProfileItem,
AdminMarketDataDetails,
AssetProfileIdentifier,
AssetProfileItem,
AssetProfilesResponse,
EnhancedSymbolProfile,
Filter
@ -28,11 +31,67 @@ export class AssetProfilesService {
public constructor(
private readonly activitiesService: ActivitiesService,
private readonly benchmarkService: BenchmarkService,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly marketDataService: MarketDataService,
private readonly prismaService: PrismaService,
private readonly symbolProfileService: SymbolProfileService
) {}
public async getAssetProfile({
dataSource,
symbol
}: AssetProfileIdentifier): Promise<AdminMarketDataDetails> {
let activitiesCount: EnhancedSymbolProfile['activitiesCount'] = 0;
let currency: EnhancedSymbolProfile['currency'] = '-';
let dateOfFirstActivity: EnhancedSymbolProfile['dateOfFirstActivity'];
const isCurrencyAssetProfile = isCurrency(getCurrencyFromSymbol(symbol));
if (isCurrencyAssetProfile) {
currency = getCurrencyFromSymbol(symbol);
({ activitiesCount, dateOfFirstActivity } =
await this.activitiesService.getStatisticsByCurrency(currency));
}
const [[assetProfile], marketData] = await Promise.all([
this.symbolProfileService.getSymbolProfiles([
{
dataSource,
symbol
}
]),
this.marketDataService.marketDataItems({
orderBy: {
date: 'asc'
},
where: {
dataSource,
symbol
}
})
]);
if (assetProfile) {
assetProfile.dataProviderInfo = this.dataProviderService
.getDataProvider(assetProfile.dataSource)
.getDataProviderInfo();
}
return {
marketData,
assetProfile: assetProfile ?? {
activitiesCount,
currency,
dataSource,
dateOfFirstActivity,
symbol,
assetClass: isCurrencyAssetProfile ? AssetClass.LIQUIDITY : undefined,
assetSubClass: isCurrencyAssetProfile ? AssetSubClass.CASH : undefined,
isActive: true
}
};
}
public async getAssetProfiles({
filters = [],
presetId,

8
apps/api/src/app/endpoints/benchmarks/benchmarks.service.ts

@ -81,6 +81,14 @@ export class BenchmarksService {
})
]);
if (!currentSymbolItem) {
this.logger.error(
`No current market price is available for ${symbol} (${dataSource})`
);
return { marketData };
}
const exchangeRates =
await this.exchangeRateDataService.getExchangeRatesByCurrency({
startDate,

9
apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts

@ -16,6 +16,7 @@ import {
DERIVED_CURRENCIES
} from '@ghostfolio/common/config';
import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import {
DataProviderGhostfolioAssetProfileResponse,
DataProviderHistoricalResponse,
@ -60,7 +61,13 @@ export class GhostfolioService {
}
])
.then(async (assetProfiles) => {
const assetProfile = assetProfiles[symbol];
const assetProfile =
assetProfiles[
getAssetProfileIdentifier({
symbol,
dataSource: dataProviderService.getName()
})
];
const dataSourceOrigin = DataSource.GHOSTFOLIO;
if (assetProfile) {

61
apps/api/src/app/endpoints/market-data/market-data.controller.ts

@ -1,9 +1,6 @@
import { AdminService } from '@ghostfolio/api/app/admin/admin.service';
import { SymbolService } from '@ghostfolio/api/app/symbol/symbol.service';
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 { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import {
@ -14,10 +11,7 @@ import {
} from '@ghostfolio/common/config';
import { UpdateBulkMarketDataDto } from '@ghostfolio/common/dtos';
import { getCurrencyFromSymbol, isCurrency } from '@ghostfolio/common/helper';
import {
MarketDataDetailsResponse,
MarketDataOfMarketsResponse
} from '@ghostfolio/common/interfaces';
import { MarketDataOfMarketsResponse } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { RequestWithUser } from '@ghostfolio/common/types';
@ -30,8 +24,7 @@ import {
Param,
Post,
Query,
UseGuards,
UseInterceptors
UseGuards
} from '@nestjs/common';
import { REQUEST } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';
@ -42,7 +35,6 @@ import { getReasonPhrase, StatusCodes } from 'http-status-codes';
@Controller('market-data')
export class MarketDataController {
public constructor(
private readonly adminService: AdminService,
private readonly marketDataService: MarketDataService,
@Inject(REQUEST) private readonly request: RequestWithUser,
private readonly symbolProfileService: SymbolProfileService,
@ -64,14 +56,16 @@ export class MarketDataController {
dataGatheringItem: {
dataSource: ghostfolioFearAndGreedIndexDataSourceCryptocurrencies,
symbol: ghostfolioFearAndGreedIndexSymbolCryptocurrencies
}
},
useIntradayData: true
}),
this.symbolService.get({
includeHistoricalData,
dataGatheringItem: {
dataSource: ghostfolioFearAndGreedIndexDataSourceStocks,
symbol: ghostfolioFearAndGreedIndexSymbolStocks
}
},
useIntradayData: true
})
]);
@ -87,49 +81,6 @@ export class MarketDataController {
};
}
@Get(':dataSource/:symbol')
@UseGuards(AuthGuard('jwt'))
@UseInterceptors(TransformDataSourceInRequestInterceptor)
@UseInterceptors(TransformDataSourceInResponseInterceptor)
public async getMarketDataBySymbol(
@Param('dataSource') dataSource: DataSource,
@Param('symbol') symbol: string
): Promise<MarketDataDetailsResponse> {
const [assetProfile] = await this.symbolProfileService.getSymbolProfiles([
{ dataSource, symbol }
]);
if (!assetProfile && !isCurrency(getCurrencyFromSymbol(symbol))) {
throw new HttpException(
getReasonPhrase(StatusCodes.NOT_FOUND),
StatusCodes.NOT_FOUND
);
}
const canReadAllAssetProfiles = hasPermission(
this.request.user.permissions,
permissions.readMarketData
);
const canReadOwnAssetProfile =
assetProfile?.userId === this.request.user.id &&
hasPermission(
this.request.user.permissions,
permissions.readMarketDataOfOwnAssetProfile
);
if (!canReadAllAssetProfiles && !canReadOwnAssetProfile) {
throw new HttpException(
assetProfile?.userId
? getReasonPhrase(StatusCodes.NOT_FOUND)
: getReasonPhrase(StatusCodes.FORBIDDEN),
assetProfile?.userId ? StatusCodes.NOT_FOUND : StatusCodes.FORBIDDEN
);
}
return this.adminService.getMarketDataBySymbol({ dataSource, symbol });
}
@Post(':dataSource/:symbol')
@UseGuards(AuthGuard('jwt'))
public async updateMarketData(

12
apps/api/src/app/endpoints/market-data/market-data.module.ts

@ -1,7 +1,4 @@
import { AdminModule } from '@ghostfolio/api/app/admin/admin.module';
import { SymbolModule } from '@ghostfolio/api/app/symbol/symbol.module';
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 { MarketDataModule as MarketDataServiceModule } from '@ghostfolio/api/services/market-data/market-data.module';
import { SymbolProfileModule } from '@ghostfolio/api/services/symbol-profile/symbol-profile.module';
@ -11,13 +8,6 @@ import { MarketDataController } from './market-data.controller';
@Module({
controllers: [MarketDataController],
imports: [
AdminModule,
MarketDataServiceModule,
SymbolModule,
SymbolProfileModule,
TransformDataSourceInRequestModule,
TransformDataSourceInResponseModule
]
imports: [MarketDataServiceModule, SymbolModule, SymbolProfileModule]
})
export class MarketDataModule {}

30
apps/api/src/app/endpoints/watchlist/watchlist.service.ts

@ -4,10 +4,14 @@ import { MarketDataService } from '@ghostfolio/api/services/market-data/market-d
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';
import { WatchlistResponse } from '@ghostfolio/common/interfaces';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
WatchlistResponse
} from '@ghostfolio/common/interfaces';
import { BadRequestException, Injectable } from '@nestjs/common';
import { DataSource, Prisma } from '@prisma/client';
import { Prisma } from '@prisma/client';
@Injectable()
export class WatchlistService {
@ -24,11 +28,7 @@ export class WatchlistService {
dataSource,
symbol,
userId
}: {
dataSource: DataSource;
symbol: string;
userId: string;
}): Promise<void> {
}: { userId: string } & AssetProfileIdentifier): Promise<void> {
const symbolProfile = await this.prismaService.symbolProfile.findUnique({
where: {
dataSource_symbol: { dataSource, symbol }
@ -40,14 +40,17 @@ export class WatchlistService {
{ dataSource, symbol }
]);
if (!assetProfiles[symbol]?.currency) {
const assetProfile =
assetProfiles[getAssetProfileIdentifier({ dataSource, symbol })];
if (!assetProfile?.currency) {
throw new BadRequestException(
`Asset profile not found for ${symbol} (${dataSource})`
);
}
await this.symbolProfileService.add(
assetProfiles[symbol] as Prisma.SymbolProfileCreateInput
assetProfile as Prisma.SymbolProfileCreateInput
);
}
@ -72,11 +75,7 @@ export class WatchlistService {
dataSource,
symbol,
userId
}: {
dataSource: DataSource;
symbol: string;
userId: string;
}) {
}: { userId: string } & AssetProfileIdentifier) {
await this.prismaService.user.update({
data: {
watchlist: {
@ -127,7 +126,8 @@ export class WatchlistService {
const performancePercent =
this.benchmarkService.calculateChangeInPercentage(
allTimeHigh?.marketPrice,
quotes[symbol]?.marketPrice
quotes[getAssetProfileIdentifier({ dataSource, symbol })]
?.marketPrice
);
return {

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

@ -536,6 +536,8 @@ export class ImportService {
url,
comment: assetProfile.comment,
currency: assetProfile.currency,
dataGatheringFrequency:
assetProfile.dataGatheringFrequency ?? 'DAILY',
userId: dataSource === 'MANUAL' ? user.id : undefined
},
symbolProfileId: undefined,
@ -590,18 +592,19 @@ export class ImportService {
const value = new Big(quantity).mul(unitPrice).toNumber();
const valueInBaseCurrency = this.exchangeRateDataService.toCurrencyAtDate(
value,
currency ?? assetProfile.currency,
userCurrency,
date
);
const valueInBaseCurrency =
(await this.exchangeRateDataService.toCurrencyAtDate(
value,
currency ?? assetProfile.currency,
userCurrency,
date
)) ?? 0;
activities.push({
...order,
error,
value,
valueInBaseCurrency: await valueInBaseCurrency,
valueInBaseCurrency,
// @ts-ignore
SymbolProfile: assetProfile
});

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

@ -1,6 +1,7 @@
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { SubscriptionService } from '@ghostfolio/api/app/subscription/subscription.service';
import { UserService } from '@ghostfolio/api/app/user/user.service';
import { encodeDataSource } from '@ghostfolio/api/helper/data-source.helper';
import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
@ -17,7 +18,6 @@ import {
PROPERTY_UPTIME,
ghostfolioFearAndGreedIndexDataSourceStocks
} from '@ghostfolio/common/config';
import { encodeDataSource } from '@ghostfolio/common/helper';
import { InfoItem, Statistics } from '@ghostfolio/common/interfaces';
import { permissions } from '@ghostfolio/common/permissions';

4
apps/api/src/app/portfolio/current-rate.service.ts

@ -51,13 +51,13 @@ export class CurrentRateService {
const values: GetValueObject[] = [];
if (includesToday) {
const quotesBySymbol = await this.dataProviderService.getQuotes({
const quotes = await this.dataProviderService.getQuotes({
items: dataGatheringItems,
user: this.request?.user
});
for (const { dataSource, symbol } of dataGatheringItems) {
const quote = quotesBySymbol[symbol];
const quote = quotes[getAssetProfileIdentifier({ dataSource, symbol })];
if (quote?.dataProviderInfo) {
dataProviderInfos.push(quote.dataProviderInfo);

3
apps/api/src/app/portfolio/portfolio.service.spec.ts

@ -11,6 +11,7 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp
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 { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { Account, DataSource } from '@prisma/client';
import { Big } from 'big.js';
@ -198,7 +199,7 @@ describe('PortfolioService', () => {
portfolioService as unknown as {
getCashSymbolProfiles: (
aCashDetails: CashDetails
) => { dataSource: DataSource; symbol: string }[];
) => AssetProfileIdentifier[];
}
).getCashSymbolProfiles(cashDetails);

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

@ -46,6 +46,7 @@ import {
import {
AccountsResponse,
Activity,
AssetProfileIdentifier,
EnhancedSymbolProfile,
Filter,
HistoricalDataItem,
@ -204,21 +205,21 @@ export class PortfolioService {
switch (type) {
case ActivityType.DIVIDEND:
dividendInBaseCurrency +=
await this.exchangeRateDataService.toCurrencyAtDate(
(await this.exchangeRateDataService.toCurrencyAtDate(
new Big(quantity).mul(unitPrice).toNumber(),
currency ?? SymbolProfile.currency,
userCurrency,
date
);
)) ?? 0;
break;
case ActivityType.INTEREST:
interestInBaseCurrency +=
await this.exchangeRateDataService.toCurrencyAtDate(
(await this.exchangeRateDataService.toCurrencyAtDate(
unitPrice,
currency ?? SymbolProfile.currency,
userCurrency,
date
);
)) ?? 0;
break;
}
@ -776,11 +777,9 @@ export class PortfolioService {
symbol,
userId
}: {
dataSource: DataSource;
impersonationId: string;
symbol: string;
userId: string;
}): Promise<PortfolioHoldingResponse> {
} & AssetProfileIdentifier): Promise<PortfolioHoldingResponse> {
userId = await this.getUserId(impersonationId, userId);
const user = await this.userService.user({ id: userId });
const userCurrency = this.getUserCurrency(user);
@ -890,10 +889,13 @@ export class PortfolioService {
marketPrice
);
if (historicalData[symbol]) {
const historicalDataItems =
historicalData[getAssetProfileIdentifier({ dataSource, symbol })];
if (historicalDataItems) {
let j = -1;
for (const [date, { marketPrice }] of Object.entries(
historicalData[symbol]
historicalDataItems
)) {
while (
j + 1 < transactionPoints.length &&
@ -955,7 +957,6 @@ export class PortfolioService {
marketPrice,
marketPriceMax,
marketPriceMin,
SymbolProfile,
tags,
assetProfile: {
assetClass: SymbolProfile.assetClass,
@ -1381,12 +1382,10 @@ export class PortfolioService {
tags,
userId
}: {
dataSource: DataSource;
impersonationId: string;
symbol: string;
tags: Tag[];
userId: string;
}) {
} & AssetProfileIdentifier) {
userId = await this.getUserId(impersonationId, userId);
await this.activitiesService.assignTags({

43
apps/api/src/app/symbol/symbol.service.ts

@ -1,7 +1,10 @@
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { DATE_FORMAT } from '@ghostfolio/common/helper';
import {
DATE_FORMAT,
getAssetProfileIdentifier
} from '@ghostfolio/common/helper';
import {
DataProviderHistoricalResponse,
HistoricalDataItem,
@ -24,15 +27,31 @@ export class SymbolService {
public async get({
dataGatheringItem,
includeHistoricalData
includeHistoricalData,
useIntradayData = false
}: {
dataGatheringItem: DataGatheringItem;
includeHistoricalData?: number;
useIntradayData?: boolean;
}): Promise<SymbolItem> {
const quotes = await this.dataProviderService.getQuotes({
items: [dataGatheringItem]
});
const { currency, marketPrice } = quotes[dataGatheringItem.symbol] ?? {};
let currency: string;
let marketPrice: number;
if (useIntradayData) {
const latestMarketData = await this.marketDataService.getLatest({
dataSource: dataGatheringItem.dataSource,
symbol: dataGatheringItem.symbol
});
marketPrice = latestMarketData?.marketPrice;
} else {
const quotes = await this.dataProviderService.getQuotes({
items: [dataGatheringItem]
});
({ currency, marketPrice } =
quotes[getAssetProfileIdentifier(dataGatheringItem)] ?? {});
}
if (dataGatheringItem.dataSource && marketPrice >= 0) {
let historicalData: HistoricalDataItem[] = [];
@ -75,12 +94,17 @@ export class SymbolService {
date = new Date(),
symbol
}: DataGatheringItem): Promise<DataProviderHistoricalResponse> {
const assetProfileIdentifier = getAssetProfileIdentifier({
dataSource,
symbol
});
let historicalData: {
[symbol: string]: {
[assetProfileIdentifier: string]: {
[date: string]: DataProviderHistoricalResponse;
};
} = {
[symbol]: {}
[assetProfileIdentifier]: {}
};
try {
@ -93,7 +117,8 @@ export class SymbolService {
return {
marketPrice:
historicalData?.[symbol]?.[format(date, DATE_FORMAT)]?.marketPrice
historicalData?.[assetProfileIdentifier]?.[format(date, DATE_FORMAT)]
?.marketPrice
};
}

8
apps/api/src/events/asset-profile-changed.listener.ts

@ -5,10 +5,10 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { Injectable, Logger } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';
import { DataSource } from '@prisma/client';
import ms from 'ms';
import { AssetProfileChangedEvent } from './asset-profile-changed.event';
@ -64,11 +64,7 @@ export class AssetProfileChangedListener {
currency,
dataSource,
symbol
}: {
currency: string;
dataSource: DataSource;
symbol: string;
}) {
}: { currency: string } & AssetProfileIdentifier) {
this.logger.log(`Asset profile of ${symbol} (${dataSource}) has changed`);
if (

6
apps/api/src/helper/country.helper.ts

@ -7,8 +7,12 @@ export function getCountryCodeByName({
aliases?: Record<string, string>;
name: string;
}): string {
if (aliases[name]) {
return aliases[name];
}
for (const [code, country] of Object.entries(countries)) {
if (country.name === name || country.name === aliases[name]) {
if (country.name === name) {
return code;
}
}

67
apps/api/src/helper/data-source.helper.ts

@ -0,0 +1,67 @@
import { DataSource } from '@prisma/client';
import { createHash } from 'node:crypto';
const encodedDataSourceByDataSource = new Map<DataSource, string>(
Object.values(DataSource).map((dataSource) => {
return [dataSource, hashDataSource(dataSource)];
})
);
const dataSourceByEncodedDataSource = new Map<string, DataSource>(
[...encodedDataSourceByDataSource].map(([dataSource, encodedDataSource]) => {
return [encodedDataSource, dataSource];
})
);
/**
* @deprecated Backward compatibility to support importing data that was
* exported using the previous data source encoding
*/
const dataSourceByDeprecatedEncodedDataSource = new Map<string, DataSource>(
Object.values(DataSource).map((dataSource) => {
return [deprecatedHashDataSource(dataSource), dataSource];
})
);
/**
* @deprecated Backward compatibility (see above)
*/
function deprecatedHashDataSource(dataSource: DataSource) {
return Buffer.from(dataSource, 'utf-8').toString('hex');
}
function hashDataSource(dataSource: DataSource) {
return createHash('sha256').update(dataSource).digest('hex').slice(0, 8);
}
export function decodeDataSource(encodedDataSource: string) {
if (!encodedDataSource) {
return undefined;
}
return (
dataSourceByEncodedDataSource.get(encodedDataSource) ??
dataSourceByDeprecatedEncodedDataSource.get(encodedDataSource) ??
encodedDataSource
);
}
export function encodeDataSource(dataSource: DataSource) {
if (!dataSource) {
return undefined;
}
return encodedDataSourceByDataSource.get(dataSource);
}
export function getMaskedGhostfolioDataSource({
dataSource,
ghostfolioDataSources
}: {
dataSource: DataSource;
ghostfolioDataSources: string[];
}) {
return ghostfolioDataSources.includes(dataSource)
? DataSource.GHOSTFOLIO
: dataSource;
}

2
apps/api/src/interceptors/performance-logging/performance-logging.service.ts

@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class PerformanceLoggingService {
private readonly logger = new Logger(PerformanceLoggingService.name);
private readonly logger = new Logger();
public logPerformance({
className,

2
apps/api/src/interceptors/transform-data-source-in-request/transform-data-source-in-request.interceptor.ts

@ -1,5 +1,5 @@
import { decodeDataSource } from '@ghostfolio/api/helper/data-source.helper';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { decodeDataSource } from '@ghostfolio/common/helper';
import {
CallHandler,

26
apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts

@ -1,6 +1,10 @@
import {
encodeDataSource,
getMaskedGhostfolioDataSource
} from '@ghostfolio/api/helper/data-source.helper';
import { redactPaths } from '@ghostfolio/api/helper/object.helper';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { encodeDataSource } from '@ghostfolio/common/helper';
import { hasRole } from '@ghostfolio/common/permissions';
import {
CallHandler,
@ -44,20 +48,32 @@ export class TransformDataSourceInResponseInterceptor<
next: CallHandler<T>
): Observable<any> {
const isExportMode = context.getClass().name === 'ExportController';
const { user } = context.switchToHttp().getRequest();
return next.handle().pipe(
map((data: any) => {
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
const valueMap = this.encodedDataSourceMap;
const valueMap = hasRole(user, 'ADMIN')
? {}
: { ...this.encodedDataSourceMap };
if (isExportMode) {
for (const dataSource of this.configurationService.get(
const ghostfolioDataSources = this.configurationService.get(
'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER'
)) {
valueMap[dataSource] = 'GHOSTFOLIO';
) as DataSource[];
for (const dataSource of ghostfolioDataSources) {
valueMap[dataSource] = getMaskedGhostfolioDataSource({
dataSource,
ghostfolioDataSources
});
}
}
if (Object.keys(valueMap).length === 0) {
return data;
}
data = redactPaths({
valueMap,
object: data,

8
apps/api/src/services/benchmark/benchmark.service.ts

@ -8,7 +8,10 @@ import {
CACHE_TTL_INFINITE,
PROPERTY_BENCHMARKS
} from '@ghostfolio/common/config';
import { calculateBenchmarkTrend } from '@ghostfolio/common/helper';
import {
calculateBenchmarkTrend,
getAssetProfileIdentifier
} from '@ghostfolio/common/helper';
import {
AssetProfileIdentifier,
Benchmark,
@ -266,8 +269,9 @@ export class BenchmarkService {
let storeInCache = true;
const benchmarks = allTimeHighs.map((allTimeHigh, index) => {
const { dataSource, symbol } = benchmarkAssetProfiles[index];
const { marketPrice } =
quotes[benchmarkAssetProfiles[index].symbol] ?? {};
quotes[getAssetProfileIdentifier({ dataSource, symbol })] ?? {};
let performancePercentFromAllTimeHigh = 0;

5
apps/api/src/services/configuration/configuration.service.ts

@ -6,6 +6,7 @@ import {
DEFAULT_PORT,
DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY,
DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY,
DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY,
DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY,
DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT
} from '@ghostfolio/common/config';
@ -43,6 +44,7 @@ export class ConfigurationService {
ENABLE_FEATURE_AUTH_GOOGLE: bool({ default: false }),
ENABLE_FEATURE_AUTH_OIDC: bool({ default: false }),
ENABLE_FEATURE_AUTH_TOKEN: bool({ default: true }),
ENABLE_FEATURE_CRON: bool({ default: true }),
ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }),
ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES: bool({ default: true }),
ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }),
@ -88,6 +90,9 @@ export class ConfigurationService {
PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: num({
default: DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY
}),
PROCESSOR_GATHER_STATISTICS_CONCURRENCY: num({
default: DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY
}),
PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY: num({
default: DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY
}),

47
apps/api/src/services/cron/cron.module.ts

@ -1,12 +1,17 @@
import { UserModule } from '@ghostfolio/api/app/user/user.module';
import { UserService } from '@ghostfolio/api/app/user/user.service';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { PropertyModule } from '@ghostfolio/api/services/property/property.module';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { DataGatheringQueueModule } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.module';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { StatisticsGatheringQueueModule } from '@ghostfolio/api/services/queues/statistics-gathering/statistics-gathering.module';
import { StatisticsGatheringService } from '@ghostfolio/api/services/queues/statistics-gathering/statistics-gathering.service';
import { TwitterBotModule } from '@ghostfolio/api/services/twitter-bot/twitter-bot.module';
import { TwitterBotService } from '@ghostfolio/api/services/twitter-bot/twitter-bot.service';
import { Module } from '@nestjs/common';
import { Logger, Module } from '@nestjs/common';
import { CronService } from './cron.service';
@ -14,12 +19,46 @@ import { CronService } from './cron.service';
imports: [
ConfigurationModule,
DataGatheringQueueModule,
ExchangeRateDataModule,
PropertyModule,
StatisticsGatheringQueueModule,
TwitterBotModule,
UserModule
],
providers: [CronService]
providers: [
{
inject: [
ConfigurationService,
DataGatheringService,
PropertyService,
StatisticsGatheringService,
TwitterBotService,
UserService
],
provide: CronService,
useFactory: (
configurationService: ConfigurationService,
dataGatheringService: DataGatheringService,
propertyService: PropertyService,
statisticsGatheringService: StatisticsGatheringService,
twitterBotService: TwitterBotService,
userService: UserService
) => {
if (!configurationService.get('ENABLE_FEATURE_CRON')) {
Logger.log('Scheduled cron jobs are disabled', 'CronService');
return null;
}
return new CronService(
configurationService,
dataGatheringService,
propertyService,
statisticsGatheringService,
twitterBotService,
userService
);
}
}
]
})
export class CronModule {}

10
apps/api/src/services/cron/cron.service.ts

@ -1,6 +1,5 @@
import { UserService } from '@ghostfolio/api/app/user/user.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service';
import { StatisticsGatheringService } from '@ghostfolio/api/services/queues/statistics-gathering/statistics-gathering.service';
@ -24,7 +23,6 @@ export class CronService {
public constructor(
private readonly configurationService: ConfigurationService,
private readonly dataGatheringService: DataGatheringService,
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly propertyService: PropertyService,
private readonly statisticsGatheringService: StatisticsGatheringService,
private readonly twitterBotService: TwitterBotService,
@ -41,15 +39,11 @@ export class CronService {
@Cron(CronService.EVERY_HOUR_AT_RANDOM_MINUTE)
public async runEveryHourAtRandomMinute() {
if (await this.isDataGatheringEnabled()) {
await this.dataGatheringService.gather7Days();
await this.dataGatheringService.gatherHourlyMarketData();
await this.dataGatheringService.gatherRecentMarketData();
}
}
@Cron(CronExpression.EVERY_12_HOURS)
public async runEveryTwelveHours() {
await this.exchangeRateDataService.loadCurrencies();
}
@Cron(CronExpression.EVERY_DAY_AT_5PM)
public async runEveryDayAtFivePm() {
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {

7
apps/api/src/services/data-provider/data-enhancer/trackinsight/trackinsight.service.ts

@ -15,8 +15,11 @@ import { SymbolProfile } from '@prisma/client';
export class TrackinsightDataEnhancerService implements DataEnhancerInterface {
private static baseUrl = 'https://www.trackinsight.com/data-api';
private static countriesMapping = {
'Russian Federation': 'Russia',
USA: 'United States'
'Republic of Korea': 'KR',
'Russian Federation': 'RU',
Turkey: 'TR',
USA: 'US',
'Virgin Islands, British': 'VG'
};
private static holdingsWeightTreshold = 0.85;
private static sectorsMapping: Record<string, SectorName> = {

166
apps/api/src/services/data-provider/data-provider.service.ts

@ -1,5 +1,6 @@
import { ImportDataDto } from '@ghostfolio/api/app/import/import-data.dto';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { getMaskedGhostfolioDataSource } from '@ghostfolio/api/helper/data-source.helper';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
@ -77,19 +78,20 @@ export class DataProviderService implements OnModuleInit {
useCache: false
});
if (quotes[symbol]?.marketPrice > 0) {
if (
quotes[getAssetProfileIdentifier({ dataSource, symbol })]?.marketPrice > 0
) {
return true;
}
return false;
}
// TODO: Change symbol in response to assetProfileIdentifier
public async getAssetProfiles(items: AssetProfileIdentifier[]): Promise<{
[symbol: string]: Partial<SymbolProfile>;
[assetProfileIdentifier: string]: Partial<SymbolProfile>;
}> {
const response: {
[symbol: string]: Partial<SymbolProfile>;
[assetProfileIdentifier: string]: Partial<SymbolProfile>;
} = {};
const itemsGroupedByDataSource = groupBy(items, ({ dataSource }) => {
@ -115,7 +117,12 @@ export class DataProviderService implements OnModuleInit {
promises.push(
promise.then((assetProfile) => {
if (isCurrency(assetProfile?.currency)) {
response[symbol] = assetProfile;
response[
getAssetProfileIdentifier({
symbol,
dataSource: DataSource[dataSource]
})
] = { ...assetProfile, symbol };
}
})
);
@ -215,6 +222,9 @@ export class DataProviderService implements OnModuleInit {
} = {};
const dataSources = await this.getDataSources();
const ghostfolioDataSources = this.configurationService.get(
'DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER'
);
for (const [
index,
@ -222,6 +232,10 @@ export class DataProviderService implements OnModuleInit {
] of activitiesDto.entries()) {
const activityPath =
maxActivitiesToImport === 1 ? 'activity' : `activities.${index}`;
const maskedDataSource = getMaskedGhostfolioDataSource({
dataSource,
ghostfolioDataSources
});
if (!dataSources.includes(dataSource)) {
throw new Error(
@ -237,7 +251,7 @@ export class DataProviderService implements OnModuleInit {
if (dataProvider.getDataProviderInfo().isPremium) {
throw new Error(
`${activityPath}.dataSource ("${dataSource}") is not valid`
`${activityPath}.dataSource ("${maskedDataSource}") requires Ghostfolio Premium`
);
}
}
@ -281,7 +295,7 @@ export class DataProviderService implements OnModuleInit {
symbol
}
])
)?.[symbol];
)?.[assetProfileIdentifier];
} catch {}
if (!assetProfile?.name) {
@ -300,7 +314,7 @@ export class DataProviderService implements OnModuleInit {
if (!assetProfile?.name) {
throw new Error(
`activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${dataSource}")`
`activities.${index}.symbol ("${symbol}") is not valid for the specified data source ("${maskedDataSource}")`
);
}
@ -318,12 +332,10 @@ export class DataProviderService implements OnModuleInit {
symbol,
to
}: {
dataSource: DataSource;
from: Date;
granularity: Granularity;
symbol: string;
to: Date;
}) {
} & AssetProfileIdentifier) {
return this.getDataProvider(DataSource[dataSource]).getDividends({
from,
granularity,
@ -333,17 +345,20 @@ export class DataProviderService implements OnModuleInit {
});
}
// TODO: Change symbol in response to assetProfileIdentifier
public async getHistorical(
aItems: AssetProfileIdentifier[],
aGranularity: Granularity = 'month',
from: Date,
to: Date
): Promise<{
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
[assetProfileIdentifier: string]: {
[date: string]: DataProviderHistoricalResponse;
};
}> {
let response: {
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
[assetProfileIdentifier: string]: {
[date: string]: DataProviderHistoricalResponse;
};
} = {};
if (isEmpty(aItems) || !isValid(from) || !isValid(to)) {
@ -383,13 +398,20 @@ export class DataProviderService implements OnModuleInit {
ORDER BY date;`;
response = marketDataByGranularity.reduce((r, marketData) => {
const { date, marketPrice, symbol } = marketData;
const { dataSource, date, marketPrice, symbol } = marketData;
const assetProfileIdentifier = getAssetProfileIdentifier({
dataSource,
symbol
});
if (!r[symbol]) {
r[symbol] = {};
if (!r[assetProfileIdentifier]) {
r[assetProfileIdentifier] = {};
}
r[symbol][format(new Date(date), DATE_FORMAT)] = { marketPrice };
r[assetProfileIdentifier][format(new Date(date), DATE_FORMAT)] = {
marketPrice
};
return r;
}, {});
@ -400,7 +422,6 @@ export class DataProviderService implements OnModuleInit {
}
}
// TODO: Change symbol in response to assetProfileIdentifier
public async getHistoricalRaw({
assetProfileIdentifiers,
from,
@ -410,7 +431,9 @@ export class DataProviderService implements OnModuleInit {
from: Date;
to: Date;
}): Promise<{
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
[assetProfileIdentifier: string]: {
[date: string]: DataProviderHistoricalResponse;
};
}> {
for (const { currency, rootCurrency } of DERIVED_CURRENCIES) {
if (
@ -443,11 +466,14 @@ export class DataProviderService implements OnModuleInit {
);
const result: {
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
[assetProfileIdentifier: string]: {
[date: string]: DataProviderHistoricalResponse;
};
} = {};
const promises: Promise<{
data: { [date: string]: DataProviderHistoricalResponse };
dataSource: DataSource;
symbol: string;
}>[] = [];
for (const { dataSource, symbol } of assetProfileIdentifiers) {
@ -465,6 +491,7 @@ export class DataProviderService implements OnModuleInit {
promises.push(
Promise.resolve({
data,
dataSource,
symbol
})
);
@ -478,7 +505,7 @@ export class DataProviderService implements OnModuleInit {
requestTimeout: ms('30 seconds')
})
.then((data) => {
return { symbol, data: data?.[symbol] };
return { dataSource, symbol, data: data?.[symbol] };
})
);
}
@ -488,22 +515,26 @@ export class DataProviderService implements OnModuleInit {
try {
const allData = await Promise.all(promises);
for (const { data, symbol } of allData) {
for (const { data, dataSource, symbol } of allData) {
const currency = DERIVED_CURRENCIES.find(({ rootCurrency }) => {
return `${DEFAULT_CURRENCY}${rootCurrency}` === symbol;
});
if (currency) {
// Add derived currency
result[`${DEFAULT_CURRENCY}${currency.currency}`] =
this.transformHistoricalData({
allData,
currency: `${DEFAULT_CURRENCY}${currency.rootCurrency}`,
factor: currency.factor
});
result[
getAssetProfileIdentifier({
dataSource,
symbol: `${DEFAULT_CURRENCY}${currency.currency}`
})
] = this.transformHistoricalData({
allData,
currency: `${DEFAULT_CURRENCY}${currency.rootCurrency}`,
factor: currency.factor
});
}
result[symbol] = data;
result[getAssetProfileIdentifier({ dataSource, symbol })] = data;
}
} catch (error) {
this.logger.error(error);
@ -514,7 +545,6 @@ export class DataProviderService implements OnModuleInit {
return result;
}
// TODO: Change symbol in response to assetProfileIdentifier
public async getQuotes({
items,
requestTimeout,
@ -526,10 +556,12 @@ export class DataProviderService implements OnModuleInit {
useCache?: boolean;
user?: UserWithSettings;
}): Promise<{
[symbol: string]: DataProviderResponse;
[assetProfileIdentifier: string]: DataProviderResponse;
}> {
const response: {
[symbol: string]: DataProviderResponse;
[assetProfileIdentifier: string]: DataProviderResponse & {
symbol: string;
};
} = {};
const startTimeTotal = performance.now();
@ -538,11 +570,17 @@ export class DataProviderService implements OnModuleInit {
return symbol === `${DEFAULT_CURRENCY}USX`;
})
) {
response[`${DEFAULT_CURRENCY}USX`] = {
response[
getAssetProfileIdentifier({
dataSource: this.getDataSourceForExchangeRates(),
symbol: `${DEFAULT_CURRENCY}USX`
})
] = {
currency: 'USX',
dataSource: this.getDataSourceForExchangeRates(),
marketPrice: 100,
marketState: 'open'
marketState: 'open',
symbol: `${DEFAULT_CURRENCY}USX`
};
}
@ -557,8 +595,13 @@ export class DataProviderService implements OnModuleInit {
if (quoteString) {
try {
const cachedDataProviderResponse = JSON.parse(quoteString);
response[symbol] = cachedDataProviderResponse;
const cachedDataProviderResponse = JSON.parse(
quoteString
) as DataProviderResponse;
response[getAssetProfileIdentifier({ dataSource, symbol })] = {
...cachedDataProviderResponse,
symbol
};
continue;
} catch {}
}
@ -627,7 +670,11 @@ export class DataProviderService implements OnModuleInit {
);
const promise = Promise.resolve(
dataProvider.getQuotes({ requestTimeout, symbols: symbolsChunk })
dataProvider.getQuotes({
requestTimeout,
useCache,
symbols: symbolsChunk
})
);
promises.push(
@ -646,14 +693,19 @@ export class DataProviderService implements OnModuleInit {
continue;
}
response[symbol] = dataProviderResponse;
response[
getAssetProfileIdentifier({
symbol,
dataSource: DataSource[dataSource]
})
] = { ...dataProviderResponse, symbol };
this.redisCacheService.set(
this.redisCacheService.getQuoteKey({
symbol,
dataSource: DataSource[dataSource]
}),
JSON.stringify(response[symbol]),
JSON.stringify(dataProviderResponse),
this.configurationService.get('CACHE_QUOTES_TTL')
);
@ -663,7 +715,7 @@ export class DataProviderService implements OnModuleInit {
rootCurrency
} of DERIVED_CURRENCIES) {
if (symbol === `${DEFAULT_CURRENCY}${rootCurrency}`) {
response[`${DEFAULT_CURRENCY}${currency}`] = {
const derivedDataProviderResponse: DataProviderResponse = {
...dataProviderResponse,
currency,
marketPrice: new Big(
@ -674,12 +726,22 @@ export class DataProviderService implements OnModuleInit {
marketState: 'open'
};
response[
getAssetProfileIdentifier({
dataSource: DataSource[dataSource],
symbol: `${DEFAULT_CURRENCY}${currency}`
})
] = {
...derivedDataProviderResponse,
symbol: `${DEFAULT_CURRENCY}${currency}`
};
this.redisCacheService.set(
this.redisCacheService.getQuoteKey({
dataSource: DataSource[dataSource],
symbol: `${DEFAULT_CURRENCY}${currency}`
}),
JSON.stringify(response[`${DEFAULT_CURRENCY}${currency}`]),
JSON.stringify(derivedDataProviderResponse),
this.configurationService.get('CACHE_QUOTES_TTL')
);
}
@ -697,21 +759,21 @@ export class DataProviderService implements OnModuleInit {
try {
await this.marketDataService.updateMany({
data: Object.keys(response)
.filter((symbol) => {
data: Object.values(response)
.filter(({ marketPrice, marketState }) => {
return (
isNumber(response[symbol].marketPrice) &&
response[symbol].marketPrice > 0 &&
response[symbol].marketState === 'open'
isNumber(marketPrice) &&
marketPrice > 0 &&
marketState === 'open'
);
})
.map((symbol) => {
.map((dataProviderResponse) => {
return {
symbol,
dataSource: response[symbol].dataSource,
dataSource: dataProviderResponse.dataSource,
date: getStartOfUtcDate(new Date()),
marketPrice: response[symbol].marketPrice,
state: 'INTRADAY'
marketPrice: dataProviderResponse.marketPrice,
state: 'INTRADAY',
symbol: dataProviderResponse.symbol
};
})
});

6
apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts

@ -54,9 +54,9 @@ export class FinancialModelingPrepService
implements DataProviderInterface, OnModuleInit
{
private static countriesMapping = {
'Korea (the Republic of)': 'South Korea',
'Russian Federation': 'Russia',
'Taiwan (Province of China)': 'Taiwan'
'Korea (the Republic of)': 'KR',
'Russian Federation': 'RU',
'Taiwan (Province of China)': 'TW'
};
private readonly logger = new Logger(FinancialModelingPrepService.name);

1
apps/api/src/services/data-provider/interfaces/data-provider.interface.ts

@ -75,6 +75,7 @@ export interface GetHistoricalParams {
export interface GetQuotesParams {
requestTimeout?: number;
symbols: string[];
useCache?: boolean;
}
export interface GetSearchParams {

45
apps/api/src/services/data-provider/manual/manual.service.ts

@ -136,7 +136,8 @@ export class ManualService implements DataProviderInterface {
}
public async getQuotes({
symbols
symbols,
useCache = true
}: GetQuotesParams): Promise<{ [symbol: string]: DataProviderResponse }> {
const response: { [symbol: string]: DataProviderResponse } = {};
@ -164,32 +165,32 @@ export class ManualService implements DataProviderInterface {
}
});
const symbolProfilesWithScraperConfigurationAndInstantMode =
symbolProfiles.filter(({ scraperConfiguration }) => {
const symbolProfilesToScrape = symbolProfiles.filter(
({ scraperConfiguration }) => {
return (
scraperConfiguration?.mode === 'instant' &&
(scraperConfiguration?.mode === 'instant' || !useCache) &&
scraperConfiguration?.selector &&
scraperConfiguration?.url
);
});
const scraperResultPromises =
symbolProfilesWithScraperConfigurationAndInstantMode.map(
async ({ scraperConfiguration, symbol }) => {
try {
const marketPrice = await this.scrape({
scraperConfiguration,
symbol
});
return { marketPrice, symbol };
} catch (error) {
this.logger.error(
`Could not get quote for ${symbol} (${this.getName()}): [${error.name}] ${error.message}`
);
return { symbol, marketPrice: undefined };
}
}
);
const scraperResultPromises = symbolProfilesToScrape.map(
async ({ scraperConfiguration, symbol }) => {
try {
const marketPrice = await this.scrape({
scraperConfiguration,
symbol
});
return { marketPrice, symbol };
} catch (error) {
this.logger.error(
`Could not get quote for ${symbol} (${this.getName()}): [${error.name}] ${error.message}`
);
return { symbol, marketPrice: undefined };
}
);
}
);
// Wait for all scraping requests to complete concurrently
const scraperResults = await Promise.all(scraperResultPromises);

19
apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts

@ -8,10 +8,7 @@ import {
GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service';
import {
ghostfolioFearAndGreedIndexSymbol,
ghostfolioFearAndGreedIndexSymbolStocks
} from '@ghostfolio/common/config';
import { ghostfolioFearAndGreedIndexSymbolStocks } from '@ghostfolio/common/config';
import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper';
import {
DataProviderHistoricalResponse,
@ -64,12 +61,7 @@ export class RapidApiService implements DataProviderInterface {
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
}> {
try {
if (
[
ghostfolioFearAndGreedIndexSymbol,
ghostfolioFearAndGreedIndexSymbolStocks
].includes(symbol)
) {
if (symbol === ghostfolioFearAndGreedIndexSymbolStocks) {
const fgi = await this.getFearAndGreedIndex();
return {
@ -106,12 +98,7 @@ export class RapidApiService implements DataProviderInterface {
try {
const symbol = symbols[0];
if (
[
ghostfolioFearAndGreedIndexSymbol,
ghostfolioFearAndGreedIndexSymbolStocks
].includes(symbol)
) {
if (symbol === ghostfolioFearAndGreedIndexSymbolStocks) {
const fgi = await this.getFearAndGreedIndex();
return {

25
apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts

@ -11,9 +11,11 @@ import {
} from '@ghostfolio/common/config';
import {
DATE_FORMAT,
getAssetProfileIdentifier,
getYesterday,
resetHours
} from '@ghostfolio/common/helper';
import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces';
import { Injectable, Logger } from '@nestjs/common';
import {
@ -162,7 +164,7 @@ export class ExchangeRateDataService {
}
public async loadCurrencies() {
const result = await this.dataProviderService.getHistorical(
const historicalData = await this.dataProviderService.getHistorical(
this.currencyPairs,
'day',
getYesterday(),
@ -176,11 +178,26 @@ export class ExchangeRateDataService {
requestTimeout: ms('30 seconds')
});
for (const symbol of Object.keys(quotes)) {
if (isNumber(quotes[symbol].marketPrice)) {
const result: {
[symbol: string]: { [date: string]: DataProviderHistoricalResponse };
} = {};
for (const { dataSource, symbol } of this.currencyPairs) {
const assetProfileIdentifier = getAssetProfileIdentifier({
dataSource,
symbol
});
if (historicalData[assetProfileIdentifier]) {
result[symbol] = historicalData[assetProfileIdentifier];
}
const quote = quotes[assetProfileIdentifier];
if (isNumber(quote?.marketPrice)) {
result[symbol] = {
[format(getYesterday(), DATE_FORMAT)]: {
marketPrice: quotes[symbol].marketPrice
marketPrice: quote.marketPrice
}
};
}

2
apps/api/src/services/interfaces/environment.interface.ts

@ -19,6 +19,7 @@ export interface Environment extends CleanedEnvAccessors {
ENABLE_FEATURE_AUTH_GOOGLE: boolean;
ENABLE_FEATURE_AUTH_OIDC: boolean;
ENABLE_FEATURE_AUTH_TOKEN: boolean;
ENABLE_FEATURE_CRON: boolean;
ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean;
ENABLE_FEATURE_GATHER_NEW_EXCHANGE_RATES: boolean;
ENABLE_FEATURE_READ_ONLY_MODE: boolean;
@ -44,6 +45,7 @@ export interface Environment extends CleanedEnvAccessors {
PORT: number;
PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY: number;
PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY: number;
PROCESSOR_GATHER_STATISTICS_CONCURRENCY: number;
PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY: number;
PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT: number;
REDIS_DB: number;

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

@ -1,6 +1,7 @@
import { DateQuery } from '@ghostfolio/api/app/portfolio/interfaces/date-query.interface';
import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_TIMEOUT } from '@ghostfolio/common/config';
import { UpdateMarketDataDto } from '@ghostfolio/common/dtos';
import { resetHours } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
@ -40,6 +41,19 @@ export class MarketDataService {
});
}
public async getLatest({
dataSource,
symbol
}: AssetProfileIdentifier): Promise<MarketData> {
return this.prismaService.marketData.findFirst({
orderBy: [{ date: 'desc' }],
where: {
dataSource,
symbol
}
});
}
public async getMax({ dataSource, symbol }: AssetProfileIdentifier) {
return this.prismaService.marketData.findFirst({
select: {
@ -142,49 +156,52 @@ export class MarketDataService {
dataSource,
symbol
}: AssetProfileIdentifier & { data: Prisma.MarketDataUpdateInput[] }) {
await this.prismaService.$transaction(async (prisma) => {
if (data.length > 0) {
let minTime = Infinity;
let maxTime = -Infinity;
await this.prismaService.$transaction(
async (prisma) => {
if (data.length > 0) {
let minTime = Infinity;
let maxTime = -Infinity;
for (const { date } of data) {
const time = (date as Date).getTime();
for (const { date } of data) {
const time = (date as Date).getTime();
if (time < minTime) {
minTime = time;
}
if (time < minTime) {
minTime = time;
}
if (time > maxTime) {
maxTime = time;
if (time > maxTime) {
maxTime = time;
}
}
}
const minDate = new Date(minTime);
const maxDate = new Date(maxTime);
const minDate = new Date(minTime);
const maxDate = new Date(maxTime);
await prisma.marketData.deleteMany({
where: {
dataSource,
symbol,
date: {
gte: minDate,
lte: maxDate
await prisma.marketData.deleteMany({
where: {
dataSource,
symbol,
date: {
gte: minDate,
lte: maxDate
}
}
}
});
});
await prisma.marketData.createMany({
data: data.map(({ date, marketPrice, state }) => ({
dataSource,
symbol,
date: date as Date,
marketPrice: marketPrice as number,
state: state as MarketDataState
})),
skipDuplicates: true
});
}
});
await prisma.marketData.createMany({
data: data.map(({ date, marketPrice, state }) => ({
dataSource,
symbol,
date: date as Date,
marketPrice: marketPrice as number,
state: state as MarketDataState
})),
skipDuplicates: true
});
}
},
{ timeout: DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_TIMEOUT }
);
}
public async updateAssetProfileIdentifier(

3
apps/api/src/services/queues/data-gathering/data-gathering.module.ts

@ -28,7 +28,8 @@ import { DataGatheringProcessor } from './data-gathering.processor';
}),
BullModule.registerQueue({
limiter: {
duration: ms('4 seconds'),
duration: ms('3 seconds'),
groupKey: 'dataSource',
max: 1
},
name: DATA_GATHERING_QUEUE

21
apps/api/src/services/queues/data-gathering/data-gathering.processor.ts

@ -10,7 +10,11 @@ import {
GATHER_ASSET_PROFILE_PROCESS_JOB_NAME,
GATHER_HISTORICAL_MARKET_DATA_PROCESS_JOB_NAME
} from '@ghostfolio/common/config';
import { DATE_FORMAT, getStartOfUtcDate } from '@ghostfolio/common/helper';
import {
DATE_FORMAT,
getAssetProfileIdentifier,
getStartOfUtcDate
} from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
import { Process, Processor } from '@nestjs/bull';
@ -114,6 +118,11 @@ export class DataGatheringProcessor {
to: new Date()
});
const assetProfileIdentifier = getAssetProfileIdentifier({
dataSource,
symbol
});
const data: Prisma.MarketDataUpdateInput[] = [];
let lastMarketPrice: number;
@ -131,12 +140,14 @@ export class DataGatheringProcessor {
)
) {
if (
historicalData[symbol]?.[format(currentDate, DATE_FORMAT)]
?.marketPrice
historicalData[assetProfileIdentifier]?.[
format(currentDate, DATE_FORMAT)
]?.marketPrice
) {
lastMarketPrice =
historicalData[symbol]?.[format(currentDate, DATE_FORMAT)]
?.marketPrice;
historicalData[assetProfileIdentifier]?.[
format(currentDate, DATE_FORMAT)
]?.marketPrice;
}
if (lastMarketPrice) {

265
apps/api/src/services/queues/data-gathering/data-gathering.service.ts

@ -2,6 +2,7 @@ import { DataProviderService } from '@ghostfolio/api/services/data-provider/data
import { DataEnhancerInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-enhancer.interface';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
@ -17,6 +18,7 @@ import {
import {
DATE_FORMAT,
getAssetProfileIdentifier,
getStartOfUtcDate,
resetHours
} from '@ghostfolio/common/helper';
import {
@ -26,7 +28,7 @@ import {
import { InjectQueue } from '@nestjs/bull';
import { Inject, Injectable, Logger } from '@nestjs/common';
import { DataSource } from '@prisma/client';
import { Prisma } from '@prisma/client';
import { JobOptions, Queue } from 'bull';
import { format, min, subDays, subMilliseconds, subYears } from 'date-fns';
import { isEmpty } from 'lodash';
@ -43,6 +45,7 @@ export class DataGatheringService {
private readonly dataGatheringQueue: Queue,
private readonly dataProviderService: DataProviderService,
private readonly exchangeRateDataService: ExchangeRateDataService,
private readonly marketDataService: MarketDataService,
private readonly prismaService: PrismaService,
private readonly propertyService: PropertyService,
private readonly symbolProfileService: SymbolProfileService
@ -66,93 +69,6 @@ export class DataGatheringService {
return this.dataGatheringQueue.addBulk(jobs);
}
public async gather7Days() {
await this.gatherSymbols({
dataGatheringItems: await this.getCurrencies7D(),
priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH
});
await this.gatherSymbols({
dataGatheringItems: await this.getSymbols7D({
withUserSubscription: true
}),
priority: DATA_GATHERING_QUEUE_PRIORITY_MEDIUM
});
await this.gatherSymbols({
dataGatheringItems: await this.getSymbols7D({
withUserSubscription: false
}),
priority: DATA_GATHERING_QUEUE_PRIORITY_LOW
});
}
public async gatherMax() {
const dataGatheringItems = await this.getSymbolsMax();
await this.gatherSymbols({
dataGatheringItems,
priority: DATA_GATHERING_QUEUE_PRIORITY_LOW
});
}
public async gatherSymbol({ dataSource, date, symbol }: DataGatheringItem) {
const dataGatheringItems = (await this.getSymbolsMax())
.filter((dataGatheringItem) => {
return (
dataGatheringItem.dataSource === dataSource &&
dataGatheringItem.symbol === symbol
);
})
.map((item) => ({
...item,
date: date ?? item.date
}));
await this.gatherSymbols({
dataGatheringItems,
force: true,
priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH
});
}
public async gatherSymbolForDate({
dataSource,
date,
symbol
}: {
dataSource: DataSource;
date: Date;
symbol: string;
}) {
try {
const historicalData = await this.dataProviderService.getHistoricalRaw({
assetProfileIdentifiers: [{ dataSource, symbol }],
from: date,
to: date
});
const marketPrice =
historicalData[symbol][format(date, DATE_FORMAT)].marketPrice;
if (marketPrice) {
return await this.prismaService.marketData.upsert({
create: {
dataSource,
date,
marketPrice,
symbol
},
update: { marketPrice },
where: { dataSource_date_symbol: { dataSource, date, symbol } }
});
}
} catch (error) {
this.logger.error(error);
} finally {
return undefined;
}
}
public async gatherAssetProfiles(
aAssetProfileIdentifiers?: AssetProfileIdentifier[]
) {
@ -177,7 +93,9 @@ export class DataGatheringService {
assetProfileIdentifiers
);
for (const [symbol, assetProfile] of Object.entries(assetProfiles)) {
for (const assetProfile of Object.values(assetProfiles)) {
const { symbol } = assetProfile;
const symbolProfile = symbolProfiles.find(
({ symbol: symbolProfileSymbol }) => {
return symbolProfileSymbol === symbol;
@ -279,6 +197,137 @@ export class DataGatheringService {
}
}
public async gatherHourlyMarketData() {
try {
await this.exchangeRateDataService.loadCurrencies();
} catch (error) {
this.logger.error('Could not gather exchange rates', error);
}
const assetProfileIdentifiers =
await this.getHourlyAssetProfileIdentifiers();
if (assetProfileIdentifiers.length <= 0) {
return;
}
const date = getStartOfUtcDate(new Date());
try {
const quotes = await this.dataProviderService.getQuotes({
items: assetProfileIdentifiers,
useCache: false
});
const data: Prisma.MarketDataUpdateInput[] = [];
for (const { dataSource, symbol } of assetProfileIdentifiers) {
const quote = quotes[getAssetProfileIdentifier({ dataSource, symbol })];
if (!quote?.marketPrice) {
continue;
}
data.push({
dataSource,
date,
symbol,
marketPrice: quote.marketPrice,
state: 'INTRADAY'
});
}
await this.marketDataService.updateMany({ data });
} catch (error) {
this.logger.error('Could not gather hourly market data', error);
}
}
public async gatherMax() {
const dataGatheringItems = await this.getSymbolsMax();
await this.gatherSymbols({
dataGatheringItems,
priority: DATA_GATHERING_QUEUE_PRIORITY_LOW
});
}
public async gatherRecentMarketData() {
await this.gatherSymbols({
dataGatheringItems: await this.getCurrencies7D(),
priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH
});
await this.gatherSymbols({
dataGatheringItems: await this.getSymbols7D({
withUserSubscription: true
}),
priority: DATA_GATHERING_QUEUE_PRIORITY_MEDIUM
});
await this.gatherSymbols({
dataGatheringItems: await this.getSymbols7D({
withUserSubscription: false
}),
priority: DATA_GATHERING_QUEUE_PRIORITY_LOW
});
}
public async gatherSymbol({ dataSource, date, symbol }: DataGatheringItem) {
const dataGatheringItems = (await this.getSymbolsMax())
.filter((dataGatheringItem) => {
return (
dataGatheringItem.dataSource === dataSource &&
dataGatheringItem.symbol === symbol
);
})
.map((item) => ({
...item,
date: date ?? item.date
}));
await this.gatherSymbols({
dataGatheringItems,
force: true,
priority: DATA_GATHERING_QUEUE_PRIORITY_HIGH
});
}
public async gatherSymbolForDate({
dataSource,
date,
symbol
}: { date: Date } & AssetProfileIdentifier) {
try {
const historicalData = await this.dataProviderService.getHistoricalRaw({
assetProfileIdentifiers: [{ dataSource, symbol }],
from: date,
to: date
});
const marketPrice =
historicalData[getAssetProfileIdentifier({ dataSource, symbol })][
format(date, DATE_FORMAT)
].marketPrice;
if (marketPrice) {
return await this.prismaService.marketData.upsert({
create: {
dataSource,
date,
marketPrice,
symbol
},
update: { marketPrice },
where: { dataSource_date_symbol: { dataSource, date, symbol } }
});
}
} catch (error) {
this.logger.error(error);
} finally {
return undefined;
}
}
public async gatherSymbols({
dataGatheringItems,
force = false,
@ -389,6 +438,36 @@ export class DataGatheringService {
return min([aStartDate, subYears(new Date(), 10)]);
}
private async getHourlyAssetProfileIdentifiers(): Promise<
AssetProfileIdentifier[]
> {
const symbolProfiles = await this.prismaService.symbolProfile.findMany({
orderBy: [{ symbol: 'asc' }, { dataSource: 'asc' }],
select: {
dataSource: true,
scraperConfiguration: true,
symbol: true
},
where: {
dataGatheringFrequency: 'HOURLY',
isActive: true
}
});
return symbolProfiles
.filter(({ dataSource, scraperConfiguration }) => {
const manualDataSourceWithScraperConfiguration =
dataSource === 'MANUAL' && !isEmpty(scraperConfiguration);
return (
dataSource !== 'MANUAL' || manualDataSourceWithScraperConfiguration
);
})
.map(({ dataSource, symbol }) => {
return { dataSource, symbol };
});
}
private async getSymbols7D({
withUserSubscription = false
}: {
@ -469,14 +548,12 @@ export class DataGatheringService {
}
})
)
.filter((symbolProfile) => {
.filter(({ dataSource, scraperConfiguration }) => {
const manualDataSourceWithScraperConfiguration =
symbolProfile.dataSource === 'MANUAL' &&
!isEmpty(symbolProfile.scraperConfiguration);
dataSource === 'MANUAL' && !isEmpty(scraperConfiguration);
return (
symbolProfile.dataSource !== 'MANUAL' ||
manualDataSourceWithScraperConfiguration
dataSource !== 'MANUAL' || manualDataSourceWithScraperConfiguration
);
})
.map((symbolProfile) => {

37
apps/api/src/services/queues/statistics-gathering/statistics-gathering.processor.ts

@ -2,6 +2,7 @@ import { ConfigurationService } from '@ghostfolio/api/services/configuration/con
import { FetchService } from '@ghostfolio/api/services/fetch/fetch.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import {
DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY,
GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME,
GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME,
GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME,
@ -35,7 +36,14 @@ export class StatisticsGatheringProcessor {
private readonly propertyService: PropertyService
) {}
@Process(GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME)
@Process({
concurrency: parseInt(
process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ??
DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(),
10
),
name: GATHER_STATISTICS_DOCKER_HUB_PULLS_PROCESS_JOB_NAME
})
public async gatherDockerHubPullsStatistics() {
this.logger.log('Docker Hub pulls statistics gathering has been started');
@ -49,7 +57,14 @@ export class StatisticsGatheringProcessor {
this.logger.log('Docker Hub pulls statistics gathering has been completed');
}
@Process(GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME)
@Process({
concurrency: parseInt(
process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ??
DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(),
10
),
name: GATHER_STATISTICS_GITHUB_CONTRIBUTORS_PROCESS_JOB_NAME
})
public async gatherGitHubContributorsStatistics() {
this.logger.log(
'GitHub contributors statistics gathering has been started'
@ -67,7 +82,14 @@ export class StatisticsGatheringProcessor {
);
}
@Process(GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME)
@Process({
concurrency: parseInt(
process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ??
DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(),
10
),
name: GATHER_STATISTICS_GITHUB_STARGAZERS_PROCESS_JOB_NAME
})
public async gatherGitHubStargazersStatistics() {
this.logger.log('GitHub stargazers statistics gathering has been started');
@ -83,7 +105,14 @@ export class StatisticsGatheringProcessor {
);
}
@Process(GATHER_STATISTICS_UPTIME_PROCESS_JOB_NAME)
@Process({
concurrency: parseInt(
process.env.PROCESSOR_GATHER_STATISTICS_CONCURRENCY ??
DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY.toString(),
10
),
name: GATHER_STATISTICS_UPTIME_PROCESS_JOB_NAME
})
public async gatherUptimeStatistics() {
const monitorId = await this.propertyService.getByKey<string>(
PROPERTY_BETTER_UPTIME_MONITOR_ID

2
apps/api/src/services/symbol-profile/symbol-profile.service.ts

@ -178,6 +178,7 @@ export class SymbolProfileService {
comment,
countries,
currency,
dataGatheringFrequency,
holdings,
isActive,
name,
@ -195,6 +196,7 @@ export class SymbolProfileService {
comment,
countries,
currency,
dataGatheringFrequency,
holdings,
isActive,
name,

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

@ -3,7 +3,7 @@ import { BenchmarkService } from '@ghostfolio/api/services/benchmark/benchmark.s
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import {
ghostfolioFearAndGreedIndexDataSourceStocks,
ghostfolioFearAndGreedIndexSymbol
ghostfolioFearAndGreedIndexSymbolStocks
} from '@ghostfolio/common/config';
import {
resolveFearAndGreedIndex,
@ -49,7 +49,7 @@ export class TwitterBotService implements OnModuleInit {
const symbolItem = await this.symbolService.get({
dataGatheringItem: {
dataSource: ghostfolioFearAndGreedIndexDataSourceStocks,
symbol: ghostfolioFearAndGreedIndexSymbol
symbol: ghostfolioFearAndGreedIndexSymbolStocks
}
});

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

@ -1,5 +1,9 @@
import { getCssVariable } from '@ghostfolio/common/helper';
import { InfoItem, User } from '@ghostfolio/common/interfaces';
import {
AssetProfileIdentifier,
InfoItem,
User
} from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes';
import { ColorScheme } from '@ghostfolio/common/types';
@ -27,7 +31,6 @@ import {
RouterLink,
RouterOutlet
} from '@angular/router';
import { DataSource } from '@prisma/client';
import { Chart } from 'chart.js';
import { addIcons } from 'ionicons';
import { openOutline } from 'ionicons/icons';
@ -269,10 +272,7 @@ export class GfAppComponent implements OnInit {
private openHoldingDetailDialog({
dataSource,
symbol
}: {
dataSource: DataSource;
symbol: string;
}) {
}: AssetProfileIdentifier) {
this.userService
.get()
.pipe(takeUntilDestroyed(this.destroyRef))

2
apps/client/src/app/components/access-table/access-table.component.html

@ -9,7 +9,7 @@
<ng-container matColumnDef="grantee">
<th *matHeaderCellDef class="px-1" i18n mat-header-cell>Grantee</th>
<td *matCellDef="let element" class="px-1" mat-cell>
<td *matCellDef="let element" class="px-1 text-nowrap" mat-cell>
{{ element.grantee }}
</td>
</ng-container>

10
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_5_FIGURES
NUMERICAL_PRECISION_THRESHOLD_4_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_5_FIGURES &&
this.balance >= NUMERICAL_PRECISION_THRESHOLD_4_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_5_FIGURES
NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.dividendInBaseCurrencyPrecision = 0;
}
@ -267,7 +267,7 @@ export class GfAccountDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.equity >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
this.equity >= NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.equityPrecision = 0;
}
@ -280,7 +280,7 @@ export class GfAccountDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.interestInBaseCurrency >=
NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.interestInBaseCurrencyPrecision = 0;
}

2
apps/client/src/app/components/admin-jobs/admin-jobs.html

@ -27,7 +27,7 @@
<ng-container matColumnDef="index">
<th
*matHeaderCellDef
class="px-1 py-2 text-right"
class="justify-content-end px-1 py-2"
mat-header-cell
mat-sort-header="id"
>

27
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts

@ -305,17 +305,6 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit {
);
}
protected onGather7Days() {
this.adminService
.gather7Days()
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
setTimeout(() => {
window.location.reload();
}, 300);
});
}
protected onGatherMax() {
this.adminService
.gatherMax()
@ -334,6 +323,17 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit {
.subscribe();
}
protected onGatherRecentMarketData() {
this.adminService
.gatherRecentMarketData()
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
setTimeout(() => {
window.location.reload();
}, 300);
});
}
protected onOpenAssetProfileDialog({
dataSource,
symbol
@ -408,10 +408,7 @@ export class GfAdminMarketDataComponent implements AfterViewInit, OnInit {
private openAssetProfileDialog({
dataSource,
symbol
}: {
dataSource: DataSource;
symbol: string;
}) {
}: AssetProfileIdentifier) {
this.userService
.get()
.pipe(takeUntilDestroyed(this.destroyRef))

5
apps/client/src/app/components/admin-market-data/admin-market-data.html

@ -220,7 +220,7 @@
class="no-max-width"
xPosition="before"
>
<button mat-menu-item (click)="onGather7Days()">
<button mat-menu-item (click)="onGatherRecentMarketData()">
<ng-container i18n
>Gather Recent Historical Market Data</ng-container
>
@ -285,7 +285,8 @@
!canDeleteAssetProfile({
activitiesCount: element.activitiesCount,
isBenchmark: element.isBenchmark,
symbol: element.symbol
symbol: element.symbol,
watchedByCount: element.watchedByCount
})
"
(click)="

23
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -74,6 +74,7 @@ import { IonIcon } from '@ionic/angular/standalone';
import {
AssetClass,
AssetSubClass,
DataGatheringFrequency,
MarketData,
Prisma,
SymbolProfile
@ -155,6 +156,7 @@ export class GfAssetProfileDialogComponent implements OnInit {
comment: '',
countries: ['', jsonValidator()],
currency: '',
dataGatheringFrequency: new FormControl<DataGatheringFrequency>('DAILY'),
historicalData: this.formBuilder.group({
csvString: ''
}),
@ -199,6 +201,20 @@ export class GfAssetProfileDialogComponent implements OnInit {
protected currencies: string[] = [];
protected readonly dataGatheringFrequencyValues: {
value: DataGatheringFrequency;
viewValue: string;
}[] = [
{
value: 'DAILY',
viewValue: $localize`Daily`
},
{
value: 'HOURLY',
viewValue: $localize`Hourly`
}
];
protected readonly dateRangeOptions = [
{
label: $localize`Current week` + ' (' + $localize`WTD` + ')',
@ -401,6 +417,8 @@ export class GfAssetProfileDialogComponent implements OnInit {
}) ?? []
),
currency: this.assetProfile?.currency ?? null,
dataGatheringFrequency:
this.assetProfile?.dataGatheringFrequency ?? 'DAILY',
historicalData: {
csvString: GfAssetProfileDialogComponent.HISTORICAL_DATA_TEMPLATE
},
@ -532,7 +550,7 @@ export class GfAssetProfileDialogComponent implements OnInit {
) as Record<string, string>,
locale:
this.assetProfileForm.controls.scraperConfiguration.controls.locale
?.value ?? undefined,
?.value || undefined,
mode:
this.assetProfileForm.controls.scraperConfiguration.controls.mode
?.value ?? undefined,
@ -583,6 +601,9 @@ export class GfAssetProfileDialogComponent implements OnInit {
this.assetProfileForm.controls.assetSubClass.value ?? undefined,
comment: this.assetProfileForm.controls.comment.value || undefined,
currency: this.assetProfileForm.controls.currency.value ?? undefined,
dataGatheringFrequency:
this.assetProfileForm.controls.dataGatheringFrequency.value ??
undefined,
isActive: isBoolean(this.assetProfileForm.controls.isActive.value)
? this.assetProfileForm.controls.isActive.value
: undefined,

24
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html

@ -113,7 +113,7 @@
<ion-icon name="reader-outline" />
<div class="d-none d-sm-block ml-2" i18n>Overview</div>
</ng-template>
<div class="container mt-3 p-0">
<div class="container px-0 py-3">
<div class="row w-100">
@if (isEditAssetProfileIdentifierMode) {
<div class="col-12 mb-4">
@ -165,7 +165,11 @@
</div>
} @else {
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="assetProfile?.symbol"
<gf-value
i18n
size="medium"
[enableCopyToClipboardButton]="true"
[value]="assetProfile?.symbol"
>Symbol</gf-value
>
</div>
@ -202,6 +206,7 @@
<div class="col-6 mb-3">
<gf-value
size="medium"
[enableCopyToClipboardButton]="true"
[hidden]="!assetProfile?.isin"
[value]="assetProfile?.isin"
>ISIN</gf-value
@ -444,6 +449,21 @@
></textarea>
</mat-form-field>
</div>
<div>
<mat-form-field appearance="outline" class="w-100 without-hint">
<mat-label i18n>Data Gathering Frequency</mat-label>
<mat-select formControlName="dataGatheringFrequency">
@for (
dataGatheringFrequencyValue of dataGatheringFrequencyValues;
track dataGatheringFrequencyValue.value
) {
<mat-option [value]="dataGatheringFrequencyValue.value">{{
dataGatheringFrequencyValue.viewValue
}}</mat-option>
}
</mat-select>
</mat-form-field>
</div>
</form>
</div>
</mat-tab>

6
apps/client/src/app/components/admin-platform/admin-platform.component.html

@ -96,3 +96,9 @@
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
<tr *matRowDef="let row; columns: displayedColumns" mat-row></tr>
</table>
<mat-paginator
[class.d-none]="dataSource.data.length <= pageSize"
[hidePageSize]="true"
[pageSize]="pageSize"
/>

6
apps/client/src/app/components/admin-platform/admin-platform.component.ts

@ -1,4 +1,5 @@
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config';
import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos';
import { ConfirmationDialogType } from '@ghostfolio/common/enums';
import { getLocale, getLowercase } from '@ghostfolio/common/helper';
@ -22,6 +23,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
@ -46,6 +48,7 @@ import { CreateOrUpdatePlatformDialogParams } from './create-or-update-platform-
IonIcon,
MatButtonModule,
MatMenuModule,
MatPaginatorModule,
MatSortModule,
MatTableModule,
RouterModule
@ -59,11 +62,13 @@ export class GfAdminPlatformComponent implements OnInit {
protected dataSource = new MatTableDataSource<Platform>();
protected readonly displayedColumns = ['name', 'url', 'accounts', 'actions'];
protected readonly pageSize = DEFAULT_PAGE_SIZE;
protected platforms: Platform[];
private readonly deviceType = computed(
() => this.deviceDetectorService.deviceInfo().deviceType
);
private readonly paginator = viewChild.required(MatPaginator);
private readonly sort = viewChild.required(MatSort);
private readonly adminService = inject(AdminService);
@ -145,6 +150,7 @@ export class GfAdminPlatformComponent implements OnInit {
this.platforms = platforms;
this.dataSource = new MatTableDataSource(platforms);
this.dataSource.paginator = this.paginator();
this.dataSource.sort = this.sort();
this.dataSource.sortingDataAccessor = getLowercase;

30
apps/client/src/app/components/admin-settings/admin-settings.component.scss

@ -10,7 +10,33 @@
}
.mat-mdc-card {
--mat-card-outlined-container-color: whitesmoke;
--gradient-opacity: 50%;
--mat-card-outlined-outline-color: rgb(193, 219, 254);
background-color: white;
background-image: linear-gradient(
109.6deg,
color-mix(in srgb, rgba(255, 255, 255, 1) 100%, transparent) 11.2%,
color-mix(
in srgb,
rgba(221, 108, 241, 0.26) var(--gradient-opacity),
transparent
)
42%,
color-mix(
in srgb,
rgba(229, 106, 253, 0.71) var(--gradient-opacity),
transparent
)
71.5%,
color-mix(
in srgb,
rgba(123, 183, 253, 1) var(--gradient-opacity),
transparent
)
100%
);
color: rgb(var(--dark-primary-text));
.mat-mdc-card-actions {
min-height: 0;
@ -32,6 +58,6 @@
:host-context(.theme-dark) {
.mat-mdc-card {
--mat-card-outlined-container-color: #222222;
--mat-card-outlined-outline-color: white;
}
}

6
apps/client/src/app/components/admin-tag/admin-tag.component.html

@ -89,3 +89,9 @@
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr>
<tr *matRowDef="let row; columns: displayedColumns" mat-row></tr>
</table>
<mat-paginator
[class.d-none]="dataSource.data.length <= pageSize"
[hidePageSize]="true"
[pageSize]="pageSize"
/>

6
apps/client/src/app/components/admin-tag/admin-tag.component.ts

@ -1,4 +1,5 @@
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config';
import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos';
import { ConfirmationDialogType } from '@ghostfolio/common/enums';
import { getLocale, getLowercase } from '@ghostfolio/common/helper';
@ -21,6 +22,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { MatButtonModule } from '@angular/material/button';
import { MatDialog } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
@ -44,6 +46,7 @@ import { CreateOrUpdateTagDialogParams } from './create-or-update-tag-dialog/int
IonIcon,
MatButtonModule,
MatMenuModule,
MatPaginatorModule,
MatSortModule,
MatTableModule,
RouterModule
@ -62,11 +65,13 @@ export class GfAdminTagComponent implements OnInit {
'activities',
'actions'
];
protected readonly pageSize = DEFAULT_PAGE_SIZE;
protected tags: Tag[];
private readonly deviceType = computed(
() => this.deviceDetectorService.deviceInfo().deviceType
);
private readonly paginator = viewChild.required(MatPaginator);
private readonly sort = viewChild.required(MatSort);
private readonly changeDetectorRef = inject(ChangeDetectorRef);
@ -147,6 +152,7 @@ export class GfAdminTagComponent implements OnInit {
this.tags = tags;
this.dataSource = new MatTableDataSource(this.tags);
this.dataSource.paginator = this.paginator();
this.dataSource.sort = this.sort();
this.dataSource.sortingDataAccessor = getLowercase;

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

@ -2,7 +2,7 @@ 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_4_FIGURES
} from '@ghostfolio/common/config';
import { CreateOrderDto } from '@ghostfolio/common/dtos';
import {
@ -116,6 +116,19 @@ export class GfHoldingDetailDialogComponent implements OnInit {
protected accounts: Account[];
protected activitiesCount: number;
protected assetClass: string;
protected assetProfile: Pick<
EnhancedSymbolProfile,
| 'assetClass'
| 'assetSubClass'
| 'countries'
| 'currency'
| 'dataSource'
| 'isin'
| 'name'
| 'sectors'
| 'symbol'
| 'userId'
>;
protected assetSubClass: string;
protected averagePrice: number;
protected averagePricePrecision = 2;
@ -164,7 +177,6 @@ export class GfHoldingDetailDialogComponent implements OnInit {
};
protected sortColumn = 'date';
protected sortDirection: SortDirection = 'desc';
protected SymbolProfile: EnhancedSymbolProfile;
protected tagsAvailable: Tag[];
protected readonly translate = translate;
protected user: User;
@ -266,6 +278,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
.subscribe(
({
activitiesCount,
assetProfile,
averagePrice,
dataProviderInfo,
dateOfFirstActivity,
@ -280,15 +293,15 @@ export class GfHoldingDetailDialogComponent implements OnInit {
netPerformancePercentWithCurrencyEffect,
netPerformanceWithCurrencyEffect,
quantity,
SymbolProfile,
tags,
value
}) => {
this.activitiesCount = activitiesCount;
this.assetProfile = assetProfile;
this.averagePrice = averagePrice;
if (
this.averagePrice >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES &&
this.averagePrice >= NUMERICAL_PRECISION_THRESHOLD_4_FIGURES &&
this.data.deviceType === 'mobile'
) {
this.averagePricePrecision = 0;
@ -307,7 +320,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.dividendInBaseCurrency >=
NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.dividendInBaseCurrencyPrecision = 0;
}
@ -322,8 +335,8 @@ export class GfHoldingDetailDialogComponent implements OnInit {
this.user?.permissions,
permissions.readMarketDataOfOwnAssetProfile
) &&
SymbolProfile?.dataSource === 'MANUAL' &&
SymbolProfile?.userId === this.user?.id;
assetProfile?.dataSource === 'MANUAL' &&
assetProfile?.userId === this.user?.id;
this.historicalDataItems = historicalData.map(
({ averagePrice, date, marketPrice }) => {
@ -345,7 +358,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.investmentInBaseCurrencyWithCurrencyEffect >=
NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.investmentInBaseCurrencyWithCurrencyEffectPrecision = 0;
}
@ -355,7 +368,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.marketPriceMax >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
this.marketPriceMax >= NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.marketPriceMaxPrecision = 0;
}
@ -364,14 +377,14 @@ export class GfHoldingDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.marketPriceMin >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
this.marketPriceMin >= NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.marketPriceMinPrecision = 0;
}
if (
this.data.deviceType === 'mobile' &&
this.marketPrice >= NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
this.marketPrice >= NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.marketPricePrecision = 0;
}
@ -393,7 +406,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
if (
this.data.deviceType === 'mobile' &&
this.netPerformanceWithCurrencyEffect >=
NUMERICAL_PRECISION_THRESHOLD_5_FIGURES
NUMERICAL_PRECISION_THRESHOLD_4_FIGURES
) {
this.netPerformanceWithCurrencyEffectPrecision = 0;
}
@ -402,7 +415,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
if (Number.isInteger(this.quantity)) {
this.quantityPrecision = 0;
} else if (SymbolProfile?.assetSubClass === 'CRYPTOCURRENCY') {
} else if (assetProfile?.assetSubClass === 'CRYPTOCURRENCY') {
if (this.quantity < 10) {
this.quantityPrecision = 8;
} else if (this.quantity < 1000) {
@ -412,9 +425,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
}
}
this.reportDataGlitchMail = `mailto:hi@ghostfol.io?Subject=Ghostfolio Data Glitch Report&body=Hello%0D%0DI would like to report a data glitch for%0D%0DSymbol: ${SymbolProfile?.symbol}%0DData Source: ${SymbolProfile?.dataSource}%0D%0DAdditional notes:%0D%0DCan you please take a look?%0D%0DKind regards`;
this.sectors = {};
this.SymbolProfile = SymbolProfile;
this.tags = tags.map((tag) => {
return {
@ -427,16 +438,22 @@ export class GfHoldingDetailDialogComponent implements OnInit {
this.value = value;
if (SymbolProfile?.assetClass) {
this.assetClass = translate(SymbolProfile?.assetClass);
const reportDataGlitchSubject = `Ghostfolio Data Glitch Report${
this.assetProfile?.symbol ? ` (${this.assetProfile.symbol})` : ''
}`;
this.reportDataGlitchMail = `mailto:hi@ghostfol.io?Subject=${reportDataGlitchSubject}&body=Hello%0D%0DI would like to report a data glitch for%0D%0DSymbol: ${this.assetProfile?.symbol}%0DData Source: ${this.assetProfile?.dataSource}%0D%0DAdditional notes:%0D%0DCan you please take a look?%0D%0DKind regards`;
if (this.assetProfile?.assetClass) {
this.assetClass = translate(this.assetProfile?.assetClass);
}
if (SymbolProfile?.assetSubClass) {
this.assetSubClass = translate(SymbolProfile?.assetSubClass);
if (this.assetProfile?.assetSubClass) {
this.assetSubClass = translate(this.assetProfile?.assetSubClass);
}
if (SymbolProfile?.countries?.length > 0) {
for (const country of SymbolProfile.countries) {
if (this.assetProfile?.countries?.length > 0) {
for (const country of this.assetProfile.countries) {
this.countries[country.code] = {
name: getCountryName({ code: country.code }),
value: country.weight
@ -444,8 +461,8 @@ export class GfHoldingDetailDialogComponent implements OnInit {
}
}
if (SymbolProfile?.sectors?.length > 0) {
for (const sector of SymbolProfile.sectors) {
if (this.assetProfile?.sectors?.length > 0) {
for (const sector of this.assetProfile.sectors) {
this.sectors[sector.name] = {
name: translate(sector.name),
value: sector.weight
@ -565,12 +582,12 @@ export class GfHoldingDetailDialogComponent implements OnInit {
const activity: CreateOrderDto = {
accountId: this.accounts.length === 1 ? this.accounts[0].id : undefined,
comment: undefined,
currency: this.SymbolProfile?.currency ?? '',
dataSource: this.SymbolProfile?.dataSource,
currency: this.assetProfile?.currency ?? '',
dataSource: this.assetProfile?.dataSource,
date: today.toISOString(),
fee: 0,
quantity: this.quantity,
symbol: this.SymbolProfile?.symbol ?? '',
symbol: this.assetProfile?.symbol ?? '',
tags: this.tags.map(({ id }) => {
return id;
}),
@ -601,7 +618,7 @@ export class GfHoldingDetailDialogComponent implements OnInit {
.subscribe((data) => {
downloadAsFile({
content: data,
fileName: `ghostfolio-export-${this.SymbolProfile?.symbol}-${format(
fileName: `ghostfolio-export-${this.assetProfile?.symbol}-${format(
parseISO(data.meta.date),
'yyyyMMddHHmm'
)}.json`,

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

@ -1,7 +1,7 @@
<gf-dialog-header
position="center"
[deviceType]="data.deviceType"
[title]="SymbolProfile?.name ?? SymbolProfile?.symbol"
[title]="assetProfile?.name ?? assetProfile?.symbol"
(closeButtonClicked)="onClose()"
/>
@ -24,11 +24,11 @@
[benchmarkDataItems]="benchmarkDataItems"
[benchmarkLabel]="benchmarkLabel"
[colorScheme]="data.colorScheme"
[currency]="SymbolProfile?.currency"
[currency]="assetProfile?.currency"
[historicalDataItems]="historicalDataItems"
[isAnimated]="true"
[label]="
isUUID(data.symbol) ? (SymbolProfile?.name ?? data.symbol) : data.symbol
isUUID(data.symbol) ? (assetProfile?.name ?? data.symbol) : data.symbol
"
[locale]="data.locale"
[showGradient]="true"
@ -60,8 +60,8 @@
[value]="netPerformanceWithCurrencyEffect"
>
@if (
SymbolProfile?.currency &&
data.baseCurrency !== SymbolProfile?.currency
assetProfile?.currency &&
data.baseCurrency !== assetProfile?.currency
) {
Change with currency effect
} @else {
@ -80,8 +80,8 @@
[value]="netPerformancePercentWithCurrencyEffect"
>
@if (
SymbolProfile?.currency &&
data.baseCurrency !== SymbolProfile?.currency
assetProfile?.currency &&
data.baseCurrency !== assetProfile?.currency
) {
Performance with currency effect
} @else {
@ -96,7 +96,7 @@
[isCurrency]="true"
[locale]="data.locale"
[precision]="averagePricePrecision"
[unit]="SymbolProfile?.currency"
[unit]="assetProfile?.currency"
[value]="averagePrice"
>Average Unit Price</gf-value
>
@ -108,7 +108,7 @@
[isCurrency]="true"
[locale]="data.locale"
[precision]="marketPricePrecision"
[unit]="SymbolProfile?.currency"
[unit]="assetProfile?.currency"
[value]="marketPrice"
>Market Price</gf-value
>
@ -124,7 +124,7 @@
[isCurrency]="true"
[locale]="data.locale"
[precision]="marketPriceMinPrecision"
[unit]="SymbolProfile?.currency"
[unit]="assetProfile?.currency"
[value]="marketPriceMin"
>Minimum Price</gf-value
>
@ -140,7 +140,7 @@
[isCurrency]="true"
[locale]="data.locale"
[precision]="marketPriceMaxPrecision"
[unit]="SymbolProfile?.currency"
[unit]="assetProfile?.currency"
[value]="marketPriceMax"
>Maximum Price</gf-value
>
@ -250,23 +250,23 @@
>
</div>
@if (
SymbolProfile?.countries?.length > 0 ||
SymbolProfile?.sectors?.length > 0
assetProfile?.countries?.length > 0 ||
assetProfile?.sectors?.length > 0
) {
@if (
SymbolProfile?.countries?.length === 1 &&
SymbolProfile?.sectors?.length === 1
assetProfile?.countries?.length === 1 &&
assetProfile?.sectors?.length === 1
) {
<div class="col-6 mb-3">
<gf-value
i18n
size="medium"
[locale]="data.locale"
[value]="translate(SymbolProfile.sectors[0].name)"
[value]="translate(assetProfile.sectors[0].name)"
>Sector</gf-value
>
</div>
@if (SymbolProfile?.countries?.length === 1) {
@if (assetProfile?.countries?.length === 1) {
<div class="col-6 mb-3">
<gf-value
i18n
@ -274,7 +274,7 @@
[locale]="data.locale"
[value]="
getCountryName({
code: SymbolProfile.countries[0].code
code: assetProfile.countries[0].code
})
"
>Country</gf-value
@ -313,8 +313,8 @@
i18n
size="medium"
[enableCopyToClipboardButton]="true"
[hidden]="!SymbolProfile?.symbol"
[value]="SymbolProfile?.symbol"
[hidden]="!assetProfile?.symbol"
[value]="assetProfile?.symbol"
>Symbol</gf-value
>
</div>
@ -322,8 +322,8 @@
<gf-value
size="medium"
[enableCopyToClipboardButton]="true"
[hidden]="!SymbolProfile?.isin"
[value]="SymbolProfile?.isin"
[hidden]="!assetProfile?.isin"
[value]="assetProfile?.isin"
>ISIN</gf-value
>
</div>
@ -404,12 +404,12 @@
<div class="d-none d-sm-block ml-2" i18n>Market Data</div>
</ng-template>
<gf-historical-market-data-editor
[currency]="SymbolProfile?.currency"
[dataSource]="SymbolProfile?.dataSource"
[currency]="assetProfile?.currency"
[dataSource]="assetProfile?.dataSource"
[dateOfFirstActivity]="dateOfFirstActivity"
[locale]="data.locale"
[marketData]="marketDataItems"
[symbol]="SymbolProfile?.symbol"
[symbol]="assetProfile?.symbol"
[user]="user"
(marketDataChanged)="onMarketDataChanged($event)"
/>
@ -462,8 +462,8 @@
mat-stroked-button
[queryParams]="{
assetProfileDialog: true,
dataSource: SymbolProfile?.dataSource,
symbol: SymbolProfile?.symbol
dataSource: assetProfile?.dataSource,
symbol: assetProfile?.symbol
}"
[routerLink]="routerLinkAdminControlMarketData"
(click)="onClose()"

4
apps/client/src/app/components/home-market/home-market.component.ts

@ -1,6 +1,6 @@
import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config';
import { ghostfolioFearAndGreedIndexSymbolStocks } from '@ghostfolio/common/config';
import { resetHours } from '@ghostfolio/common/helper';
import {
Benchmark,
@ -86,7 +86,7 @@ export class GfHomeMarketComponent implements OnInit {
.fetchSymbolItem({
dataSource: this.info.fearAndGreedDataSource,
includeHistoricalData: this.numberOfDays,
symbol: ghostfolioFearAndGreedIndexSymbol
symbol: ghostfolioFearAndGreedIndexSymbolStocks
})
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(({ historicalData, marketPrice }) => {

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

@ -12,6 +12,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value';
import {
ChangeDetectionStrategy,
@ -51,6 +52,7 @@ import { catchError } from 'rxjs/operators';
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [
FormsModule,
GfValueComponent,
IonIcon,
MatButtonModule,
MatCardModule,

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

@ -260,7 +260,13 @@
<div class="pr-1 w-50">
Ghostfolio <ng-container i18n>User ID</ng-container>
</div>
<div class="pl-1 text-monospace w-50">{{ user?.id }}</div>
<div class="pl-1 w-50">
<gf-value
class="text-monospace"
[enableCopyToClipboardButton]="true"
[value]="user?.id"
/>
</div>
</div>
<div class="align-items-center d-flex py-1">
<div class="pr-1 w-50"></div>

10
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts

@ -106,9 +106,13 @@ export class GfUserDetailDialogComponent implements OnInit {
public getSum() {
return getSum(
this.subscriptionsDataSource.data.map(({ price }) => {
return new Big(price);
})
this.subscriptionsDataSource.data
.filter(({ price }) => {
return price !== null;
})
.map(({ price }) => {
return new Big(price);
})
).toNumber();
}

25
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html

@ -128,7 +128,7 @@
@if (subscriptionsDataSource.data.length > 0) {
<div class="row">
<div class="col">
<h2 class="h6" i18n>Subscriptions</h2>
<h2 class="h6" i18n>Subscription History</h2>
<div class="overflow-x-auto">
<table
class="gf-table w-100"
@ -137,7 +137,7 @@
>
<ng-container matColumnDef="createdAt">
<th *matHeaderCellDef class="px-1" mat-header-cell>
<ng-container i18n>Created</ng-container>
<ng-container i18n>Creation</ng-container>
</th>
<td *matCellDef="let element" class="px-1" mat-cell>
<gf-value
@ -170,13 +170,18 @@
class="px-1 text-right"
mat-cell
>
<gf-value
class="d-inline-block justify-content-end"
[isCurrency]="true"
[locale]="data.locale"
[unit]="baseCurrency"
[value]="element.price"
/>
@if (element.price === null) {
<span></span>
<span class="ml-1">{{ baseCurrency }}</span>
} @else {
<gf-value
class="d-inline-block justify-content-end"
[isCurrency]="true"
[locale]="data.locale"
[unit]="baseCurrency"
[value]="element.price"
/>
}
</td>
<td *matFooterCellDef class="px-1 text-right" mat-footer-cell>
<gf-value
@ -191,7 +196,7 @@
<ng-container matColumnDef="expiresAt">
<th *matHeaderCellDef class="px-1" mat-header-cell>
<ng-container i18n>Expires</ng-container>
<ng-container i18n>Expiration</ng-container>
</th>
<td *matCellDef="let element" class="px-1" mat-cell>
<gf-value

7
apps/client/src/app/pages/accounts/transfer-balance/interfaces/interfaces.ts

@ -1,5 +1,12 @@
import { FormControl, FormGroup } from '@angular/forms';
import { Account } from '@prisma/client';
export interface TransferBalanceDialogParams {
accounts: Account[];
}
export type TransferBalanceForm = FormGroup<{
balance: FormControl<number | string | null>;
fromAccount: FormControl<string | null>;
toAccount: FormControl<string | null>;
}>;

78
apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts

@ -1,10 +1,9 @@
import { TransferBalanceDto } from '@ghostfolio/common/dtos';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import {
AbstractControl,
FormBuilder,
FormControl,
FormGroup,
ReactiveFormsModule,
ValidationErrors,
@ -21,7 +20,10 @@ import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { Account } from '@prisma/client';
import { TransferBalanceDialogParams } from './interfaces/interfaces';
import {
TransferBalanceDialogParams,
TransferBalanceForm
} from './interfaces/interfaces';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
@ -40,57 +42,63 @@ import { TransferBalanceDialogParams } from './interfaces/interfaces';
templateUrl: 'transfer-balance-dialog.html'
})
export class GfTransferBalanceDialogComponent {
public accounts: Account[] = [];
public currency: string;
public transferBalanceForm: FormGroup;
protected readonly accounts: Account[] =
inject<TransferBalanceDialogParams>(MAT_DIALOG_DATA).accounts;
protected currency: string;
protected readonly transferBalanceForm: TransferBalanceForm = new FormGroup(
{
balance: new FormControl<number | string | null>('', Validators.required),
fromAccount: new FormControl<string | null>('', Validators.required),
toAccount: new FormControl<string | null>('', Validators.required)
},
{
validators: this.compareAccounts
}
);
public constructor(
@Inject(MAT_DIALOG_DATA) public data: TransferBalanceDialogParams,
public dialogRef: MatDialogRef<GfTransferBalanceDialogComponent>,
private formBuilder: FormBuilder
) {}
private readonly dialogRef =
inject<MatDialogRef<GfTransferBalanceDialogComponent>>(MatDialogRef);
public ngOnInit() {
this.accounts = this.data.accounts;
this.transferBalanceForm.controls.fromAccount.valueChanges.subscribe(
(id) => {
const currency = this.accounts.find((account) => {
return account.id === id;
})?.currency;
this.transferBalanceForm = this.formBuilder.group(
{
balance: ['', Validators.required],
fromAccount: ['', Validators.required],
toAccount: ['', Validators.required]
},
{
validators: this.compareAccounts
if (currency) {
this.currency = currency;
}
}
);
this.transferBalanceForm.get('fromAccount').valueChanges.subscribe((id) => {
this.currency = this.accounts.find((account) => {
return account.id === id;
}).currency;
});
}
public onCancel() {
protected onCancel() {
this.dialogRef.close();
}
public onSubmit() {
protected onSubmit() {
const account: TransferBalanceDto = {
accountIdFrom: this.transferBalanceForm.get('fromAccount').value,
accountIdTo: this.transferBalanceForm.get('toAccount').value,
balance: this.transferBalanceForm.get('balance').value
accountIdFrom: this.transferBalanceForm.controls.fromAccount.value ?? '',
accountIdTo: this.transferBalanceForm.controls.toAccount.value ?? '',
balance: Number(this.transferBalanceForm.controls.balance.value)
};
this.dialogRef.close({ account });
}
private compareAccounts(control: AbstractControl): ValidationErrors {
const accountFrom = control.get('fromAccount');
const accountTo = control.get('toAccount');
private compareAccounts(
formGroup: TransferBalanceForm
): ValidationErrors | null {
const accountFrom = formGroup.controls.fromAccount;
const accountTo = formGroup.controls.toAccount;
if (accountFrom.value === accountTo.value) {
return { invalid: true };
}
return null;
}
}

6
apps/client/src/app/pages/api/api-page.component.ts

@ -94,7 +94,7 @@ export class GfApiPageComponent implements OnInit {
private fetchAssetProfile({ symbol }: { symbol: string }) {
return this.http
.get<DataProviderGhostfolioAssetProfileResponse>(
`/api/v1/data-providers/ghostfolio/asset-profile/${symbol}`,
`/api/v1/data-providers/ghostfolio/asset-profile/${encodeURIComponent(symbol)}`,
{ headers: this.getHeaders() }
)
.pipe(this.catchFetchFailure(), takeUntilDestroyed(this.destroyRef));
@ -107,7 +107,7 @@ export class GfApiPageComponent implements OnInit {
return this.http
.get<DividendsResponse>(
`/api/v2/data-providers/ghostfolio/dividends/${symbol}`,
`/api/v2/data-providers/ghostfolio/dividends/${encodeURIComponent(symbol)}`,
{
params,
headers: this.getHeaders()
@ -129,7 +129,7 @@ export class GfApiPageComponent implements OnInit {
return this.http
.get<HistoricalResponse>(
`/api/v2/data-providers/ghostfolio/historical/${symbol}`,
`/api/v2/data-providers/ghostfolio/historical/${encodeURIComponent(symbol)}`,
{
params,
headers: this.getHeaders()

8
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html

@ -164,12 +164,14 @@
@for (message of errorMessages; track message; let i = $index) {
<mat-expansion-panel [disabled]="!details[i]">
<mat-expansion-panel-header class="pl-1">
<mat-panel-title>
<div class="d-flex">
<mat-panel-title class="w-100">
<div class="d-flex w-100">
<div class="align-items-center d-flex mr-2">
<ion-icon name="warning-outline" />
</div>
<div>{{ message }}</div>
<div class="text-truncate" title="{{ message }}">
{{ message }}
</div>
</div>
</mat-panel-title>
</mat-expansion-panel-header>

11
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.scss

@ -1,3 +1,5 @@
@use '@angular/material' as mat;
:host {
display: block;
@ -41,8 +43,13 @@
}
.mat-expansion-panel {
background: none;
box-shadow: none;
@include mat.expansion-overrides(
(
container-background-color: transparent,
container-elevation-shadow: none,
container-shape: 0
)
);
.mat-expansion-panel-header {
color: inherit;

333
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -12,7 +12,7 @@ import {
User
} from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { Market, MarketAdvanced } from '@ghostfolio/common/types';
import { MarketAdvanced } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
@ -24,7 +24,9 @@ import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';
import {
ChangeDetectorRef,
Component,
computed,
DestroyRef,
inject,
OnInit
} from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
@ -41,6 +43,9 @@ import {
} from '@prisma/client';
import { isNumber } from 'lodash';
import { DeviceDetectorService } from 'ngx-device-detector';
import { filter, switchMap, tap } from 'rxjs';
import { AllocationsPageParams } from './interfaces/interfaces';
@Component({
imports: [
@ -57,21 +62,23 @@ import { DeviceDetectorService } from 'ngx-device-detector';
templateUrl: './allocations-page.html'
})
export class GfAllocationsPageComponent implements OnInit {
public accounts: {
protected accounts: {
[id: string]: Pick<Account, 'name'> & {
id: string;
value: number;
};
};
public continents: {
protected continents: {
[code: string]: { name: string; value: number };
};
public countries: {
protected countries: {
[code: string]: { name: string; value: number };
};
public deviceType: string;
public hasImpersonationId: boolean;
public holdings: {
protected readonly deviceType = computed(
() => this.deviceDetectorService.deviceInfo().deviceType
);
protected hasImpersonationId: boolean;
protected holdings: {
[symbol: string]: Pick<
PortfolioPosition['assetProfile'],
| 'assetClass'
@ -82,28 +89,26 @@ export class GfAllocationsPageComponent implements OnInit {
| 'name'
> & { etfProvider: string; exchange?: string; value: number };
};
public isLoading = false;
public markets: {
[key in Market]: { id: Market; valueInPercentage: number };
};
public marketsAdvanced: {
protected isLoading = false;
protected markets: PortfolioDetails['markets'];
protected marketsAdvanced: {
[key in MarketAdvanced]: {
id: MarketAdvanced;
name: string;
value: number;
};
};
public platforms: {
protected platforms: {
[id: string]: Pick<Platform, 'name'> & {
id: string;
value: number;
};
};
public portfolioDetails: PortfolioDetails;
public sectors: {
protected portfolioDetails: PortfolioDetails;
protected sectors: {
[name: string]: { name: string; value: number };
};
public symbols: {
protected symbols: {
[name: string]: {
dataSource?: DataSource;
name: string;
@ -111,38 +116,46 @@ export class GfAllocationsPageComponent implements OnInit {
value: number;
};
};
public topHoldings: HoldingWithParents[];
public topHoldingsMap: {
protected topHoldings: HoldingWithParents[];
protected readonly UNKNOWN_KEY = UNKNOWN_KEY;
protected user: User;
private topHoldingsMap: {
[name: string]: { name: string; value: number };
};
public totalValueInEtf = 0;
public UNKNOWN_KEY = UNKNOWN_KEY;
public user: User;
public worldMapChartFormat: string;
public constructor(
private changeDetectorRef: ChangeDetectorRef,
private dataService: DataService,
private destroyRef: DestroyRef,
private deviceDetectorService: DeviceDetectorService,
private dialog: MatDialog,
private impersonationStorageService: ImpersonationStorageService,
private route: ActivatedRoute,
private router: Router,
private userService: UserService
) {
private totalValueInEtf = 0;
private readonly changeDetectorRef = inject(ChangeDetectorRef);
private readonly dataService = inject(DataService);
private readonly destroyRef = inject(DestroyRef);
private readonly deviceDetectorService = inject(DeviceDetectorService);
private readonly dialog = inject(MatDialog);
private readonly impersonationStorageService = inject(
ImpersonationStorageService
);
private readonly route = inject(ActivatedRoute);
private readonly router = inject(Router);
private readonly userService = inject(UserService);
public constructor() {
this.route.queryParams
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((params) => {
if (params['accountId'] && params['accountDetailDialog']) {
this.openAccountDetailDialog(params['accountId']);
.subscribe(
({ accountId, accountDetailDialog }: AllocationsPageParams) => {
if (accountId && accountDetailDialog) {
this.openAccountDetailDialog(accountId);
}
}
});
);
}
public ngOnInit() {
this.deviceType = this.deviceDetectorService.getDeviceInfo().deviceType;
protected get worldMapChartFormat(): string {
return this.showValuesInPercentage()
? '{0}%'
: `{0} ${this.user?.settings?.baseCurrency}`;
}
public ngOnInit() {
this.impersonationStorageService
.onChangeHasImpersonation()
.pipe(takeUntilDestroyed(this.destroyRef))
@ -151,56 +164,58 @@ export class GfAllocationsPageComponent implements OnInit {
});
this.userService.stateChanged
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((state) => {
if (state?.user) {
.pipe(
filter((state) => !!state?.user),
tap((state) => {
this.user = state.user;
this.worldMapChartFormat = this.showValuesInPercentage()
? `{0}%`
: `{0} ${this.user?.settings?.baseCurrency}`;
this.isLoading = true;
this.initialize();
this.fetchPortfolioDetails()
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe((portfolioDetails) => {
this.initialize();
this.portfolioDetails = portfolioDetails;
this.changeDetectorRef.markForCheck();
}),
switchMap(() => this.fetchPortfolioDetails()),
takeUntilDestroyed(this.destroyRef)
)
.subscribe((portfolioDetails) => {
this.initialize();
this.initializeAllocationsData();
this.portfolioDetails = portfolioDetails;
this.isLoading = false;
this.initializeAllocationsData();
this.changeDetectorRef.markForCheck();
});
this.isLoading = false;
this.changeDetectorRef.markForCheck();
}
this.changeDetectorRef.markForCheck();
});
this.initialize();
}
public onAccountChartClicked({ accountId }: { accountId: string }) {
protected onAccountChartClicked({ accountId }: { accountId: string }) {
if (accountId && accountId !== UNKNOWN_KEY) {
this.router.navigate([], {
void this.router.navigate([], {
queryParams: { accountId, accountDetailDialog: true }
});
}
}
public onSymbolChartClicked({ dataSource, symbol }: AssetProfileIdentifier) {
protected onSymbolChartClicked({
dataSource,
symbol
}: AssetProfileIdentifier) {
if (dataSource && symbol) {
this.router.navigate([], {
void this.router.navigate([], {
queryParams: { dataSource, symbol, holdingDetailDialog: true }
});
}
}
protected showValuesInPercentage() {
return this.hasImpersonationId || this.user?.settings?.isRestrictedView;
}
private extractCurrency({
assetClass,
assetSubClass,
@ -226,9 +241,9 @@ export class GfAllocationsPageComponent implements OnInit {
name
}: {
assetSubClass: PortfolioPosition['assetProfile']['assetSubClass'];
name: string;
name?: string;
}) {
if (assetSubClass === 'ETF') {
if (assetSubClass === 'ETF' && name) {
const [firstWord] = name.split(' ');
return firstWord;
}
@ -298,7 +313,7 @@ export class GfAllocationsPageComponent implements OnInit {
this.platforms = {};
this.portfolioDetails = {
accounts: {},
createdAt: undefined,
createdAt: new Date(),
holdings: {},
platforms: {},
summary: undefined
@ -327,7 +342,7 @@ export class GfAllocationsPageComponent implements OnInit {
let value = 0;
if (this.showValuesInPercentage()) {
value = valueInPercentage;
value = valueInPercentage ?? 0;
} else {
value = valueInBaseCurrency;
}
@ -342,30 +357,24 @@ export class GfAllocationsPageComponent implements OnInit {
for (const [symbol, position] of Object.entries(
this.portfolioDetails.holdings
)) {
let value = 0;
if (this.showValuesInPercentage()) {
value = position.allocationInPercentage;
} else {
value = position.valueInBaseCurrency;
}
this.holdings[symbol] = {
value,
assetClass:
position.assetProfile.assetClass || (UNKNOWN_KEY as AssetClass),
assetClassLabel: position.assetProfile.assetClassLabel || UNKNOWN_KEY,
assetClassLabel: position.assetProfile.assetClassLabel ?? UNKNOWN_KEY,
assetSubClass:
position.assetProfile.assetSubClass || (UNKNOWN_KEY as AssetSubClass),
assetSubClassLabel:
position.assetProfile.assetSubClassLabel || UNKNOWN_KEY,
position.assetProfile.assetSubClassLabel ?? UNKNOWN_KEY,
currency: this.extractCurrency(position.assetProfile),
etfProvider: this.extractEtfProvider({
assetSubClass: position.assetProfile.assetSubClass,
name: position.assetProfile.name
}),
exchange: position.exchange,
name: position.assetProfile.name
name: position.assetProfile.name,
value: this.showValuesInPercentage()
? position.allocationInPercentage
: (position.valueInBaseCurrency ?? 0)
};
// Prepare analysis data by continents, countries, holdings and sectors
@ -373,53 +382,50 @@ export class GfAllocationsPageComponent implements OnInit {
if (position.assetProfile.countries.length > 0) {
for (const country of position.assetProfile.countries) {
const { code, continent, weight } = country;
const value =
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage) ?? 0;
const continentData = this.continents[continent];
if (this.continents[continent]?.value) {
this.continents[continent].value +=
weight *
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage);
if (continentData) {
continentData.value += weight * value;
} else {
this.continents[continent] = {
name: translate(continent),
value:
weight *
(isNumber(position.valueInBaseCurrency)
? this.portfolioDetails.holdings[symbol].valueInBaseCurrency
: this.portfolioDetails.holdings[symbol].valueInPercentage)
value: weight * value
};
}
if (this.countries[code]?.value) {
this.countries[code].value +=
weight *
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage);
const countryData = this.countries[code];
if (countryData) {
countryData.value += weight * value;
} else {
this.countries[code] = {
name: getCountryName({ code }),
value:
weight *
(isNumber(position.valueInBaseCurrency)
? this.portfolioDetails.holdings[symbol].valueInBaseCurrency
: this.portfolioDetails.holdings[symbol].valueInPercentage)
value: weight * value
};
}
}
} 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;
const value =
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage) ?? 0;
const continentData = this.continents[UNKNOWN_KEY];
if (continentData) {
continentData.value += value;
}
const countryData = this.countries[UNKNOWN_KEY];
if (countryData) {
countryData.value += value;
}
}
if (position.assetProfile.holdings.length > 0) {
@ -429,21 +435,18 @@ export class GfAllocationsPageComponent implements OnInit {
valueInBaseCurrency
} of position.assetProfile.holdings) {
const normalizedAssetName = this.normalizeAssetName(name);
const value = isNumber(valueInBaseCurrency)
? valueInBaseCurrency
: allocationInPercentage * (position.valueInPercentage ?? 0);
const holdingData = this.topHoldingsMap[normalizedAssetName];
if (this.topHoldingsMap[normalizedAssetName]?.value) {
this.topHoldingsMap[normalizedAssetName].value += isNumber(
valueInBaseCurrency
)
? valueInBaseCurrency
: allocationInPercentage *
this.portfolioDetails.holdings[symbol].valueInPercentage;
if (holdingData) {
holdingData.value += value;
} else {
this.topHoldingsMap[normalizedAssetName] = {
name,
value: isNumber(valueInBaseCurrency)
? valueInBaseCurrency
: allocationInPercentage *
this.portfolioDetails.holdings[symbol].valueInPercentage
value
};
}
}
@ -452,30 +455,33 @@ export class GfAllocationsPageComponent implements OnInit {
if (position.assetProfile.sectors.length > 0) {
for (const sector of position.assetProfile.sectors) {
const { name, weight } = sector;
const value =
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage) ?? 0;
if (this.sectors[name]?.value) {
this.sectors[name].value +=
weight *
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage);
const sectorData = this.sectors[name];
if (sectorData) {
sectorData.value += weight * value;
} else {
this.sectors[name] = {
name: translate(name),
value:
weight *
(isNumber(position.valueInBaseCurrency)
? this.portfolioDetails.holdings[symbol].valueInBaseCurrency
: this.portfolioDetails.holdings[symbol].valueInPercentage)
value: weight * value
};
}
}
} else {
this.sectors[UNKNOWN_KEY].value += isNumber(
position.valueInBaseCurrency
)
? this.portfolioDetails.holdings[symbol].valueInBaseCurrency
: this.portfolioDetails.holdings[symbol].valueInPercentage;
const value =
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage) ?? 0;
const sectorData = this.sectors[UNKNOWN_KEY];
if (sectorData) {
sectorData.value += value;
}
}
if (this.holdings[symbol].assetSubClass === 'ETF') {
@ -484,23 +490,26 @@ export class GfAllocationsPageComponent implements OnInit {
this.symbols[prettifySymbol(symbol)] = {
dataSource: position.assetProfile.dataSource,
name: position.assetProfile.name,
name: position.assetProfile.name ?? '',
symbol: prettifySymbol(symbol),
value: isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage
value:
(isNumber(position.valueInBaseCurrency)
? position.valueInBaseCurrency
: position.valueInPercentage) ?? 0
};
}
this.markets = this.portfolioDetails.markets;
Object.values(this.portfolioDetails.marketsAdvanced).forEach(
({ id, valueInBaseCurrency, valueInPercentage }) => {
this.marketsAdvanced[id].value = isNumber(valueInBaseCurrency)
? valueInBaseCurrency
: valueInPercentage;
}
);
if (this.portfolioDetails.marketsAdvanced) {
Object.values(this.portfolioDetails.marketsAdvanced).forEach(
({ id, valueInBaseCurrency, valueInPercentage }) => {
this.marketsAdvanced[id].value = isNumber(valueInBaseCurrency)
? valueInBaseCurrency
: valueInPercentage;
}
);
}
for (const [
id,
@ -509,7 +518,7 @@ export class GfAllocationsPageComponent implements OnInit {
let value = 0;
if (this.showValuesInPercentage()) {
value = valueInPercentage;
value = valueInPercentage ?? 0;
} else {
value = valueInBaseCurrency;
}
@ -522,12 +531,11 @@ export class GfAllocationsPageComponent implements OnInit {
}
this.topHoldings = Object.values(this.topHoldingsMap)
.map(({ name, value }) => {
.map(({ name, value }): HoldingWithParents => {
if (this.showValuesInPercentage()) {
return {
name,
allocationInPercentage: value,
valueInBaseCurrency: null
allocationInPercentage: value
};
}
@ -547,11 +555,12 @@ export class GfAllocationsPageComponent implements OnInit {
}
);
return currentParentHolding
return currentParentHolding &&
isNumber(currentParentHolding.valueInBaseCurrency)
? {
allocationInPercentage:
currentParentHolding.valueInBaseCurrency / value,
name: holding.assetProfile.name,
name: holding.assetProfile.name ?? '',
position: holding,
symbol: prettifySymbol(symbol),
valueInBaseCurrency:
@ -596,26 +605,22 @@ export class GfAllocationsPageComponent implements OnInit {
autoFocus: false,
data: {
accountId: aAccountId,
deviceType: this.deviceType,
deviceType: this.deviceType(),
hasImpersonationId: this.hasImpersonationId,
hasPermissionToCreateActivity:
!this.hasImpersonationId &&
hasPermission(this.user?.permissions, permissions.createActivity) &&
!this.user?.settings?.isRestrictedView
},
height: this.deviceType === 'mobile' ? '98vh' : '80vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem'
height: this.deviceType() === 'mobile' ? '98vh' : '80vh',
width: this.deviceType() === 'mobile' ? '100vw' : '50rem'
});
dialogRef
.afterClosed()
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(() => {
this.router.navigate(['.'], { relativeTo: this.route });
void this.router.navigate(['.'], { relativeTo: this.route });
});
}
public showValuesInPercentage() {
return this.hasImpersonationId || this.user?.settings?.isRestrictedView;
}
}

2
apps/client/src/app/pages/portfolio/allocations/allocations-page.html

@ -115,7 +115,7 @@
[isInPercentage]="showValuesInPercentage()"
[keys]="['symbol']"
[locale]="user?.settings?.locale"
[showLabels]="deviceType !== 'mobile'"
[showLabels]="deviceType() !== 'mobile'"
(proportionChartClicked)="onSymbolChartClicked($event)"
/>
</mat-card-content>

6
apps/client/src/app/pages/portfolio/allocations/interfaces/interfaces.ts

@ -0,0 +1,6 @@
import { Params } from '@angular/router';
export interface AllocationsPageParams extends Params {
accountDetailDialog?: string;
accountId?: string;
}

131
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts

@ -5,84 +5,94 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { translate } from '@ghostfolio/ui/i18n';
import { DataService } from '@ghostfolio/ui/services';
import { Component, OnInit } from '@angular/core';
import {
ChangeDetectionStrategy,
Component,
computed,
inject
} from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { ActivatedRoute, RouterModule } from '@angular/router';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'page' },
imports: [MatButtonModule, RouterModule],
selector: 'gf-product-page',
styleUrls: ['./product-page.scss'],
templateUrl: './product-page.html'
})
export class GfProductPageComponent implements OnInit {
public key: string;
public price: number;
public product1: Product;
public product2: Product;
public routerLinkAbout = publicRoutes.about.routerLink;
public routerLinkFeatures = publicRoutes.features.routerLink;
public routerLinkResourcesPersonalFinanceTools =
publicRoutes.resources.subRoutes.personalFinanceTools.routerLink;
public tags: string[];
public constructor(
private dataService: DataService,
private route: ActivatedRoute
) {}
public ngOnInit() {
export class GfProductPageComponent {
protected readonly price = computed(() => {
const { subscriptionOffer } = this.dataService.fetchInfo();
return subscriptionOffer?.price;
});
this.price = subscriptionOffer?.price;
protected readonly product1 = computed<Product>(() => ({
founded: 2021,
hasFreePlan: true,
hasSelfHostingAbility: true,
isOpenSource: true,
key: 'ghostfolio',
languages: [
'Chinese (简体中文)',
'Deutsch',
'English',
'Español',
'Français',
'Italiano',
'Korean (한국어)',
'Nederlands',
'Português',
'Türkçe'
],
name: 'Ghostfolio',
origin: getCountryName({ code: 'CH' }),
regions: [$localize`Global`],
slogan: 'Open Source Wealth Management',
useAnonymously: true
}));
this.product1 = {
founded: 2021,
hasFreePlan: true,
hasSelfHostingAbility: true,
isOpenSource: true,
key: 'ghostfolio',
languages: [
'Chinese (简体中文)',
'Deutsch',
'English',
'Español',
'Français',
'Italiano',
'Korean (한국어)',
'Nederlands',
'Português',
'Türkçe'
],
name: 'Ghostfolio',
origin: getCountryName({ code: 'CH' }),
regions: [$localize`Global`],
slogan: 'Open Source Wealth Management',
useAnonymously: true
};
protected readonly product2 = computed<Product>(() => {
const product = personalFinanceTools.find(({ key }) => {
return key === this.route.snapshot.data['key'];
});
this.product2 = {
...personalFinanceTools.find(({ key }) => {
return key === this.route.snapshot.data['key'];
})
const mappedProduct = {
key: product?.key ?? '',
name: product?.name ?? '',
...product
};
if (this.product2.origin) {
this.product2.origin = getCountryName({ code: this.product2.origin });
if (mappedProduct.origin) {
mappedProduct.origin = getCountryName({ code: mappedProduct.origin });
}
if (this.product2.regions) {
this.product2.regions = this.product2.regions.map((region) => {
return translate(region);
if (mappedProduct.regions) {
mappedProduct.regions = mappedProduct.regions.map((region) => {
return region === 'Global'
? translate(region)
: getCountryName({ code: region });
});
}
this.tags = [
this.product1.name,
this.product1.origin,
this.product2.name,
this.product2.origin,
return mappedProduct;
});
protected readonly routerLinkAbout = publicRoutes.about.routerLink;
protected readonly routerLinkFeatures = publicRoutes.features.routerLink;
protected readonly routerLinkResourcesPersonalFinanceTools =
publicRoutes.resources.subRoutes.personalFinanceTools.routerLink;
protected readonly tags = computed<string[]>(() => {
const product1 = this.product1();
const product2 = this.product2();
return [
product1.name,
product1.origin,
product2.name,
product2.origin,
$localize`Alternative`,
$localize`App`,
$localize`Budgeting`,
@ -103,11 +113,14 @@ export class GfProductPageComponent implements OnInit {
$localize`Wealth Management`,
`WealthTech`
]
.filter((item) => {
.filter((item): item is string => {
return !!item;
})
.sort((a, b) => {
return a.localeCompare(b, undefined, { sensitivity: 'base' });
});
}
});
private readonly dataService = inject(DataService);
private readonly route = inject(ActivatedRoute);
}

116
apps/client/src/app/pages/resources/personal-finance-tools/product-page.html

@ -6,10 +6,10 @@
<h1 class="mb-1">
<strong>Ghostfolio</strong>:
<ng-container i18n>The Open Source Alternative to</ng-container
>&nbsp;<strong>{{ product2.name }}</strong>
>&nbsp;<strong>{{ product2().name }}</strong>
</h1>
</div>
@if (product2.isArchived) {
@if (product2().isArchived) {
<div class="info-container my-4 p-2 rounded text-center text-muted">
<ng-container i18n>This page has been archived.</ng-container>
</div>
@ -17,7 +17,7 @@
<section class="mb-4">
<p i18n>
Are you looking for an open source alternative to
{{ product2.name }}?
{{ product2().name }}?
<a [routerLink]="routerLinkAbout">Ghostfolio</a> is a powerful
portfolio management tool that provides individuals with a
comprehensive platform to track, analyze, and optimize their
@ -31,7 +31,7 @@
</p>
<p i18n>
Ghostfolio is an open source software (OSS), providing a
cost-effective alternative to {{ product2.name }} making it
cost-effective alternative to {{ product2().name }} making it
particularly suitable for individuals on a tight budget, such as
those
<a href="../en/blog/2023/07/exploring-the-path-to-fire"
@ -42,9 +42,9 @@
</p>
<p i18n>
Let’s dive deeper into the detailed Ghostfolio vs
{{ product2.name }} comparison table below to gain a thorough
{{ product2().name }} comparison table below to gain a thorough
understanding of how Ghostfolio positions itself relative to
{{ product2.name }}. We will explore various aspects such as
{{ product2().name }}. We will explore various aspects such as
features, data privacy, pricing, and more, allowing you to make a
well-informed choice for your personal requirements.
</p>
@ -54,7 +54,7 @@
<caption class="text-center" i18n>
Ghostfolio vs
{{
product2.name
product2().name
}}
comparison table
</caption>
@ -63,31 +63,31 @@
<th class="mat-mdc-header-cell px-1 py-2"></th>
<th class="mat-mdc-header-cell px-1 py-2">Ghostfolio</th>
<th class="mat-mdc-header-cell px-1 py-2">
{{ product2.name }}
{{ product2().name }}
</th>
</tr>
</thead>
<tbody>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right"></td>
<td class="mat-mdc-cell px-1 py-2">{{ product1.slogan }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2.slogan }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1().slogan }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2().slogan }}</td>
</tr>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Founded</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1.founded }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2.founded }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1().founded }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2().founded }}</td>
</tr>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Origin</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1.origin }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2.origin }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1().origin }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2().origin }}</td>
</tr>
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Region</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
region of product1.regions;
region of product1().regions;
track region;
let isLast = $last
) {
@ -96,7 +96,7 @@
</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
region of product2.regions;
region of product2().regions;
track region;
let isLast = $last
) {
@ -110,7 +110,7 @@
</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
language of product1.languages;
language of product1().languages;
track language;
let isLast = $last
) {
@ -119,7 +119,7 @@
</td>
<td class="mat-mdc-cell px-1 py-2">
@for (
language of product2.languages;
language of product2().languages;
track language;
let isLast = $last
) {
@ -132,35 +132,35 @@
Open Source Software
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product1.isOpenSource) {
@if (product1().isOpenSource) {
<span
i18n
i18n-title
title="{{ product1.name }} is Open Source Software"
title="{{ product1().name }} is Open Source Software"
>✅ Yes</span
>
} @else {
<span
i18n
i18n-title
title="{{ product1.name }} is not Open Source Software"
title="{{ product1().name }} is not Open Source Software"
>❌ No</span
>
}
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product2.isOpenSource) {
@if (product2().isOpenSource) {
<span
i18n
i18n-title
title="{{ product2.name }} is Open Source Software"
title="{{ product2().name }} is Open Source Software"
>✅ Yes</span
>
} @else {
<span
i18n
i18n-title
title="{{ product2.name }} is not Open Source Software"
title="{{ product2().name }} is not Open Source Software"
>❌ No</span
>
}
@ -171,35 +171,35 @@
Self-Hosting
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product1.hasSelfHostingAbility === true) {
@if (product1().hasSelfHostingAbility === true) {
<span
i18n
i18n-title
title="{{ product1.name }} can be self-hosted"
title="{{ product1().name }} can be self-hosted"
>✅ Yes</span
>
} @else if (product1.hasSelfHostingAbility === false) {
} @else if (product1().hasSelfHostingAbility === false) {
<span
i18n
i18n-title
title="{{ product1.name }} cannot be self-hosted"
title="{{ product1().name }} cannot be self-hosted"
>❌ No</span
>
}
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product2.hasSelfHostingAbility === true) {
@if (product2().hasSelfHostingAbility === true) {
<span
i18n
i18n-title
title="{{ product2.name }} can be self-hosted"
title="{{ product2().name }} can be self-hosted"
>✅ Yes</span
>
} @else if (product2.hasSelfHostingAbility === false) {
} @else if (product2().hasSelfHostingAbility === false) {
<span
i18n
i18n-title
title="{{ product2.name }} cannot be self-hosted"
title="{{ product2().name }} cannot be self-hosted"
>❌ No</span
>
}
@ -210,35 +210,35 @@
Use anonymously
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product1.useAnonymously === true) {
@if (product1().useAnonymously === true) {
<span
i18n
i18n-title
title="{{ product1.name }} can be used anonymously"
title="{{ product1().name }} can be used anonymously"
>✅ Yes</span
>
} @else if (product1.useAnonymously === false) {
} @else if (product1().useAnonymously === false) {
<span
i18n
i18n-title
title="{{ product1.name }} cannot be used anonymously"
title="{{ product1().name }} cannot be used anonymously"
>❌ No</span
>
}
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product2.useAnonymously === true) {
@if (product2().useAnonymously === true) {
<span
i18n
i18n-title
title="{{ product2.name }} can be used anonymously"
title="{{ product2().name }} can be used anonymously"
>✅ Yes</span
>
} @else if (product2.useAnonymously === false) {
} @else if (product2().useAnonymously === false) {
<span
i18n
i18n-title
title="{{ product2.name }} cannot be used anonymously"
title="{{ product2().name }} cannot be used anonymously"
>❌ No</span
>
}
@ -249,35 +249,35 @@
Free Plan
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product1.hasFreePlan === true) {
@if (product1().hasFreePlan === true) {
<span
i18n
i18n-title
title="{{ product1.name }} offers a free plan"
title="{{ product1().name }} offers a free plan"
>✅ Yes</span
>
} @else if (product1.hasFreePlan === false) {
} @else if (product1().hasFreePlan === false) {
<span
i18n
i18n-title
title="{{ product1.name }} does not offer a free plan"
title="{{ product1().name }} does not offer a free plan"
>❌ No</span
>
}
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product2.hasFreePlan === true) {
@if (product2().hasFreePlan === true) {
<span
i18n
i18n-title
title="{{ product2.name }} offers a free plan"
title="{{ product2().name }} offers a free plan"
>✅ Yes</span
>
} @else if (product2.hasFreePlan === false) {
} @else if (product2().hasFreePlan === false) {
<span
i18n
i18n-title
title="{{ product2.name }} does not offer a free plan"
title="{{ product2().name }} does not offer a free plan"
>❌ No</span
>
}
@ -286,22 +286,22 @@
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Pricing</td>
<td class="mat-mdc-cell px-1 py-2">
<span i18n>Starting from</span> ${{ price }} /
<span i18n>Starting from</span> ${{ price() }} /
<span i18n>year</span>
</td>
<td class="mat-mdc-cell px-1 py-2">
@if (product2.pricingPerYear) {
@if (product2().pricingPerYear) {
<span i18n>Starting from</span>
{{ product2.pricingPerYear }} /
{{ product2().pricingPerYear }} /
<span i18n>year</span>
}
</td>
</tr>
@if (product1.note || product2.note) {
@if (product1().note || product2().note) {
<tr class="mat-mdc-row">
<td class="mat-mdc-cell px-3 py-2 text-right" i18n>Notes</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1.note }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2.note }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product1().note }}</td>
<td class="mat-mdc-cell px-1 py-2">{{ product2().note }}</td>
</tr>
}
</tbody>
@ -310,9 +310,9 @@
<section class="mb-4">
<p i18n>
Please note that the information provided in the Ghostfolio vs
{{ product2.name }} comparison table is based on our independent
{{ product2().name }} comparison table is based on our independent
research and analysis. This website is not affiliated with
{{ product2.name }} or any other product mentioned in the
{{ product2().name }} or any other product mentioned in the
comparison. As the landscape of personal finance tools evolves, it
is essential to verify any specific details or changes directly from
the respective product page. Data needs a refresh? Help us maintain
@ -337,7 +337,7 @@
</section>
<section class="mb-4">
<ul class="list-inline">
@for (tag of tags; track tag) {
@for (tag of tags(); track tag) {
<li class="list-inline-item">
<span class="badge badge-light">{{ tag }}</span>
</li>
@ -355,7 +355,7 @@
aria-current="page"
class="active breadcrumb-item text-truncate"
>
Ghostfolio vs {{ product2.name }}
Ghostfolio vs {{ product2().name }}
</li>
</ol>
</nav>

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

@ -607,7 +607,7 @@
<target state="translated">Suprimir</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -659,7 +659,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -707,7 +707,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -757,10 +757,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -946,6 +942,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Nombre d’Activitats</target>
@ -974,6 +978,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Nombre de Països</target>
@ -1027,7 +1039,7 @@
<target state="translated">El preu de mercat actual és</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="1102717806459547726" datatype="html">
@ -1159,7 +1171,7 @@
<target state="translated">Configuració del Proveïdor de Dades</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -1167,7 +1179,7 @@
<target state="translated">Prova</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="8308045076391224954" datatype="html">
@ -1179,7 +1191,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1195,7 +1207,7 @@
<target state="new">Asset profile has been saved</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1351,7 +1363,7 @@
<target state="translated">Recollida de Dades</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -1463,7 +1475,7 @@
<target state="new">Current year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1603,11 +1615,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1643,7 +1655,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1983,7 +1995,7 @@
<target state="new">Current week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2407,7 +2419,7 @@
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2419,7 +2431,7 @@
<target state="translated">1 any</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2431,7 +2443,7 @@
<target state="translated">5 anys</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2451,7 +2463,7 @@
<target state="translated">Màx</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2679,7 +2691,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -2703,7 +2715,7 @@
<target state="translated">Localització</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -2886,6 +2898,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Ups! Sembla que esteu fent massa sol·licituds. Si us plau, aneu una mica més lent.</target>
@ -3315,11 +3335,11 @@
<target state="new">Could not parse scraper configuration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -3547,6 +3567,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Explotacions</target>
@ -4239,14 +4267,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Activitats d’importació</target>
@ -4496,7 +4516,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -4668,7 +4688,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -4695,14 +4715,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
@ -4879,6 +4891,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Transaccions il·limitades</target>
@ -4983,6 +5003,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<target state="translated">Suport per correu electrònic i xat</target>
@ -5004,11 +5032,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -5153,7 +5181,7 @@
<target state="translated">Global</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5169,24 +5197,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Estàs buscant una alternativa de codi obert a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> és una potent eina de gestió de portafolis que proporciona a les persones una plataforma completa per fer el seguiment, analitzar i optimitzar les seves inversions. Tant si ets un inversor amb experiència com si tot just comences, Ghostfolio ofereix una interfície intuïtiva i una <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>àmplia gamma de funcionalitats<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> per ajudar-te a prendre decisions informades i a prendre el control del teu futur financer.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Estàs buscant una alternativa de codi obert a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> és una potent eina de gestió de portafolis que proporciona a les persones una plataforma completa per fer el seguiment, analitzar i optimitzar les seves inversions. Tant si ets un inversor amb experiència com si tot just comences, Ghostfolio ofereix una interfície intuïtiva i una <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>àmplia gamma de funcionalitats<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> per ajudar-te a prendre decisions informades i a prendre el control del teu futur financer.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio és un programari de codi obert (OSS), que proporciona una alternativa rendible a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>, especialment adequada per a persones amb un pressupost ajustat, com ara aquelles que <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>segueixen el camí cap a la independència financera i jubilació anticipada (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Mitjançant els esforços col·lectius d’una comunitat de desenvolupadors i apassionats de les finances personals, Ghostfolio millora contínuament les seves capacitats, la seva seguretat i l’experiència d’usuari.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio és un programari de codi obert (OSS), que proporciona una alternativa rendible a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>, especialment adequada per a persones amb un pressupost ajustat, com ara aquelles que <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>segueixen el camí cap a la independència financera i jubilació anticipada (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Mitjançant els esforços col·lectius d’una comunitat de desenvolupadors i apassionats de les finances personals, Ghostfolio millora contínuament les seves capacitats, la seva seguretat i l’experiència d’usuari.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Explorem en profunditat la taula comparativa detallada de Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> que trobaràs a continuació per entendre a fons com es posiciona Ghostfolio en relació amb <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Analitzarem diversos aspectes com ara funcionalitats, privadesa de dades, preus i molt més, per tal que puguis prendre una decisió ben informada segons les teves necessitats personals.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Explorem en profunditat la taula comparativa detallada de Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> que trobaràs a continuació per entendre a fons com es posiciona Ghostfolio en relació amb <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Analitzarem diversos aspectes com ara funcionalitats, privadesa de dades, preus i molt més, per tal que puguis prendre una decisió ben informada segons les teves necessitats personals.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5205,8 +5233,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Taula comparativa Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/></target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Taula comparativa Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5369,8 +5397,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Tingues en compte que la informació proporcionada a la taula comparativa Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> es basa en la nostra investigació i anàlisi independents. Aquest lloc web no està afiliat a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> ni a cap altre producte esmentat en la comparació. A mesura que evoluciona el panorama de les eines de finances personals, és essencial verificar qualsevol detall o canvi específic directament a la pàgina del producte corresponent. Necessites actualitzar dades? Ajuda’ns a mantenir la informació precisa a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Tingues en compte que la informació proporcionada a la taula comparativa Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> es basa en la nostra investigació i anàlisi independents. Aquest lloc web no està afiliat a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> ni a cap altre producte esmentat en la comparació. A mesura que evoluciona el panorama de les eines de finances personals, és essencial verificar qualsevol detall o canvi específic directament a la pàgina del producte corresponent. Necessites actualitzar dades? Ajuda’ns a mantenir la informació precisa a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5577,7 +5605,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -5597,7 +5625,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -5617,7 +5645,7 @@
<target state="translated">any</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -5637,7 +5665,7 @@
<target state="translated">anys</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6509,7 +6537,7 @@
<target state="translated">Alternativa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6517,7 +6545,7 @@
<target state="translated">Aplicació</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6525,7 +6553,7 @@
<target state="translated">Pressupost</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6585,7 +6613,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6601,7 +6629,7 @@
<target state="translated">Oficina familiar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6609,7 +6637,7 @@
<target state="new">Investor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6621,7 +6649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6633,7 +6661,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6641,7 +6669,7 @@
<target state="new">Privacy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6649,7 +6677,7 @@
<target state="new">Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6657,7 +6685,7 @@
<target state="new">Tool</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6665,7 +6693,7 @@
<target state="new">User Experience</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6673,7 +6701,7 @@
<target state="new">Wealth</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6681,7 +6709,7 @@
<target state="new">Wealth Management</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6705,7 +6733,7 @@
<target state="new">Error</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6757,7 +6785,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6809,7 +6837,7 @@
<target state="new">Close</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6837,7 +6865,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6985,8 +7013,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6997,8 +7025,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7033,8 +7061,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7053,8 +7081,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7065,8 +7093,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7355,7 +7383,7 @@
<target state="new">Save</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="new">Lazy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="new">Instant</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="new">Default Market Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="new">Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="new">Selector</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="new">HTTP Request Headers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="new">end of day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="new">real-time</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="new"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) is already in use.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="new">An error occurred while updating to <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="new">Current month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -262,7 +262,7 @@
<target state="translated">Löschen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -314,7 +314,7 @@
<target state="translated">Bezahlt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1089827441260039381" datatype="html">
@ -364,10 +364,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -418,7 +414,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -761,6 +757,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="translated">Erstellung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="5207635742003539443" datatype="html">
<source>Sign in</source>
<target state="translated">Einloggen</target>
@ -1102,7 +1106,7 @@
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1114,7 +1118,7 @@
<target state="translated">1J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1126,7 +1130,7 @@
<target state="translated">5J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1146,7 +1150,7 @@
<target state="translated">Max</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1334,7 +1338,7 @@
<target state="translated">Gutschein</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="6780407325174304229" datatype="html">
@ -1342,7 +1346,7 @@
<target state="translated">Lokalität</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -1902,7 +1906,7 @@
<target state="translated">Testphase</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="2948175671993825247" datatype="html">
@ -1998,7 +2002,7 @@
<target state="translated">Aktuelle Woche</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2226,7 +2230,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2345,14 +2349,6 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="translated">Abonnements</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Aktivitäten importieren</target>
@ -2689,6 +2685,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="translated">Verlauf der Mitgliedschaft</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="5486880308148746399" datatype="html">
<source>Fear</source>
<target state="translated">Angst</target>
@ -2762,11 +2766,11 @@
<target state="translated">Das Formular konnte nicht validiert werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -3233,6 +3237,14 @@
<context context-type="linenumber">166</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="translated">Häufigkeit der Datensynchronisierung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Anzahl Aktivitäten</target>
@ -3429,14 +3441,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="translated">Läuft ab</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<target state="translated">Dividenden importieren</target>
@ -3681,6 +3685,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="translated">Stündlich</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Unlimitierte Transaktionen</target>
@ -3765,6 +3777,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="translated">Ablauf</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<target state="translated">Einmalige Zahlung, keine automatische Erneuerung.</target>
@ -3778,11 +3798,11 @@
<target state="translated">Das Anlageprofil konnte nicht gespeichert werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -4014,7 +4034,7 @@
<target state="translated">Aktuelles Jahr</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -4034,7 +4054,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -4050,7 +4070,7 @@
<target state="translated">Das Anlageprofil wurde gespeichert</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -4426,7 +4446,7 @@
<target state="translated">Scraper Konfiguration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7504169991280318133" datatype="html">
@ -4958,11 +4978,11 @@
<target state="translated">Die Scraper Konfiguration konnte nicht geparsed werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -5475,24 +5495,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Suchst du nach einer Open Source Alternative zu <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> ist ein leistungsstarkes Portfolio Management Tool, das Privatpersonen eine umfassende Plattform bietet, um ihre Investitionen zu verfolgen, zu analysieren und zu optimieren. Egal, ob du ein erfahrener Investor bist oder gerade erst anfängst, Ghostfolio bietet eine intuitive Benutzeroberfläche und eine <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>Vielzahl an Funktionen<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, die dir dabei helfen, fundierte Entscheidungen zu treffen und die Kontrolle über deine finanzielle Zukunft zu übernehmen.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Suchst du nach einer Open Source Alternative zu <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> ist ein leistungsstarkes Portfolio Management Tool, das Privatpersonen eine umfassende Plattform bietet, um ihre Investitionen zu verfolgen, zu analysieren und zu optimieren. Egal, ob du ein erfahrener Investor bist oder gerade erst anfängst, Ghostfolio bietet eine intuitive Benutzeroberfläche und eine <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>Vielzahl an Funktionen<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, die dir dabei helfen, fundierte Entscheidungen zu treffen und die Kontrolle über deine finanzielle Zukunft zu übernehmen.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio ist eine Open Source Software (OSS), die eine kostengünstige Alternative zu <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> darstellt und sich besonders für Personen mit knappem Budget eignet, wie z.B. für diejenigen, die <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>finanzielle Unabhängigkeit und einen frühen Ruhestand anstreben (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Ghostfolio nutzt die gemeinsamen Aktivitäten einer Community von Entwicklern und Finanzenthusiasten, um seine Funktionalität, Sicherheit und Benutzerfreundlichkeit kontinuierlich zu verbessern.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio ist eine Open Source Software (OSS), die eine kostengünstige Alternative zu <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> darstellt und sich besonders für Personen mit knappem Budget eignet, wie z.B. für diejenigen, die <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>finanzielle Unabhängigkeit und einen frühen Ruhestand anstreben (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Ghostfolio nutzt die gemeinsamen Aktivitäten einer Community von Entwicklern und Finanzenthusiasten, um seine Funktionalität, Sicherheit und Benutzerfreundlichkeit kontinuierlich zu verbessern.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Wir möchten uns in der untenstehenden Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> Vergleichstabelle ein detailliertes Bild davon machen, wie Ghostfolio im Vergleich zu <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> positioniert ist. Wir werden dabei verschiedene Aspekte wie Funktionen, Datenschutz, Preise und weiteres untersuchen, damit du eine gut informierte Entscheidung für deine persönlichen Anforderungen treffen kannst.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Wir möchten uns in der untenstehenden Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> Vergleichstabelle ein detailliertes Bild davon machen, wie Ghostfolio im Vergleich zu <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> positioniert ist. Wir werden dabei verschiedene Aspekte wie Funktionen, Datenschutz, Preise und weiteres untersuchen, damit du eine gut informierte Entscheidung für deine persönlichen Anforderungen treffen kannst.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5512,8 +5532,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Bitte beachte, dass die bereitgestellten Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> Informationen auf unserer unabhängigen Recherche und Analyse beruhen. Diese Webseite steht in keiner Verbindung zu <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> oder einem anderen im Vergleich erwähnten Produkt. Da sich die Landschaft der Personal Finance Tools ständig weiterentwickelt, ist es wichtig, alle spezifischen Details oder Änderungen direkt auf der jeweiligen Produktseite zu überprüfen. Brauchen die Daten eine Auffrischung? Unterstütze uns bei der Pflege der aktuellen Daten auf <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Bitte beachte, dass die bereitgestellten Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> Informationen auf unserer unabhängigen Recherche und Analyse beruhen. Diese Webseite steht in keiner Verbindung zu <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> oder einem anderen im Vergleich erwähnten Produkt. Da sich die Landschaft der Personal Finance Tools ständig weiterentwickelt, ist es wichtig, alle spezifischen Details oder Änderungen direkt auf der jeweiligen Produktseite zu überprüfen. Brauchen die Daten eine Auffrischung? Unterstütze uns bei der Pflege der aktuellen Daten auf <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5532,7 +5552,7 @@
<target state="translated">Weltweit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5836,8 +5856,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> Vergleichstabelle</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> Vergleichstabelle</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5972,7 +5992,7 @@
<target state="translated">Der aktuelle Marktpreis ist</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5980,7 +6000,7 @@
<target state="translated">Test</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6072,7 +6092,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6136,7 +6156,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6156,7 +6176,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6204,7 +6224,7 @@
<target state="translated">Jahr</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6224,7 +6244,7 @@
<target state="translated">Jahre</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6244,7 +6264,7 @@
<target state="translated">Finanzmarktdaten synchronisieren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6304,6 +6324,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="translated">Täglich</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Ups! Es sieht so aus, als würdest du zu viele Anfragen senden. Bitte geh es ein bisschen langsamer an.</target>
@ -6533,7 +6561,7 @@
<target state="translated">Alternative</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6541,7 +6569,7 @@
<target state="translated">App</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6549,7 +6577,7 @@
<target state="translated">Budgetierung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6609,7 +6637,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6625,7 +6653,7 @@
<target state="translated">Family Office</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6633,7 +6661,7 @@
<target state="translated">Investor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6645,7 +6673,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6657,7 +6685,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6665,7 +6693,7 @@
<target state="translated">Datenschutz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6673,7 +6701,7 @@
<target state="translated">Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6681,7 +6709,7 @@
<target state="translated">Tool</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6689,7 +6717,7 @@
<target state="translated">User Experience</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6697,7 +6725,7 @@
<target state="translated">Vermögen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6705,7 +6733,7 @@
<target state="translated">Vermögensverwaltung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6729,7 +6757,7 @@
<target state="translated">Fehler</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6781,7 +6809,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6833,7 +6861,7 @@
<target state="translated">Schliessen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6861,7 +6889,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -7009,8 +7037,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ist Open Source Software</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ist Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -7021,8 +7049,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ist keine Open Source Software</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ist keine Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7057,8 +7085,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kann selbst gehostet werden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kann selbst gehostet werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kann nicht selbst gehostet werden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kann nicht selbst gehostet werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kann anonym genutzt werden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kann anonym genutzt werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kann nicht anonym genutzt werden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kann nicht anonym genutzt werden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7113,8 +7141,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> hat ein kostenloses Angebot</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> hat ein kostenloses Angebot</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7125,8 +7153,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> hat kein kostenloses Angebot</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> hat kein kostenloses Angebot</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7379,7 +7407,7 @@
<target state="translated">Speichern</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7487,7 +7515,7 @@
<target state="translated">Verzögert</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7495,7 +7523,7 @@
<target state="translated">Sofort</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7503,7 +7531,7 @@
<target state="translated">Standardmarktpreis</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7511,7 +7539,7 @@
<target state="translated">Modus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7519,7 +7547,7 @@
<target state="translated">Selektor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7527,7 +7555,7 @@
<target state="translated">HTTP Request-Headers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7535,7 +7563,7 @@
<target state="translated">Tagesende</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7543,7 +7571,7 @@
<target state="translated">in Echtzeit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7744,7 +7772,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) wird bereits verwendet.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7752,7 +7780,7 @@
<target state="translated">Bei der Änderung zu <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) ist ein Fehler aufgetreten.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="translated">Aktueller Monat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -263,7 +263,7 @@
<target state="translated">Eliminar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -315,7 +315,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1089827441260039381" datatype="html">
@ -365,10 +365,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -419,7 +415,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -746,6 +742,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="5207635742003539443" datatype="html">
<source>Sign in</source>
<target state="translated">Iniciar sesión</target>
@ -1087,7 +1091,7 @@
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1099,7 +1103,7 @@
<target state="translated">1 año</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1111,7 +1115,7 @@
<target state="translated">5 años</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1131,7 +1135,7 @@
<target state="translated">Máximo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1319,7 +1323,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="6780407325174304229" datatype="html">
@ -1327,7 +1331,7 @@
<target state="translated">Configuración regional</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -1887,7 +1891,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="2948175671993825247" datatype="html">
@ -1983,7 +1987,7 @@
<target state="translated">Semana actual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2211,7 +2215,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2330,14 +2334,6 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Importar operaciones</target>
@ -2666,6 +2662,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Número de países</target>
@ -2759,11 +2763,11 @@
<target state="translated">No se pudo validar el formulario</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -3218,6 +3222,14 @@
<context context-type="linenumber">166</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Número de operaciones</target>
@ -3414,14 +3426,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<target state="translated">Importar dividendos</target>
@ -3666,6 +3670,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Operaciones ilimitadas</target>
@ -3750,6 +3762,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<target state="translated">Pago único, sin renovación automática.</target>
@ -3763,11 +3783,11 @@
<target state="translated">No se pudo guardar el perfil del activo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -3991,7 +4011,7 @@
<target state="translated">Año actual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -4011,7 +4031,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -4027,7 +4047,7 @@
<target state="translated">Perfil del activo guardado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -4403,7 +4423,7 @@
<target state="translated">Configuración del scraper</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7504169991280318133" datatype="html">
@ -4935,11 +4955,11 @@
<target state="translated">No se pudo analizar la configuración del scraper</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -5452,24 +5472,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">¿Estás buscando una alternativa de código abierto a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> es una potente herramienta de gestión de carteras que proporciona a los usuarios una plataforma completa para seguir, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>amplia gama de funcionalidades<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">¿Estás buscando una alternativa de código abierto a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> es una potente herramienta de gestión de carteras que proporciona a los usuarios una plataforma completa para seguir, analizar y optimizar sus inversiones. Ya seas un inversor con experiencia o estés comenzando, Ghostfolio ofrece una interfaz intuitiva y una <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>amplia gama de funcionalidades<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> para ayudarte a tomar decisiones informadas y tener el control de tu futuro financiero.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio es un software de código abierto (OSS), que ofrece una alternativa rentable a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> lo que lo hace especialmente adecuado para personas con un presupuesto ajustado, como aquellas que <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>buscan la Independencia Financiera y Jubilación Anticipada (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Al aprovechar los esfuerzos colectivos de una comunidad de desarrolladores y entusiastas de las finanzas personales, Ghostfolio mejora continuamente sus capacidades, seguridad y experiencia de usuario.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio es un software de código abierto (OSS), que ofrece una alternativa rentable a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> lo que lo hace especialmente adecuado para personas con un presupuesto ajustado, como aquellas que <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>buscan la Independencia Financiera y Jubilación Anticipada (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Al aprovechar los esfuerzos colectivos de una comunidad de desarrolladores y entusiastas de las finanzas personales, Ghostfolio mejora continuamente sus capacidades, seguridad y experiencia de usuario.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Analicemos en detalle la tabla comparativa entre Ghostfolio y <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> que encontrarás a continuación, para obtener una comprensión completa de cómo se posiciona Ghostfolio en relación con <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Exploraremos diversos aspectos como funcionalidades, privacidad de los datos, precios y más, lo que te permitirá tomar una decisión bien fundamentada según tus necesidades personales.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Analicemos en detalle la tabla comparativa entre Ghostfolio y <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> que encontrarás a continuación, para obtener una comprensión completa de cómo se posiciona Ghostfolio en relación con <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Exploraremos diversos aspectos como funcionalidades, privacidad de los datos, precios y más, lo que te permitirá tomar una decisión bien fundamentada según tus necesidades personales.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5489,8 +5509,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Ten en cuenta que la información proporcionada en la tabla comparativa entre Ghostfolio y <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> se basa en nuestra investigación y análisis independientes. Este sitio web no está afiliado con <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> ni con ningún otro producto mencionado en la comparación. Dado que el panorama de las herramientas de finanzas personales evoluciona constantemente, es fundamental verificar cualquier detalle específico o cambio directamente en la página oficial del producto correspondiente. ¿Los datos necesitan una actualización? Ayúdanos a mantener la información precisa en <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5509,7 +5529,7 @@
<target state="translated">Global</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5813,8 +5833,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Tabla comparativa de Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/></target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Tabla comparativa de Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5949,7 +5969,7 @@
<target state="translated">El precio actual de mercado es</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5957,7 +5977,7 @@
<target state="translated">Prueba</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6049,7 +6069,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6113,7 +6133,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6133,7 +6153,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6181,7 +6201,7 @@
<target state="translated">año</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6201,7 +6221,7 @@
<target state="translated">años</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6221,7 +6241,7 @@
<target state="translated">Recopilación de datos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6281,6 +6301,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">¡Vaya! Parece que estás haciendo demasiadas solicitudes. Por favor, reduce la velocidad un poco.</target>
@ -6510,7 +6538,7 @@
<target state="translated">Alternativa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6518,7 +6546,7 @@
<target state="translated">Aplicación</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6526,7 +6554,7 @@
<target state="translated">Presupuestos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6586,7 +6614,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6602,7 +6630,7 @@
<target state="translated">Family Office</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6610,7 +6638,7 @@
<target state="translated">Inversor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6622,7 +6650,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6634,7 +6662,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6642,7 +6670,7 @@
<target state="translated">Privacidad</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6650,7 +6678,7 @@
<target state="translated">Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6658,7 +6686,7 @@
<target state="translated">Herramienta</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6666,7 +6694,7 @@
<target state="translated">Experiencia del usuario</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6674,7 +6702,7 @@
<target state="translated">Patrimonio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6682,7 +6710,7 @@
<target state="translated">Gestión de patrimonios</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6706,7 +6734,7 @@
<target state="translated">Error</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6758,7 +6786,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6810,7 +6838,7 @@
<target state="translated">Cerrar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6838,7 +6866,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6986,8 +7014,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> es software de código abierto</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> es software de código abierto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6998,8 +7026,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> no es software de código abierto</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> no es software de código abierto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7034,8 +7062,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> se puede autoalojar</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> se puede autoalojar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7054,8 +7082,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> no se puede autoalojar</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> no se puede autoalojar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7066,8 +7094,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> se puede usar de forma anónima</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> se puede usar de forma anónima</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7078,8 +7106,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> no se puede usar de forma anónima</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> no se puede usar de forma anónima</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7090,8 +7118,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ofrece un plan gratuito</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ofrece un plan gratuito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7102,8 +7130,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> no ofrece un plan gratuito</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> no ofrece un plan gratuito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7356,7 +7384,7 @@
<target state="translated">Guardar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7464,7 +7492,7 @@
<target state="translated">Bajo demanda</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7472,7 +7500,7 @@
<target state="translated">Instantáneo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7480,7 +7508,7 @@
<target state="translated">Precio de mercado por defecto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7488,7 +7516,7 @@
<target state="translated">Modo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7496,7 +7524,7 @@
<target state="translated">Selector</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7504,7 +7532,7 @@
<target state="translated">Encabezados de solicitud HTTP</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7512,7 +7540,7 @@
<target state="translated">final del día</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7520,7 +7548,7 @@
<target state="translated">en tiempo real</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7721,7 +7749,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) ya está en uso.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7729,7 +7757,7 @@
<target state="translated">Ocurrió un error al actualizar a <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8080,7 +8108,7 @@
<target state="translated">Mes actual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -318,7 +318,7 @@
<target state="translated">Supprimer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -370,7 +370,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -412,10 +412,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -474,7 +470,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -581,6 +577,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Nombre d’Activités</target>
@ -609,6 +613,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Nombre de Pays</target>
@ -910,11 +922,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -942,7 +954,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1342,7 +1354,7 @@
<target state="translated">CDA</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1354,7 +1366,7 @@
<target state="translated">1A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1366,7 +1378,7 @@
<target state="translated">5A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1386,7 +1398,7 @@
<target state="translated">Max</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1622,7 +1634,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -1638,7 +1650,7 @@
<target state="translated">Paramètres régionaux</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -2170,7 +2182,7 @@
<target state="new">Current week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2410,7 +2422,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -2697,6 +2709,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="8298333184054476827" datatype="html">
<source>Registration</source>
<target state="translated">Enregistrement</target>
@ -2841,14 +2861,6 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Importer Activités</target>
@ -3413,14 +3425,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<target state="translated">Importer Dividendes</target>
@ -3665,6 +3669,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Transactions Illimitées</target>
@ -3749,6 +3761,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<target state="translated">Paiement unique, sans auto-renouvellement.</target>
@ -3762,11 +3782,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -3990,7 +4010,7 @@
<target state="new">Current year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -4010,7 +4030,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -4026,7 +4046,7 @@
<target state="new">Asset profile has been saved</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -4402,7 +4422,7 @@
<target state="translated">Configuration du Scraper</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7504169991280318133" datatype="html">
@ -4934,11 +4954,11 @@
<target state="new">Could not parse scraper configuration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -5451,24 +5471,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Cherchez-vous des alternatives open source à <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> est un outil de gestion de portefeuille puissant offrant aux particuliers une plateforme complète pour suivre, analyser et optimiser ses investissements. Que vous soyez un investisseur expérimenté ou que vous débutiez, Ghostfolio offre une interface utilisateur intuitive et une <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>large gamme de fonctionnalités<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> pour vous aider à prendre des décisions éclairées et à prendre le contrôle de votre avenir financier.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Cherchez-vous des alternatives open source à <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> est un outil de gestion de portefeuille puissant offrant aux particuliers une plateforme complète pour suivre, analyser et optimiser ses investissements. Que vous soyez un investisseur expérimenté ou que vous débutiez, Ghostfolio offre une interface utilisateur intuitive et une <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>large gamme de fonctionnalités<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> pour vous aider à prendre des décisions éclairées et à prendre le contrôle de votre avenir financier.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio est un logiciel open source (OSS), offrant une alternative économique, <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> le rendant particulièrement adaptée aux personnes disposant d’un budget serré, telles que celles qui <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>cherchent à atteindre le mouvement Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. En s’appuyant sur les efforts collectifs d’une communauté de développeurs et de passionnés de finances personnelles, Ghostfolio améliore continuellement ses fonctionnalités, sa sécurité et son expérience utilisateur.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio est un logiciel open source (OSS), offrant une alternative économique, <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> le rendant particulièrement adaptée aux personnes disposant d’un budget serré, telles que celles qui <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>cherchent à atteindre le mouvement Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. En s’appuyant sur les efforts collectifs d’une communauté de développeurs et de passionnés de finances personnelles, Ghostfolio améliore continuellement ses fonctionnalités, sa sécurité et son expérience utilisateur.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Regardons plus en détails ce que proposent Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> via la table de comparaison ci-dessous pour comprendre comment Ghostfolio se positionne par rapport à <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Nous examinerons divers aspects tels que les fonctionnalités, la confidentialité des données, le prix, etc., afin de vous permettre de faire un choix éclairé en fonction de vos besoins personnels.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Regardons plus en détails ce que proposent Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> via la table de comparaison ci-dessous pour comprendre comment Ghostfolio se positionne par rapport à <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Nous examinerons divers aspects tels que les fonctionnalités, la confidentialité des données, le prix, etc., afin de vous permettre de faire un choix éclairé en fonction de vos besoins personnels.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5488,8 +5508,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Veuillez noter que les informations fournies dans le Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> via la table de comparaison se basent de nos recherches et analyses indépendantes. Ce site n’est pas affilié à <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> ou tout autre produit mentionné dans la comparaison. Le paysage des outils de finances personnelles évoluant, il est essentiel de vérifier tout détail ou changement spécifique directement sur la page du produit concerné. Certaines données doivent être mises à jour ? Aidez-nous à maintenir les données exactes sur <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Veuillez noter que les informations fournies dans le Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> via la table de comparaison se basent de nos recherches et analyses indépendantes. Ce site n’est pas affilié à <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> ou tout autre produit mentionné dans la comparaison. Le paysage des outils de finances personnelles évoluant, il est essentiel de vérifier tout détail ou changement spécifique directement sur la page du produit concerné. Certaines données doivent être mises à jour ? Aidez-nous à maintenir les données exactes sur <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5508,7 +5528,7 @@
<target state="translated">Mondial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5812,8 +5832,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tableau comparatif</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> tableau comparatif</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5948,7 +5968,7 @@
<target state="translated">Le prix actuel du marché est</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5956,7 +5976,7 @@
<target state="translated">Test</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6048,7 +6068,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6112,7 +6132,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6132,7 +6152,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6180,7 +6200,7 @@
<target state="translated">année</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6200,7 +6220,7 @@
<target state="translated">années</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6220,7 +6240,7 @@
<target state="translated">Collecter les données</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6280,6 +6300,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Oops! Il semble que vous fassiez trop de requêtes. Veuillez ralentir un peu.</target>
@ -6509,7 +6537,7 @@
<target state="translated">Alternative</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6517,7 +6545,7 @@
<target state="translated">App</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6525,7 +6553,7 @@
<target state="translated">Budget</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6585,7 +6613,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6601,7 +6629,7 @@
<target state="translated">Family Office</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6609,7 +6637,7 @@
<target state="translated">Investisseur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6621,7 +6649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6633,7 +6661,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6641,7 +6669,7 @@
<target state="translated">Confidentialité</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6649,7 +6677,7 @@
<target state="translated">Logiciels</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6657,7 +6685,7 @@
<target state="translated">Outils</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6665,7 +6693,7 @@
<target state="translated">Expérience Utilisateur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6673,7 +6701,7 @@
<target state="translated">Patrimoine</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6681,7 +6709,7 @@
<target state="translated">Gestion de Patrimoine</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6705,7 +6733,7 @@
<target state="translated">Erreur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6757,7 +6785,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6809,7 +6837,7 @@
<target state="translated">Fermer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6837,7 +6865,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6985,8 +7013,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> est un logiciel open source</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> est un logiciel open source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6997,8 +7025,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> n’est pas un logiciel open source</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> n’est pas un logiciel open source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7033,8 +7061,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> peut être auto-hébergé</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> peut être auto-hébergé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7053,8 +7081,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ne peut pas être auto-hébergé</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ne peut pas être auto-hébergé</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7065,8 +7093,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> peut être utilisé de manière anonyme</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> peut être utilisé de manière anonyme</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ne peut pas être utilisé de manière anonyme</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ne peut pas être utilisé de manière anonyme</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> propose un plan gratuit</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> propose un plan gratuit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ne propose pas de plan gratuit</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ne propose pas de plan gratuit</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7355,7 +7383,7 @@
<target state="translated">Sauvegarder</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="translated">Paresseux</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="translated">Instantané</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="translated">Prix du marché par défaut</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="translated">Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="translated">Selecteur</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="translated">En-têtes de requête HTTP</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="translated">fin de journée</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="translated">temps réel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) est déjà utilisé.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="translated">Une erreur s’est produite lors de la mise à jour vers <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="new">Current month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -263,7 +263,7 @@
<target state="translated">Elimina</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -315,7 +315,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1089827441260039381" datatype="html">
@ -365,10 +365,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -419,7 +415,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -746,6 +742,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="5207635742003539443" datatype="html">
<source>Sign in</source>
<target state="translated">Accedi</target>
@ -1087,7 +1091,7 @@
<target state="translated">anno corrente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1099,7 +1103,7 @@
<target state="translated">1 anno</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1111,7 +1115,7 @@
<target state="translated">5 anni</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1131,7 +1135,7 @@
<target state="translated">Massimo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1319,7 +1323,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="6780407325174304229" datatype="html">
@ -1327,7 +1331,7 @@
<target state="translated">Locale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -1887,7 +1891,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="2948175671993825247" datatype="html">
@ -1983,7 +1987,7 @@
<target state="new">Current week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2211,7 +2215,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2330,14 +2334,6 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Importa le attività</target>
@ -2666,6 +2662,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Numero di paesi</target>
@ -2759,11 +2763,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -3218,6 +3222,14 @@
<context context-type="linenumber">166</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Conteggio attività</target>
@ -3414,14 +3426,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<target state="translated">Importa i dividendi</target>
@ -3666,6 +3670,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Transazioni illimitate</target>
@ -3750,6 +3762,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<target state="translated">Pagamento una tantum, senza rinnovo automatico.</target>
@ -3763,11 +3783,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -3991,7 +4011,7 @@
<target state="new">Current year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -4011,7 +4031,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -4027,7 +4047,7 @@
<target state="new">Asset profile has been saved</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -4403,7 +4423,7 @@
<target state="translated">Configurazione dello scraper</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7504169991280318133" datatype="html">
@ -4935,11 +4955,11 @@
<target state="new">Could not parse scraper configuration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -5452,24 +5472,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Stai cercando un’alternativa open source a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> è un potente strumento di gestione del portafoglio che fornisce alle persone una piattaforma completa per monitorare, analizzare e ottimizzare i propri investimenti. Che tu sia un investitore esperto o alle prime armi, Ghostfolio offre un’interfaccia utente intuitiva e <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>un’ampia gamma di funzionalità<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> per aiutarti a prendere decisioni informate e il controllo del tuo futuro finanziario.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Stai cercando un’alternativa open source a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> è un potente strumento di gestione del portafoglio che fornisce alle persone una piattaforma completa per monitorare, analizzare e ottimizzare i propri investimenti. Che tu sia un investitore esperto o alle prime armi, Ghostfolio offre un’interfaccia utente intuitiva e <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>un’ampia gamma di funzionalità<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> per aiutarti a prendere decisioni informate e il controllo del tuo futuro finanziario.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio è un software open source (OSS) che offre un’alternativa economicamente vantaggiosa a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> particolarmente adatta a persone con un budget limitato, come quelle che <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>perseguono l’indipendenza finanziaria e il pensionamento anticipato (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Grazie agli sforzi collettivi di una comunità di sviluppatori e di appassionati di finanza personale, Ghostfolio migliora continuamente le sue capacità, la sua sicurezza e la sua esperienza utente.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio è un software open source (OSS) che offre un’alternativa economicamente vantaggiosa a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> particolarmente adatta a persone con un budget limitato, come quelle che <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>perseguono l’indipendenza finanziaria e il pensionamento anticipato (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Grazie agli sforzi collettivi di una comunità di sviluppatori e di appassionati di finanza personale, Ghostfolio migliora continuamente le sue capacità, la sua sicurezza e la sua esperienza utente.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Analizziamo nel dettaglio la tabella di confronto qui sotto per comprendere a fondo come Ghostfolio si posiziona rispetto a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Esploreremo vari aspetti come le caratteristiche, la privacy dei dati, il prezzo e altro ancora, permettendoti di fare una scelta ben informata per le tue esigenze personali.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Analizziamo nel dettaglio la tabella di confronto qui sotto per comprendere a fondo come Ghostfolio si posiziona rispetto a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Esploreremo vari aspetti come le caratteristiche, la privacy dei dati, il prezzo e altro ancora, permettendoti di fare una scelta ben informata per le tue esigenze personali.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5489,8 +5509,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Nota bene: le informazioni fornite si basano sulle nostre ricerche e analisi indipendenti. Questo sito web non è affiliato con <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> o a qualsiasi altro prodotto citato nel confronto. Poiché il panorama degli strumenti di finanza personale si evolve, è essenziale verificare qualsiasi dettaglio o modifica specifica direttamente nella pagina del prodotto in questione. I dati hanno bisogno di essere aggiornati? Aiutaci a mantenere i dati accurati su <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Nota bene: le informazioni fornite si basano sulle nostre ricerche e analisi indipendenti. Questo sito web non è affiliato con <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> o a qualsiasi altro prodotto citato nel confronto. Poiché il panorama degli strumenti di finanza personale si evolve, è essenziale verificare qualsiasi dettaglio o modifica specifica direttamente nella pagina del prodotto in questione. I dati hanno bisogno di essere aggiornati? Aiutaci a mantenere i dati accurati su <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5509,7 +5529,7 @@
<target state="translated">Globale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5813,8 +5833,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tabella di comparazione</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> tabella di comparazione</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5949,7 +5969,7 @@
<target state="translated">L’attuale prezzo di mercato è</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5957,7 +5977,7 @@
<target state="translated">Prova</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6049,7 +6069,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6113,7 +6133,7 @@
<target state="translated">Settimana corrente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6133,7 +6153,7 @@
<target state="translated">Mese corrente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6181,7 +6201,7 @@
<target state="translated">anno</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6201,7 +6221,7 @@
<target state="translated">anni</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6221,7 +6241,7 @@
<target state="translated">Raccolta Dati</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6281,6 +6301,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Ops! Sembra tu stia facendo troppe richieste. Rallenta un po’ per favore.</target>
@ -6510,7 +6538,7 @@
<target state="translated">Alternativa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6518,7 +6546,7 @@
<target state="translated">App</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6526,7 +6554,7 @@
<target state="translated">Budgeting</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6586,7 +6614,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6602,7 +6630,7 @@
<target state="translated">Ufficio familiare</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6610,7 +6638,7 @@
<target state="translated">Investitore</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6622,7 +6650,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6634,7 +6662,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6642,7 +6670,7 @@
<target state="translated">Privacy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6650,7 +6678,7 @@
<target state="translated">Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6658,7 +6686,7 @@
<target state="translated">Strumento</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6666,7 +6694,7 @@
<target state="translated">Esperienza Utente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6674,7 +6702,7 @@
<target state="translated">Ricchezza</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6682,7 +6710,7 @@
<target state="translated">Gestione Patrimoniale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6706,7 +6734,7 @@
<target state="translated">Errore</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6758,7 +6786,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6810,7 +6838,7 @@
<target state="translated">Chiudi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6838,7 +6866,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6986,8 +7014,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> è un programma Open Source</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> è un programma Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6998,8 +7026,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> non è un programma Open Source</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> non è un programma Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7034,8 +7062,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> può essere ospitato in proprio</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> può essere ospitato in proprio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7054,8 +7082,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> non può essere ospitato in proprio</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> non può essere ospitato in proprio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7066,8 +7094,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> può essere usato anonimamente</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> può essere usato anonimamente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7078,8 +7106,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> non può essere usato anonimamente</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> non può essere usato anonimamente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7090,8 +7118,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ha un piano gratuito</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ha un piano gratuito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7102,8 +7130,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> non ha un piano gratuito</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> non ha un piano gratuito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7356,7 +7384,7 @@
<target state="translated">Salva</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7464,7 +7492,7 @@
<target state="translated">Pigro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7472,7 +7500,7 @@
<target state="translated">Istantaneo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7480,7 +7508,7 @@
<target state="translated">Prezzo di mercato predefinito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7488,7 +7516,7 @@
<target state="translated">Modalità</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7496,7 +7524,7 @@
<target state="translated">Selettore</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7504,7 +7532,7 @@
<target state="translated">Intestazioni della richiesta HTTP</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7512,7 +7540,7 @@
<target state="translated">fine giornata</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7520,7 +7548,7 @@
<target state="translated">in tempo reale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7721,7 +7749,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) e gia in uso.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7729,7 +7757,7 @@
<target state="translated">Si è verificato un errore durante l’aggiornamento di <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8080,7 +8108,7 @@
<target state="new">Current month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

242
apps/client/src/locales/messages.ko.xlf

@ -548,7 +548,7 @@
<target state="translated">삭제</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -600,7 +600,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="3175281009707730014" datatype="html">
@ -620,7 +620,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -662,10 +662,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -847,6 +843,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">거래 건수</target>
@ -875,6 +879,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">국가 수</target>
@ -1064,7 +1076,7 @@
<target state="translated">스크래퍼 설정</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1284,7 +1296,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1300,7 +1312,7 @@
<target state="translated">자산 정보가 저장되었습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -1340,7 +1352,7 @@
<target state="translated">올해</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1480,11 +1492,11 @@
<target state="translated">양식 유효성 검사에 실패했습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1520,7 +1532,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1736,7 +1748,7 @@
<target state="translated">이번주</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2220,7 +2232,7 @@
<target state="translated">연초 대비</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2232,7 +2244,7 @@
<target state="translated">1년</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2244,7 +2256,7 @@
<target state="translated">5년</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2264,7 +2276,7 @@
<target state="translated">맥스</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2428,7 +2440,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -2444,7 +2456,7 @@
<target state="translated">장소</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -3028,11 +3040,11 @@
<target state="translated">스크래퍼 설정을 파싱할 수 없습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -3235,6 +3247,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">보유 종목</target>
@ -3919,14 +3939,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">거래 내역 가져오기</target>
@ -4176,7 +4188,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -4343,14 +4355,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
<source>Top</source>
<target state="translated">상위</target>
@ -4487,6 +4491,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">무제한 거래</target>
@ -4591,6 +4603,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<target state="translated">이메일 및 채팅 지원</target>
@ -4628,11 +4648,11 @@
<target state="translated">자산 정보를 저장할 수 없습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -4773,24 +4793,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>에 대한 오픈소스 대안을 찾고 계십니까? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>는 개인에게 투자를 추적, 분석, 최적화할 수 있는 포괄적인 플랫폼을 제공하는 강력한 포트폴리오 관리 도구입니다. 숙련된 투자자이든 이제 막 시작한 투자자이든 Ghostfolio는 직관적인 사용자 인터페이스와 <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>다양한 기능<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>을 제공하여 정보에 입각한 결정을 내리고 재정적 미래를 관리하는 데 도움을 줍니다.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>에 대한 오픈소스 대안을 찾고 계십니까? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>는 개인에게 투자를 추적, 분석, 최적화할 수 있는 포괄적인 플랫폼을 제공하는 강력한 포트폴리오 관리 도구입니다. 숙련된 투자자이든 이제 막 시작한 투자자이든 Ghostfolio는 직관적인 사용자 인터페이스와 <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>다양한 기능<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>을 제공하여 정보에 입각한 결정을 내리고 재정적 미래를 관리하는 데 도움을 줍니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio는 오픈 소스 소프트웨어로, <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>에 대한 비용 효율적인 대안을 제공하므로 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>재정적 독립, 조기 퇴직(FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>을 추구하는 사람과 같이 예산이 부족한 개인에게 특히 적합합니다. Ghostfolio는 개발자 커뮤니티와 개인 금융 애호가들의 공동 노력을 활용하여 기능, 보안 및 사용자 경험을 지속적으로 향상시킵니다.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio는 오픈 소스 소프트웨어로, <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>에 대한 비용 효율적인 대안을 제공하므로 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>재정적 독립, 조기 퇴직(FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>을 추구하는 사람과 같이 예산이 부족한 개인에게 특히 적합합니다. Ghostfolio는 개발자 커뮤니티와 개인 금융 애호가들의 공동 노력을 활용하여 기능, 보안 및 사용자 경험을 지속적으로 향상시킵니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Ghostfolio가 <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>과 관련하여 어떻게 위치하는지 철저하게 이해하기 위해 아래의 자세한 Ghostfolio 대 <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> 비교표를 자세히 살펴보겠습니다. 우리는 기능, 데이터 개인 정보 보호, 가격 등과 같은 다양한 측면을 탐색하여 귀하의 개인 요구 사항에 맞는 정보를 바탕으로 선택할 수 있도록 할 것입니다.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Ghostfolio가 <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>과 관련하여 어떻게 위치하는지 철저하게 이해하기 위해 아래의 자세한 Ghostfolio 대 <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> 비교표를 자세히 살펴보겠습니다. 우리는 기능, 데이터 개인 정보 보호, 가격 등과 같은 다양한 측면을 탐색하여 귀하의 개인 요구 사항에 맞는 정보를 바탕으로 선택할 수 있도록 할 것입니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -4809,8 +4829,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio와 <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> 비교표</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio와 <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> 비교표</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -4973,8 +4993,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Ghostfolio와 <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> 비교표에 제공된 정보는 당사의 독립적인 연구 및 분석을 기반으로 한 것입니다. 이 웹사이트는 <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> 또는 비교에 언급된 다른 제품과 관련이 없습니다. 개인 금융 도구의 환경이 발전함에 따라 각 제품 페이지에서 직접 특정 세부 정보나 변경 사항을 확인하는 것이 중요합니다. 데이터를 새로 고쳐야 합니까? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>깃허브<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>에서 정확한 데이터를 유지할 수 있도록 도와주세요.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Ghostfolio와 <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> 비교표에 제공된 정보는 당사의 독립적인 연구 및 분석을 기반으로 한 것입니다. 이 웹사이트는 <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> 또는 비교에 언급된 다른 제품과 관련이 없습니다. 개인 금융 도구의 환경이 발전함에 따라 각 제품 페이지에서 직접 특정 세부 정보나 변경 사항을 확인하는 것이 중요합니다. 데이터를 새로 고쳐야 합니까? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>깃허브<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>에서 정확한 데이터를 유지할 수 있도록 도와주세요.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5001,7 +5021,7 @@
<target state="translated">글로벌</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5981,7 +6001,7 @@
<target state="translated">현재 시장가격은</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5989,7 +6009,7 @@
<target state="translated">시험</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="2570446216260149991" datatype="html">
@ -6097,7 +6117,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6153,7 +6173,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6165,7 +6185,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6205,7 +6225,7 @@
<target state="translated">년도</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6225,7 +6245,7 @@
<target state="translated">연령</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6270,7 +6290,7 @@
<target state="translated">데이터 수집</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6305,6 +6325,14 @@
<context context-type="linenumber">240</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">이런! 요청을 너무 많이 하시는 것 같습니다. 조금 천천히 해주세요.</target>
@ -6534,7 +6562,7 @@
<target state="translated">재산</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6594,7 +6622,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6610,7 +6638,7 @@
<target state="translated">사용자 경험</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6618,7 +6646,7 @@
<target state="translated">앱</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6626,7 +6654,7 @@
<target state="translated">도구</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6634,7 +6662,7 @@
<target state="translated">투자자</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6642,7 +6670,7 @@
<target state="translated">자산관리</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6658,7 +6686,7 @@
<target state="translated">대안</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="4622218074144052433" datatype="html">
@ -6666,7 +6694,7 @@
<target state="translated">패밀리오피스</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6678,7 +6706,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6686,7 +6714,7 @@
<target state="translated">소프트웨어</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6694,7 +6722,7 @@
<target state="translated">예산 편성</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6706,7 +6734,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6714,7 +6742,7 @@
<target state="translated">은둔</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="1518717392874668219" datatype="html">
@ -6730,7 +6758,7 @@
<target state="translated">오류</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6742,7 +6770,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6826,7 +6854,7 @@
<target state="translated">닫다</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6854,7 +6882,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6994,8 +7022,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 무료 요금제를 제공합니다</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 무료 요금제를 제공합니다</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7006,8 +7034,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 무료 요금제를 제공하지 않습니다.</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 무료 요금제를 제공하지 않습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7050,8 +7078,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 자체 호스팅 가능</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 자체 호스팅 가능</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7070,8 +7098,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 자체 호스팅할 수 없습니다.</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 자체 호스팅할 수 없습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7082,8 +7110,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 익명으로 사용할 수 있습니다.</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 익명으로 사용할 수 있습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7094,8 +7122,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 익명으로 사용할 수 없습니다.</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 익명으로 사용할 수 없습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7106,8 +7134,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 오픈 소스 소프트웨어가 아닙니다.</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 오픈 소스 소프트웨어가 아닙니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7118,8 +7146,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>은(는) 오픈 소스 소프트웨어입니다.</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>은(는) 오픈 소스 소프트웨어입니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -7380,7 +7408,7 @@
<target state="translated">구하다</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7488,7 +7516,7 @@
<target state="translated">방법</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7496,7 +7524,7 @@
<target state="translated">기본 시장 가격</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7504,7 +7532,7 @@
<target state="translated">선택자</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7512,7 +7540,7 @@
<target state="translated">즉각적인</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8540986733881734625" datatype="html">
@ -7520,7 +7548,7 @@
<target state="translated">게으른</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7528,7 +7556,7 @@
<target state="translated">HTTP 요청 헤더</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7536,7 +7564,7 @@
<target state="translated">실시간</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7544,7 +7572,7 @@
<target state="translated">하루의 끝</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7745,7 +7773,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>)은(는) 이미 사용 중입니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7753,7 +7781,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/>(<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>)로 업데이트하는 동안 오류가 발생했습니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8080,7 +8108,7 @@
<target state="translated">이번 달</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -262,7 +262,7 @@
<target state="translated">Verwijderen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -314,7 +314,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1089827441260039381" datatype="html">
@ -364,10 +364,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -418,7 +414,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -745,6 +741,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="5207635742003539443" datatype="html">
<source>Sign in</source>
<target state="translated">Aanmelden</target>
@ -1086,7 +1090,7 @@
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1098,7 +1102,7 @@
<target state="translated">1J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1110,7 +1114,7 @@
<target state="translated">5J</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1130,7 +1134,7 @@
<target state="translated">Max</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1318,7 +1322,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="6780407325174304229" datatype="html">
@ -1326,7 +1330,7 @@
<target state="translated">Locatie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -1886,7 +1890,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="2948175671993825247" datatype="html">
@ -1982,7 +1986,7 @@
<target state="translated">Huidige week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2210,7 +2214,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2329,14 +2333,6 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Activiteiten importeren</target>
@ -2665,6 +2661,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Aantal landen</target>
@ -2758,11 +2762,11 @@
<target state="translated">Het formulier kon niet worden gevalideerd.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -3217,6 +3221,14 @@
<context context-type="linenumber">166</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Aantal activiteiten</target>
@ -3413,14 +3425,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<target state="translated">Importeer dividenden</target>
@ -3665,6 +3669,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Onbeperkte transacties</target>
@ -3749,6 +3761,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<target state="translated">Eenmalige betaling, geen automatische verlenging.</target>
@ -3762,11 +3782,11 @@
<target state="translated">Kon het assetprofiel niet opslaan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -3990,7 +4010,7 @@
<target state="translated">Huidig jaar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -4010,7 +4030,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -4026,7 +4046,7 @@
<target state="translated">Het activaprofiel is opgeslagen.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -4402,7 +4422,7 @@
<target state="translated">Scraper instellingen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7504169991280318133" datatype="html">
@ -4934,11 +4954,11 @@
<target state="translated">De scraperconfiguratie kon niet worden geparseerd</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -5451,24 +5471,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Ben je op zoek naar een open source alternatief voor <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is een krachtige tool voor portefeuillebeheer die particulieren een uitgebreid platform biedt om hun beleggingen bij te houden, te analyseren en te optimaliseren. Of je nu een ervaren belegger bent of net begint, Ghostfolio biedt een intuïtieve gebruikersinterface en <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>uitgebreide functionaliteiten<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> om je te helpen weloverwogen beslissingen te nemen en je financiële toekomst in eigen handen te nemen.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Ben je op zoek naar een open source alternatief voor <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is een krachtige tool voor portefeuillebeheer die particulieren een uitgebreid platform biedt om hun beleggingen bij te houden, te analyseren en te optimaliseren. Of je nu een ervaren belegger bent of net begint, Ghostfolio biedt een intuïtieve gebruikersinterface en <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>uitgebreide functionaliteiten<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> om je te helpen weloverwogen beslissingen te nemen en je financiële toekomst in eigen handen te nemen.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio is open source software (OSS) en biedt een kosteneffectief alternatief voor <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> waardoor het bijzonder geschikt is voor mensen met een krap budget, zoals degenen <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>Financiële onafhankelijkheid nastreven, vroeg met pensioen gaan (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Door gebruik te maken van de collectieve inspanningen van een gemeenschap van ontwikkelaars en liefhebbers van persoonlijke financiën, verbetert Ghostfolio voortdurend de mogelijkheden, veiligheid en gebruikerservaring.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio is open source software (OSS) en biedt een kosteneffectief alternatief voor <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> waardoor het bijzonder geschikt is voor mensen met een krap budget, zoals degenen <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>Financiële onafhankelijkheid nastreven, vroeg met pensioen gaan (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Door gebruik te maken van de collectieve inspanningen van een gemeenschap van ontwikkelaars en liefhebbers van persoonlijke financiën, verbetert Ghostfolio voortdurend de mogelijkheden, veiligheid en gebruikerservaring.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Laten we eens dieper duiken in de gedetailleerde vergelijkingstabel hieronder om een beter begrip te krijgen hoe Ghostfolio zichzelf positioneert ten opzichte van <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We gaan in op verschillende aspecten zoals functies, gegevensprivacy, prijzen en meer, zodat je een weloverwogen keuze kunt maken voor jouw persoonlijke behoeften.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Laten we eens dieper duiken in de gedetailleerde vergelijkingstabel hieronder om een beter begrip te krijgen hoe Ghostfolio zichzelf positioneert ten opzichte van <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We gaan in op verschillende aspecten zoals functies, gegevensprivacy, prijzen en meer, zodat je een weloverwogen keuze kunt maken voor jouw persoonlijke behoeften.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5488,8 +5508,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Houd er rekening mee dat de verstrekte informatie in deze Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> is gebaseerd op ons onafhankelijk onderzoek en analyse. Deze website is niet gelieerd aan <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> of een ander product dat in de vergelijking wordt genoemd. Aangezien het landschap van tools voor persoonlijke financiën evolueert, is het essentieel om specifieke details of wijzigingen rechtstreeks op de betreffende productpagina te controleren. Hebben je gegevens een opfrisbeurt nodig? Help ons de gegevens nauwkeurig te houden op <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Houd er rekening mee dat de verstrekte informatie in deze Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> is gebaseerd op ons onafhankelijk onderzoek en analyse. Deze website is niet gelieerd aan <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> of een ander product dat in de vergelijking wordt genoemd. Aangezien het landschap van tools voor persoonlijke financiën evolueert, is het essentieel om specifieke details of wijzigingen rechtstreeks op de betreffende productpagina te controleren. Hebben je gegevens een opfrisbeurt nodig? Help ons de gegevens nauwkeurig te houden op <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5508,7 +5528,7 @@
<target state="translated">Wereldwijd</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5812,8 +5832,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> vergelijkingstabel</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> vergelijkingstabel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5948,7 +5968,7 @@
<target state="translated">De huidige markt waarde is</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5956,7 +5976,7 @@
<target state="translated">Test</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6048,7 +6068,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6112,7 +6132,7 @@
<target state="translated">Week tot nu toe</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6132,7 +6152,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6180,7 +6200,7 @@
<target state="translated">jaar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6200,7 +6220,7 @@
<target state="translated">jaren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6220,7 +6240,7 @@
<target state="translated">Data Verzamelen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6280,6 +6300,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Oeps! Het lijkt er op dat u te veel verzoeken indient. Doe het iets rustiger aan alstublieft.</target>
@ -6509,7 +6537,7 @@
<target state="translated">Alternatief</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6517,7 +6545,7 @@
<target state="translated">App</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6525,7 +6553,7 @@
<target state="translated">Budgetteren</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6585,7 +6613,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6601,7 +6629,7 @@
<target state="translated">Familiekantoor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6609,7 +6637,7 @@
<target state="translated">Investeerder</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6621,7 +6649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6633,7 +6661,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6641,7 +6669,7 @@
<target state="translated">Privacy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6649,7 +6677,7 @@
<target state="translated">Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6657,7 +6685,7 @@
<target state="translated">Hulpmiddel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6665,7 +6693,7 @@
<target state="translated">Gebruikers Ervaring</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6673,7 +6701,7 @@
<target state="translated">Vermogen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6681,7 +6709,7 @@
<target state="translated">Vermogensbeheer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6705,7 +6733,7 @@
<target state="translated">Fout</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6757,7 +6785,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6809,7 +6837,7 @@
<target state="translated">Sluiten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6837,7 +6865,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6985,8 +7013,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="new"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6997,8 +7025,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is geen Open Source Software</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is geen Open Source Software</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7033,8 +7061,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kan zelf gehost worden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kan zelf gehost worden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7053,8 +7081,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kan niet zelf gehost worden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kan niet zelf gehost worden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7065,8 +7093,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kan anoniem gebruikt worden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kan anoniem gebruikt worden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kan niet anoniem gebruik worden</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kan niet anoniem gebruik worden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> biedt een gratis abonnement aan</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> biedt een gratis abonnement aan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> biedt geen gratis abonnement aan</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> biedt geen gratis abonnement aan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7355,7 +7383,7 @@
<target state="translated">Opslaan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="translated">Lui</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="translated">Direct</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="translated">Standaard Marktprijs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="translated">Modus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="translated">Kiezer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="translated">HTTP Verzoek Headers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="translated">eind van de dag</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="translated">real-time</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) is al in gebruik.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="translated">Er is een fout opgetreden tijdens het updaten naar <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="translated">Huidige maand</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -539,7 +539,7 @@
<target state="translated">Usuń</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -591,7 +591,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="3175281009707730014" datatype="html">
@ -611,7 +611,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -653,10 +653,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -838,6 +834,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Liczba Aktywności</target>
@ -866,6 +870,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Liczba Krajów</target>
@ -1031,7 +1043,7 @@
<target state="translated">Konfiguracja Scrapera</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1251,7 +1263,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1267,7 +1279,7 @@
<target state="translated">Profil zasobu został zapisany</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -1307,7 +1319,7 @@
<target state="translated">Obecny rok</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1447,11 +1459,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1487,7 +1499,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1703,7 +1715,7 @@
<target state="translated">Obecny tydzień</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2187,7 +2199,7 @@
<target state="translated">Liczony od początku roku (year-to-date)</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2199,7 +2211,7 @@
<target state="translated">1 rok</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2211,7 +2223,7 @@
<target state="translated">5 lat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2231,7 +2243,7 @@
<target state="translated">Maksimum</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2395,7 +2407,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -2411,7 +2423,7 @@
<target state="translated">Ustawienia Regionalne</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -2995,11 +3007,11 @@
<target state="translated">Nie udało się przetworzyć konfiguracji scrapera</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -3202,6 +3214,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Inwestycje</target>
@ -3886,14 +3906,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Importuj Aktywności</target>
@ -4143,7 +4155,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -4310,14 +4322,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
<source>Top</source>
<target state="translated">Największe wzrosty</target>
@ -4454,6 +4458,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Nieograniczona Liczba Transakcji</target>
@ -4558,6 +4570,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<target state="translated">Wsparcie przez E-mail i Czat</target>
@ -4595,11 +4615,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -4740,24 +4760,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Szukasz alternatywy typu open source dla <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to potężne narzędzie do zarządzania portfelem, które zapewnia osobom fizycznym kompleksową platformę do śledzenia, analizowania i optymalizacji ich inwestycji. Niezależnie od tego, czy jesteś doświadczonym inwestorem, czy dopiero zaczynasz, Ghostfolio oferuje intuicyjny interfejs użytkownika i <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>szeroki zakres funkcjonalności<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, które pomogą Ci podejmować przemyślane decyzje i przejąć kontrolę nad swoją finansową przyszłością.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Szukasz alternatywy typu open source dla <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to potężne narzędzie do zarządzania portfelem, które zapewnia osobom fizycznym kompleksową platformę do śledzenia, analizowania i optymalizacji ich inwestycji. Niezależnie od tego, czy jesteś doświadczonym inwestorem, czy dopiero zaczynasz, Ghostfolio oferuje intuicyjny interfejs użytkownika i <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>szeroki zakres funkcjonalności<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, które pomogą Ci podejmować przemyślane decyzje i przejąć kontrolę nad swoją finansową przyszłością.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio to oprogramowanie o otwartym kodzie źródłowym (OSS), stanowiące opłacalną alternatywę dla <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>, czyniąc go szczególnie odpowiednim dla osób o ograniczonym budżecie, takich jak osoby <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>dążące do finansowej niezależności i wcześniejszej emerytury (Financial Independence, Retire Early - FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Wykorzystując wspólne wysiłki społeczności programistów i entuzjastów finansów osobistych, Ghostfolio stale zwiększa swoje możliwości, bezpieczeństwo i komfort użytkowania.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio to oprogramowanie o otwartym kodzie źródłowym (OSS), stanowiące opłacalną alternatywę dla <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>, czyniąc go szczególnie odpowiednim dla osób o ograniczonym budżecie, takich jak osoby <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>dążące do finansowej niezależności i wcześniejszej emerytury (Financial Independence, Retire Early - FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Wykorzystując wspólne wysiłki społeczności programistów i entuzjastów finansów osobistych, Ghostfolio stale zwiększa swoje możliwości, bezpieczeństwo i komfort użytkowania.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Zagłębmy się w szczegółową tabelę porównawczą Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> poniżej, aby dokładnie zrozumieć, jak Ghostfolio pozycjonuje się w stosunku do <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Przeanalizujemy różne aspekty, takie jak funkcje, prywatność danych, opłaty i inne, umożliwiając Tobie dokonanie przemyślanego wyboru pod kątem osobistych wymagań.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Zagłębmy się w szczegółową tabelę porównawczą Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> poniżej, aby dokładnie zrozumieć, jak Ghostfolio pozycjonuje się w stosunku do <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Przeanalizujemy różne aspekty, takie jak funkcje, prywatność danych, opłaty i inne, umożliwiając Tobie dokonanie przemyślanego wyboru pod kątem osobistych wymagań.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -4776,8 +4796,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> - tabela porównawcza</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> - tabela porównawcza</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -4928,8 +4948,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Należy pamiętać, że informacje zawarte w tabeli porównawczej Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> są oparte na naszych niezależnych badaniach i analizach. Ta strona internetowa nie jest powiązana z <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> ani żadnym innym produktem wymienionym w porównaniu. Ponieważ krajobraz narzędzi do finansów osobistych ewoluuje, ważne jest, aby weryfikować wszelkie szczegóły lub zmiany bezpośrednio na stronie danego produktu. Informacje wymagają aktualizacji? Pomóż nam utrzymywać dokładne dane na <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Należy pamiętać, że informacje zawarte w tabeli porównawczej Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> są oparte na naszych niezależnych badaniach i analizach. Ta strona internetowa nie jest powiązana z <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> ani żadnym innym produktem wymienionym w porównaniu. Ponieważ krajobraz narzędzi do finansów osobistych ewoluuje, ważne jest, aby weryfikować wszelkie szczegóły lub zmiany bezpośrednio na stronie danego produktu. Informacje wymagają aktualizacji? Pomóż nam utrzymywać dokładne dane na <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -4956,7 +4976,7 @@
<target state="translated">Globalny</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5948,7 +5968,7 @@
<target state="translated">Obecna cena rynkowa wynosi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5956,7 +5976,7 @@
<target state="translated">Test</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6048,7 +6068,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6112,7 +6132,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6132,7 +6152,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6180,7 +6200,7 @@
<target state="translated">rok</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6200,7 +6220,7 @@
<target state="translated">lata</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6220,7 +6240,7 @@
<target state="translated">Gromadzenie Danych</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6280,6 +6300,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Ups! Wygląda na to, że wykonujesz zbyt wiele zapytań. Proszę, zwolnij trochę.</target>
@ -6509,7 +6537,7 @@
<target state="translated">Alternatywa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6517,7 +6545,7 @@
<target state="translated">Aplikacja</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6525,7 +6553,7 @@
<target state="translated">Budżetowanie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6585,7 +6613,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6601,7 +6629,7 @@
<target state="translated">Biuro Rodzinne</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6609,7 +6637,7 @@
<target state="translated">Inwestor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6621,7 +6649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6633,7 +6661,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6641,7 +6669,7 @@
<target state="translated">Prywatność</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6649,7 +6677,7 @@
<target state="translated">Oprogramowanie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6657,7 +6685,7 @@
<target state="translated">Narzędzie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6665,7 +6693,7 @@
<target state="translated">Doświadczenie Użytkownika</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6673,7 +6701,7 @@
<target state="translated">Majątek</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6681,7 +6709,7 @@
<target state="translated">Zarządzanie Majątkiem</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6705,7 +6733,7 @@
<target state="translated">Błąd</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6757,7 +6785,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6809,7 +6837,7 @@
<target state="translated">Zamknij</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6837,7 +6865,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6985,8 +7013,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> jest Oprogramowaniem Open Source</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> jest Oprogramowaniem Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6997,8 +7025,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> nie jest Oprogramowaniem Open Source</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> nie jest Oprogramowaniem Open Source</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7033,8 +7061,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> może być hostowana samodzielnie</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> może być hostowana samodzielnie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7053,8 +7081,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> nie może być hostowany samodzielnie</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> nie może być hostowany samodzielnie</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7065,8 +7093,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> może być używana anonimowo</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> może być używana anonimowo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> nie może być używana anonimowo</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> nie może być używana anonimowo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> oferuje darmowy plan</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> oferuje darmowy plan</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> nie oferuje darmowego planu</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> nie oferuje darmowego planu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7355,7 +7383,7 @@
<target state="translated">Zapisz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="translated">Leniwy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="translated">Natychmiastowy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="translated">Domyślna cena rynkowa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="translated">Tryb</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="translated">Selektor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="translated">Nagłówki żądań HTTP</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="translated">koniec dnia</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="translated">w czasie rzeczywistym</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) jest już w użyciu.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="translated">Wystąpił błąd podczas aktualizacji do <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="translated">Bieżący miesiąc</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -318,7 +318,7 @@
<target state="translated">Eliminar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -370,7 +370,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -412,10 +412,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -474,7 +470,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -609,6 +605,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="5274897475180636586" datatype="html">
<source>Gather Profile Data</source>
<target state="translated">Recolher Dados de Perfíl</target>
@ -778,11 +782,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -810,7 +814,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1338,7 +1342,7 @@
<target state="translated">AATD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1350,7 +1354,7 @@
<target state="translated">1A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1362,7 +1366,7 @@
<target state="translated">5A</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1382,7 +1386,7 @@
<target state="translated">Máx</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -1618,7 +1622,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -1646,7 +1650,7 @@
<target state="translated">Localidade</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -2150,7 +2154,7 @@
<target state="new">Current week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2382,7 +2386,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -2633,6 +2637,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="8298333184054476827" datatype="html">
<source>Registration</source>
<target state="translated">Registo</target>
@ -2741,14 +2753,6 @@
<context context-type="linenumber">167</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Importar Atividades</target>
@ -3229,6 +3233,14 @@
<context context-type="linenumber">186</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Nº de Atividades</target>
@ -3413,14 +3425,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="72640258012696878" datatype="html">
<source>Import Dividends</source>
<target state="translated">Importar Dividendos</target>
@ -3665,6 +3669,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Transações Ilimitadas</target>
@ -3749,6 +3761,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<target state="translated">Pagamento único, sem renovação automática.</target>
@ -3762,11 +3782,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -3990,7 +4010,7 @@
<target state="new">Current year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -4010,7 +4030,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -4026,7 +4046,7 @@
<target state="new">Asset profile has been saved</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -4402,7 +4422,7 @@
<target state="translated">Configuração do raspador</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7504169991280318133" datatype="html">
@ -4934,11 +4954,11 @@
<target state="new">Could not parse scraper configuration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -5451,24 +5471,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Você está procurando uma alternativa de código aberto para <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> é uma poderosa ferramenta de gestão de portfólio que oferece aos investidores uma plataforma abrangente para monitorar, analisar e otimizar seus investimentos. Seja você um investidor experiente ou iniciante, o Ghostfolio oferece uma interface de usuário intuitiva e um <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>ampla gama de funcionalidades<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> para ajudá-lo a tomar decisões informadas e assumir o controle do seu futuro financeiro.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Você está procurando uma alternativa de código aberto para <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> é uma poderosa ferramenta de gestão de portfólio que oferece aos investidores uma plataforma abrangente para monitorar, analisar e otimizar seus investimentos. Seja você um investidor experiente ou iniciante, o Ghostfolio oferece uma interface de usuário intuitiva e um <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>ampla gama de funcionalidades<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> para ajudá-lo a tomar decisões informadas e assumir o controle do seu futuro financeiro.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio é um software de código aberto (OSS), que oferece uma alternativa econômica para <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tornando-o particularmente adequado para indivíduos com orçamento apertado, como aqueles <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>buscando Independência Financeira, Aposentadoria Antecipada (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Ao aproveitar os esforços coletivos de uma comunidade de desenvolvedores e entusiastas de finanças pessoais, o Ghostfolio aprimora continuamente seus recursos, segurança e experiência do usuário.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio é um software de código aberto (OSS), que oferece uma alternativa econômica para <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> tornando-o particularmente adequado para indivíduos com orçamento apertado, como aqueles <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>buscando Independência Financeira, Aposentadoria Antecipada (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Ao aproveitar os esforços coletivos de uma comunidade de desenvolvedores e entusiastas de finanças pessoais, o Ghostfolio aprimora continuamente seus recursos, segurança e experiência do usuário.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Vamos nos aprofundar nos detalhes do Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tabela de comparação abaixo para obter uma compreensão completa de como o Ghostfolio se posiciona em relação a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Exploraremos vários aspectos, como recursos, privacidade de dados, preços e muito mais, permitindo que você faça uma escolha bem informada para suas necessidades pessoais.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Vamos nos aprofundar nos detalhes do Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> tabela de comparação abaixo para obter uma compreensão completa de como o Ghostfolio se posiciona em relação a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Exploraremos vários aspectos, como recursos, privacidade de dados, preços e muito mais, permitindo que você faça uma escolha bem informada para suas necessidades pessoais.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5488,8 +5508,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Observe que as informações fornecidas no Ghostfolio vs. <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> A tabela de comparação é baseada em nossa pesquisa e análise independentes. Este site não é afiliado a <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> ou qualquer outro produto mencionado na comparação. À medida que o cenário das ferramentas de finanças pessoais evolui, é essencial verificar quaisquer detalhes ou alterações específicas diretamente na página do produto correspondente. Os dados precisam de uma atualização? Ajude-nos a manter dados precisos sobre <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Observe que as informações fornecidas no Ghostfolio vs. <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> A tabela de comparação é baseada em nossa pesquisa e análise independentes. Este site não é afiliado a <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> ou qualquer outro produto mencionado na comparação. À medida que o cenário das ferramentas de finanças pessoais evolui, é essencial verificar quaisquer detalhes ou alterações específicas diretamente na página do produto correspondente. Os dados precisam de uma atualização? Ajude-nos a manter dados precisos sobre <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -5508,7 +5528,7 @@
<target state="translated">Global</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5812,8 +5832,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> tabela de comparação</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> tabela de comparação</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5948,7 +5968,7 @@
<target state="translated">O preço de mercado atual é</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5956,7 +5976,7 @@
<target state="translated">Teste</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6048,7 +6068,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6112,7 +6132,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6132,7 +6152,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6180,7 +6200,7 @@
<target state="translated">ano</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6200,7 +6220,7 @@
<target state="translated">anos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6220,7 +6240,7 @@
<target state="translated">Coleta de dados</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6280,6 +6300,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Ops! Parece que você está fazendo muitas solicitações. Por favor, diminua um pouco a velocidade.</target>
@ -6509,7 +6537,7 @@
<target state="translated">Alternativo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6517,7 +6545,7 @@
<target state="translated">Aplicativo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6525,7 +6553,7 @@
<target state="translated">Orçamento</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6585,7 +6613,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6601,7 +6629,7 @@
<target state="translated">Escritório Familiar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6609,7 +6637,7 @@
<target state="translated">Investidor</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6621,7 +6649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6633,7 +6661,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6641,7 +6669,7 @@
<target state="translated">Privacidade</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6649,7 +6677,7 @@
<target state="translated">Programas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6657,7 +6685,7 @@
<target state="translated">Ferramenta</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6665,7 +6693,7 @@
<target state="translated">Experiência do usuário</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6673,7 +6701,7 @@
<target state="translated">Fortuna</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6681,7 +6709,7 @@
<target state="translated">Gestão de patrimônio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6705,7 +6733,7 @@
<target state="translated">Erro</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6757,7 +6785,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6809,7 +6837,7 @@
<target state="translated">Fechar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6837,7 +6865,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6985,8 +7013,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> é software de código aberto</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> é software de código aberto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6997,8 +7025,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> não é software de código aberto</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> não é software de código aberto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7033,8 +7061,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> pode ser auto-hospedado</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> pode ser auto-hospedado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7053,8 +7081,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> não pode ser auto-hospedado</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> não pode ser auto-hospedado</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7065,8 +7093,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> pode ser usado anonimamente</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> pode ser usado anonimamente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> não pode ser usado anonimamente</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> não pode ser usado anonimamente</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> oferece um plano gratuito</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> oferece um plano gratuito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> não oferece um plano gratuito</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> não oferece um plano gratuito</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7355,7 +7383,7 @@
<target state="translated">Guardar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="new">Lazy</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="new">Instant</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="translated">Preço de mercado padrão</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="new">Mode</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="new">Selector</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="new">HTTP Request Headers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="new">end of day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="new">real-time</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="new"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) is already in use.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="new">An error occurred while updating to <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="new">Current month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -499,7 +499,7 @@
<target state="translated">Sil</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -551,7 +551,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -593,10 +593,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -655,7 +651,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="2505231537574917205" datatype="html">
@ -790,6 +786,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">İşlem Sayısı</target>
@ -818,6 +822,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Ülke Sayısı</target>
@ -951,7 +963,7 @@
<target state="translated">Veri Toplayıcı Yapılandırması</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1147,7 +1159,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1163,7 +1175,7 @@
<target state="new">Asset profile has been saved</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -1203,7 +1215,7 @@
<target state="new">Current year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1295,11 +1307,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1335,7 +1347,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1551,7 +1563,7 @@
<target state="new">Current week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2035,7 +2047,7 @@
<target state="translated">YTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2047,7 +2059,7 @@
<target state="trasnlated">1Y</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2059,7 +2071,7 @@
<target state="translated">5Y</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2079,7 +2091,7 @@
<target state="translated">Maks.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2515,11 +2527,11 @@
<target state="new">Could not parse scraper configuration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -2734,6 +2746,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Varlıklar</target>
@ -3318,14 +3338,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">İşlemleri İçe Aktar</target>
@ -3583,7 +3595,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -3750,14 +3762,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
<source>Top</source>
<target state="translated">Üst</target>
@ -3894,6 +3898,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Sınırsız İşlem</target>
@ -3998,6 +4010,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<target state="translated">E-posta ve Sohbet Desteği</target>
@ -4035,11 +4055,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -4200,24 +4220,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Açık kaynaklı bir alternatif mi arıyorsunuz <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> güçlü bir portföy yönetim aracıdır ve bireylere yatırımlarını takip etmek, analiz etmek ve optimize etmek için kapsamlı bir platform sunar. İster deneyimli bir yatırımcı olun ister yeni başlıyor olun, Ghostfolio, bilinçli kararlar almanıza ve finansal geleceğinizi kontrol etmenize yardımcı olmak için sezgisel bir kullanıcı arayüzü ve <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>geniş bir işlevsellik yelpazesi<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> sunmaktadır.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Açık kaynaklı bir alternatif mi arıyorsunuz <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> güçlü bir portföy yönetim aracıdır ve bireylere yatırımlarını takip etmek, analiz etmek ve optimize etmek için kapsamlı bir platform sunar. İster deneyimli bir yatırımcı olun ister yeni başlıyor olun, Ghostfolio, bilinçli kararlar almanıza ve finansal geleceğinizi kontrol etmenize yardımcı olmak için sezgisel bir kullanıcı arayüzü ve <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>geniş bir işlevsellik yelpazesi<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> sunmaktadır.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio, <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> karşısında açık kaynak kodlu maliyet etkin bir seçenek sunmaktadır. <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/> gibi kısıtlı bütçeye sahip, finansal özgürlük ve erken emeklilik (FIRE) amaçlayan kulanıcılar için özellikle uygundur. <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> Ghostfolio, topluluk içindeki geliştiricilerin ve kişisel finans meraklılarının kolektif çabası sayesinde yeteneklerini, güvenliğini ve kullanıcı deneyimini sürekli olarak geliştirmektedir.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio, <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> karşısında açık kaynak kodlu maliyet etkin bir seçenek sunmaktadır. <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/> gibi kısıtlı bütçeye sahip, finansal özgürlük ve erken emeklilik (FIRE) amaçlayan kulanıcılar için özellikle uygundur. <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> Ghostfolio, topluluk içindeki geliştiricilerin ve kişisel finans meraklılarının kolektif çabası sayesinde yeteneklerini, güvenliğini ve kullanıcı deneyimini sürekli olarak geliştirmektedir.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> arasındaki ayrıntılı karşılaştırmanın yer aldığı aşağıdaki tabloya daha yakından bakarak Ghostfolio’nun <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> karşısında kendisini nasıl konumlandırdığını kapsamlı bir şekilde değerlendirelim. Bu kapsamda özellikler, veri güvenliği, fiyat vb. hususları inceleyerek kişisel gereksinimleriniz için bilgiye dayalı bir seçim yapmanızı sağlayabileceği.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> arasındaki ayrıntılı karşılaştırmanın yer aldığı aşağıdaki tabloya daha yakından bakarak Ghostfolio’nun <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> karşısında kendisini nasıl konumlandırdığını kapsamlı bir şekilde değerlendirelim. Bu kapsamda özellikler, veri güvenliği, fiyat vb. hususları inceleyerek kişisel gereksinimleriniz için bilgiye dayalı bir seçim yapmanızı sağlayabileceği.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -4368,8 +4388,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Lütfen dikkat, Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> arasındaki karşılaştırmanın yer aldığı tablodaki bilgiler bağımsız araştırmalarımıza dayanmaktadır. Websitemizin <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> ile ya da bu karşılaştırmada adı geçen herhangi bir ürün ve hizmet ile ilişkisi bulunmamaktadır. Kişisel finans araçlarının kapsamı geliştikçe, belirli ayrıntıların veya değişikliklerin doğrudan ilgili ürün sayfasından doğrulanması önemlidir. Verilerin yenilenmesi mi gerekiyor? Doğru verileri sağlamamıza yardımcı olmak için sayfamızı ziyaret edin. <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Lütfen dikkat, Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> arasındaki karşılaştırmanın yer aldığı tablodaki bilgiler bağımsız araştırmalarımıza dayanmaktadır. Websitemizin <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> ile ya da bu karşılaştırmada adı geçen herhangi bir ürün ve hizmet ile ilişkisi bulunmamaktadır. Kişisel finans araçlarının kapsamı geliştikçe, belirli ayrıntıların veya değişikliklerin doğrudan ilgili ürün sayfasından doğrulanması önemlidir. Verilerin yenilenmesi mi gerekiyor? Doğru verileri sağlamamıza yardımcı olmak için sayfamızı ziyaret edin. <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -4396,7 +4416,7 @@
<target state="translated">Küresel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -4600,7 +4620,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -4616,7 +4636,7 @@
<target state="translated">Yerel Ayarlar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -5812,8 +5832,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> karşılatırma tablosu</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio ve <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> karşılatırma tablosu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5948,7 +5968,7 @@
<target state="translated">Şu anki piyasa fiyatı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5956,7 +5976,7 @@
<target state="translated">Test</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="6483680626836794824" datatype="html">
@ -6048,7 +6068,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6112,7 +6132,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6132,7 +6152,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6180,7 +6200,7 @@
<target state="translated">Yıl</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6200,7 +6220,7 @@
<target state="translated">Yıllar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6220,7 +6240,7 @@
<target state="translated">Veri Toplama</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6280,6 +6300,14 @@
<context context-type="linenumber">246</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Oops! Görünüşe göre çok fazla istekte bulunuyorsunuz. Lütfen biraz yavaşlayın.</target>
@ -6509,7 +6537,7 @@
<target state="translated">Alternatif</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6517,7 +6545,7 @@
<target state="translated">App</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6525,7 +6553,7 @@
<target state="translated">Bütçeleme</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6585,7 +6613,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6601,7 +6629,7 @@
<target state="translated">Aile Ofisi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6609,7 +6637,7 @@
<target state="translated">Yatırımcı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6621,7 +6649,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6633,7 +6661,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6641,7 +6669,7 @@
<target state="translated">Gizlilik</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6649,7 +6677,7 @@
<target state="translated">Yazılım</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6657,7 +6685,7 @@
<target state="translated">Araç</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6665,7 +6693,7 @@
<target state="translated">Kullanıcı Deneyimi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6673,7 +6701,7 @@
<target state="translated">Zenginlik</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6681,7 +6709,7 @@
<target state="translated">Zenginlik Yönetimi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6705,7 +6733,7 @@
<target state="translated">Hata</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6757,7 +6785,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6809,7 +6837,7 @@
<target state="translated">Kapat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6837,7 +6865,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6985,8 +7013,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>, Açık Kaynak Kodlu Yazılımdır</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>, Açık Kaynak Kodlu Yazılımdır</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6997,8 +7025,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/>, Açık Kaynak Kodlu Yazılımdır</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/>, Açık Kaynak Kodlu Yazılımdır</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7033,8 +7061,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kendi sunucunuzda barındırılabilir</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kendi sunucunuzda barındırılabilir</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7053,8 +7081,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> kendi sunucunuzda barındırılmaz</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> kendi sunucunuzda barındırılmaz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7065,8 +7093,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> gizli kullanımda kullanılabilir</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> gizli kullanımda kullanılabilir</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7077,8 +7105,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> gizli kullanımda kullanılmaz</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> gizli kullanımda kullanılmaz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7089,8 +7117,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ücretsiz plan sunar</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ücretsiz plan sunar</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7101,8 +7129,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> ücretsiz plan sunmaz</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> ücretsiz plan sunmaz</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7355,7 +7383,7 @@
<target state="translated">Kaydet</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="translated">Tembel</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="translated">Anında</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="translated">Varsayılan Piyasa Fiyatı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="translated">Mod</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="translated">Seçici</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="translated">HTTP İstek Başlıkları</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="translated">gün sonu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="translated">gerçek zamanlı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) is already in use.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="translated">Güncelleştirilirken bir hata oluştu <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="new">Current month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -623,7 +623,7 @@
<target state="translated">Видалити</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -675,7 +675,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -723,7 +723,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="288029731436334434" datatype="html">
@ -781,10 +781,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -934,6 +930,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">Кількість активностей</target>
@ -962,6 +966,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">Кількість країн</target>
@ -1007,7 +1019,7 @@
<target state="translated">Помилка</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="4405333887341433096" datatype="html">
@ -1015,7 +1027,7 @@
<target state="translated">Поточна ринкова ціна</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="1102717806459547726" datatype="html">
@ -1131,7 +1143,7 @@
<target state="translated">Конфігурація скребка</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -1139,7 +1151,7 @@
<target state="translated">Тест</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="8308045076391224954" datatype="html">
@ -1151,7 +1163,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1167,7 +1179,7 @@
<target state="new">Asset profile has been saved</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1331,7 +1343,7 @@
<target state="translated">Збір даних</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -1443,7 +1455,7 @@
<target state="new">Current year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1707,11 +1719,11 @@
<target state="new">Could not validate form</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1747,7 +1759,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -2111,7 +2123,7 @@
<target state="new">Current week</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2331,7 +2343,7 @@
<target state="translated">Зберегти</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -2611,7 +2623,7 @@
<target state="translated">З початку року</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2623,7 +2635,7 @@
<target state="translated">1 рік</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2635,7 +2647,7 @@
<target state="translated">5 років</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2655,7 +2667,7 @@
<target state="translated">Максимум</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2959,7 +2971,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -2983,7 +2995,7 @@
<target state="translated">Локалізація</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -3150,6 +3162,14 @@
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">Упс! Здається, ви робите занадто багато запитів. Будь ласка, пригальмуй трохи.</target>
@ -3587,11 +3607,11 @@
<target state="new">Could not parse scraper configuration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -3819,6 +3839,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">Активи</target>
@ -4539,14 +4567,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">Імпортувати активності</target>
@ -4812,7 +4832,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -4984,7 +5004,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -5011,14 +5031,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source>
<target state="new">Close Holding</target>
@ -5235,6 +5247,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">Необмежені транзакції</target>
@ -5339,6 +5359,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<target state="translated">Підтримка електронної пошти та чату</target>
@ -5360,11 +5388,11 @@
<target state="new">Could not save asset profile</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -5595,7 +5623,7 @@
<target state="translated">Глобальний</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5607,7 +5635,7 @@
<target state="translated">Альтернатива</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -5615,7 +5643,7 @@
<target state="translated">Додаток</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -5623,7 +5651,7 @@
<target state="translated">Бюджетування</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -5683,7 +5711,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -5699,7 +5727,7 @@
<target state="translated">Сімейний офіс</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -5707,7 +5735,7 @@
<target state="translated">Інвестор</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -5719,7 +5747,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -5731,7 +5759,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -5739,7 +5767,7 @@
<target state="translated">Конфіденційність</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -5747,7 +5775,7 @@
<target state="translated">Програмне забезпечення</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -5755,7 +5783,7 @@
<target state="translated">Інструмент</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -5763,7 +5791,7 @@
<target state="translated">Користувацький досвід</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -5771,7 +5799,7 @@
<target state="translated">Багатство</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -5779,7 +5807,7 @@
<target state="translated">Управління багатством</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="4649895231694574166" datatype="html">
@ -5799,24 +5827,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Ви шукаєте відкриту альтернативу для <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> є потужним інструментом управління портфелем, який надає індивідуумам комплексну платформу для відстеження, аналізу та оптимізації їхніх інвестицій. Незалежно від того, чи ви досвідчений інвестор, чи тільки починаєте, Ghostfolio пропонує зручний інтерфейс користувача та <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>широкий спектр функціональностей<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> для допомоги вам у прийнятті обґрунтованих рішень та взятті під контроль вашого фінансового майбутнього.</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">Ви шукаєте відкриту альтернативу для <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> є потужним інструментом управління портфелем, який надає індивідуумам комплексну платформу для відстеження, аналізу та оптимізації їхніх інвестицій. Незалежно від того, чи ви досвідчений інвестор, чи тільки починаєте, Ghostfolio пропонує зручний інтерфейс користувача та <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>широкий спектр функціональностей<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> для допомоги вам у прийнятті обґрунтованих рішень та взятті під контроль вашого фінансового майбутнього.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio є відкритим програмним забезпеченням (OSS), що надає економічно ефективну альтернативу для <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>, роблячи його особливо підходящим для тих, хто обмежений у бюджеті, таких як <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>прагнення до фінансової незалежності, раннього виходу на пенсію (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Використовуючи колективні зусилля спільноти розробників та ентузіастів особистих фінансів, Ghostfolio постійно покращує свої можливості, безпеку та користувацький досвід.</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio є відкритим програмним забезпеченням (OSS), що надає економічно ефективну альтернативу для <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>, роблячи його особливо підходящим для тих, хто обмежений у бюджеті, таких як <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>прагнення до фінансової незалежності, раннього виходу на пенсію (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. Використовуючи колективні зусилля спільноти розробників та ентузіастів особистих фінансів, Ghostfolio постійно покращує свої можливості, безпеку та користувацький досвід.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Давайте заглибимося у детальну порівняльну таблицю Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> нижче, щоб отримати повне розуміння того, як Ghostfolio позиціонує себе відносно <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. Ми дослідимо різні аспекти, такі як функції, конфіденційність даних, ціни тощо, що дозволить вам зробити добре обдуманий вибір для ваших особистих потреб.</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">Давайте заглибимося у детальну порівняльну таблицю Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> нижче, щоб отримати повне розуміння того, як Ghostfolio позиціонує себе відносно <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. Ми дослідимо різні аспекти, такі як функції, конфіденційність даних, ціни тощо, що дозволить вам зробити добре обдуманий вибір для ваших особистих потреб.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -5835,8 +5863,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Порівняльна таблиця Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/></target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Порівняльна таблиця Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/></target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -5883,8 +5911,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> є відкритим програмним забезпеченням</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> є відкритим програмним забезпеченням</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -5931,8 +5959,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> не є відкритим програмним забезпеченням</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> не є відкритим програмним забезпеченням</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -6011,8 +6039,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> може бути self-hosted</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> може бути self-hosted</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -6031,8 +6059,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> не може бути self-hosted</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> не може бути self-hosted</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -6051,8 +6079,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> може використовуватися анонімно</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> може використовуватися анонімно</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -6063,8 +6091,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> не може використовуватися анонімно</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> не може використовуватися анонімно</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -6083,8 +6111,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> пропонує безкоштовний план</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> пропонує безкоштовний план</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -6095,8 +6123,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> не пропонує безкоштовний план</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> не пропонує безкоштовний план</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -6135,8 +6163,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Зазначаємо, що інформація, надана в порівняльній таблиці Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> базується на нашому незалежному дослідженні та аналізі. Цей веб-сайт не пов’язаний з <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> або будь-яким іншим продуктом, згаданим у порівнянні. Оскільки ландшафт інструментів особистих фінансів еволюціонує, важливо перевіряти будь-які конкретні деталі або зміни безпосередньо на сторінці відповідного продукту. Потрібно оновити дані? Допоможіть нам підтримувати точні дані на <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/> GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">Зазначаємо, що інформація, надана в порівняльній таблиці Ghostfolio проти <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> базується на нашому незалежному дослідженні та аналізі. Цей веб-сайт не пов’язаний з <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> або будь-яким іншим продуктом, згаданим у порівнянні. Оскільки ландшафт інструментів особистих фінансів еволюціонує, важливо перевіряти будь-які конкретні деталі або зміни безпосередньо на сторінці відповідного продукту. Потрібно оновити дані? Допоможіть нам підтримувати точні дані на <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/> GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -6343,7 +6371,7 @@
<target state="translated">WTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6363,7 +6391,7 @@
<target state="translated">MTD</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6383,7 +6411,7 @@
<target state="translated">рік</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6403,7 +6431,7 @@
<target state="translated">роки</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6759,7 +6787,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6819,7 +6847,7 @@
<target state="translated">Закрити</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6847,7 +6875,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -7463,7 +7491,7 @@
<target state="translated">Лінивий</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7471,7 +7499,7 @@
<target state="translated">Миттєвий</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7479,7 +7507,7 @@
<target state="new">Default Market Price</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7487,7 +7515,7 @@
<target state="translated">Режим</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7495,7 +7523,7 @@
<target state="translated">Селектор</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7503,7 +7531,7 @@
<target state="new">HTTP Request Headers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7511,7 +7539,7 @@
<target state="new">end of day</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7519,7 +7547,7 @@
<target state="translated">реальний час</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7720,7 +7748,7 @@
<target state="new"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) is already in use.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7728,7 +7756,7 @@
<target state="new">An error occurred while updating to <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8079,7 +8107,7 @@
<target state="new">Current month</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -517,7 +517,7 @@
<source>Delete</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -567,7 +567,7 @@
<source>Paid</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="3175281009707730014" datatype="html">
@ -585,7 +585,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -624,10 +624,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -792,6 +788,13 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<context-group purpose="location">
@ -817,6 +820,13 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<context-group purpose="location">
@ -988,7 +998,7 @@
<source>Scraper Configuration</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1184,7 +1194,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1199,7 +1209,7 @@
<source>Asset profile has been saved</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -1234,7 +1244,7 @@
<source>Current year</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1359,11 +1369,11 @@
<source>Could not validate form</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1396,7 +1406,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1592,7 +1602,7 @@
<source>Current week</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2037,7 +2047,7 @@
<source>YTD</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2048,7 +2058,7 @@
<source>1Y</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2059,7 +2069,7 @@
<source>5Y</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2077,7 +2087,7 @@
<source>Max</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2223,7 +2233,7 @@
<source>Coupon</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -2237,7 +2247,7 @@
<source>Locale</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -2781,11 +2791,11 @@
<source>Could not parse scraper configuration</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -2969,6 +2979,13 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<context-group purpose="location">
@ -3591,13 +3608,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<context-group purpose="location">
@ -3820,7 +3830,7 @@
<source>Trial</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -3972,13 +3982,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
<source>Top</source>
<context-group purpose="location">
@ -4101,6 +4104,13 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<context-group purpose="location">
@ -4195,6 +4205,13 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<context-group purpose="location">
@ -4228,11 +4245,11 @@
<source>Could not save asset profile</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -4358,21 +4375,21 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -4390,7 +4407,7 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -4541,7 +4558,7 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -4565,7 +4582,7 @@
<source>Global</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5443,14 +5460,14 @@
<source>The current market price is</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
<source>Test</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="2570446216260149991" datatype="html">
@ -5548,7 +5565,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -5597,7 +5614,7 @@
<source>MTD</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -5608,7 +5625,7 @@
<source>WTD</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -5644,7 +5661,7 @@
<source>year</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -5663,7 +5680,7 @@
<source>years</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -5704,7 +5721,7 @@
<source>Data Gathering</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -5736,6 +5753,13 @@
<context context-type="linenumber">240</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<context-group purpose="location">
@ -5936,7 +5960,7 @@
<source>Wealth</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -5995,7 +6019,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6009,35 +6033,35 @@
<source>User Experience</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
<source>App</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
<source>Tool</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
<source>Investor</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
<source>Wealth Management</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6051,14 +6075,14 @@
<source>Alternative</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="4622218074144052433" datatype="html">
<source>Family Office</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6069,21 +6093,21 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
<source>Software</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
<source>Budgeting</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6094,14 +6118,14 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
<source>Privacy</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="1518717392874668219" datatype="html">
@ -6115,7 +6139,7 @@
<source>Error</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="2159130950882492111" datatype="html">
@ -6126,7 +6150,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6205,7 +6229,7 @@
<source>Close</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6233,7 +6257,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6358,7 +6382,7 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -6369,7 +6393,7 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -6408,7 +6432,7 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -6426,7 +6450,7 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -6437,7 +6461,7 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -6448,7 +6472,7 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -6459,7 +6483,7 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -6470,7 +6494,7 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6703,7 +6727,7 @@
<source>Save</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6803,56 +6827,56 @@
<source>Mode</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
<source>Default Market Price</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
<source>Selector</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
<source>Instant</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8540986733881734625" datatype="html">
<source>Lazy</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
<source>HTTP Request Headers</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
<source>real-time</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
<source>end of day</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7032,14 +7056,14 @@
<source><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) is already in use.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
<source>An error occurred while updating to <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>).</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -7331,7 +7355,7 @@
<source>Current month</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -548,7 +548,7 @@
<target state="translated">删除</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/admin-market-data.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">301</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
@ -600,7 +600,7 @@
<target state="new">Paid</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">117</context>
<context context-type="linenumber">121</context>
</context-group>
</trans-unit>
<trans-unit id="3175281009707730014" datatype="html">
@ -620,7 +620,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">468</context>
</context-group>
</trans-unit>
<trans-unit id="1107354728956440783" datatype="html">
@ -662,10 +662,6 @@
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">134</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="340430316261570792" datatype="html">
<source>Finished</source>
@ -847,6 +843,14 @@
<context context-type="linenumber">50</context>
</context-group>
</trans-unit>
<trans-unit id="6418462810730461014" datatype="html">
<source>Data Gathering Frequency</source>
<target state="new">Data Gathering Frequency</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">449</context>
</context-group>
</trans-unit>
<trans-unit id="6424689559488978075" datatype="html">
<source>Activities Count</source>
<target state="translated">活动计数</target>
@ -875,6 +879,14 @@
<context context-type="linenumber">174</context>
</context-group>
</trans-unit>
<trans-unit id="6135731497699355929" datatype="html">
<source>Subscription History</source>
<target state="new">Subscription History</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="3720539089813177542" datatype="html">
<source>Countries Count</source>
<target state="translated">国家数</target>
@ -1040,7 +1052,7 @@
<target state="translated">刮削配置</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">476</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="4388879716045736175" datatype="html">
@ -1260,7 +1272,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">555</context>
<context context-type="linenumber">570</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-platform/admin-platform.component.html</context>
@ -1276,7 +1288,7 @@
<target state="translated">资产概况已保存</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">624</context>
<context context-type="linenumber">645</context>
</context-group>
</trans-unit>
<trans-unit id="7214871309640504920" datatype="html">
@ -1316,7 +1328,7 @@
<target state="translated">当前年份</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
</trans-unit>
<trans-unit id="4343859224042481913" datatype="html">
@ -1456,11 +1468,11 @@
<target state="translated">无法验证表单</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">600</context>
<context context-type="linenumber">621</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">624</context>
</context-group>
</trans-unit>
<trans-unit id="735924103945447056" datatype="html">
@ -1496,7 +1508,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">98</context>
<context context-type="linenumber">106</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/common/src/lib/routes/routes.ts</context>
@ -1712,7 +1724,7 @@
<target state="translated">当前周</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="6005640251215534178" datatype="html">
@ -2196,7 +2208,7 @@
<target state="translated">年初至今</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">212</context>
<context context-type="linenumber">228</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2208,7 +2220,7 @@
<target state="translated">1年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2220,7 +2232,7 @@
<target state="translated">5年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2240,7 +2252,7 @@
<target state="translated">最大限度</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">224</context>
<context context-type="linenumber">240</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -2404,7 +2416,7 @@
<target state="new">Coupon</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">122</context>
<context context-type="linenumber">126</context>
</context-group>
</trans-unit>
<trans-unit id="2826581353496868063" datatype="html">
@ -2420,7 +2432,7 @@
<target state="translated">语言环境</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">514</context>
<context context-type="linenumber">529</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-settings/user-account-settings.html</context>
@ -3004,11 +3016,11 @@
<target state="translated">无法解析抓取器配置</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">551</context>
<context context-type="linenumber">569</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
<context context-type="linenumber">572</context>
</context-group>
</trans-unit>
<trans-unit id="5152858168588361831" datatype="html">
@ -3211,6 +3223,14 @@
<context context-type="linenumber">334</context>
</context-group>
</trans-unit>
<trans-unit id="2047393478951255414" datatype="html">
<source>Creation</source>
<target state="new">Creation</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">140</context>
</context-group>
</trans-unit>
<trans-unit id="803941175683258052" datatype="html">
<source>Holdings</source>
<target state="translated">持仓</target>
@ -3903,14 +3923,6 @@
<context context-type="linenumber">239</context>
</context-group>
</trans-unit>
<trans-unit id="1812379335568847528" datatype="html">
<source>Subscriptions</source>
<target state="new">Subscriptions</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">131</context>
</context-group>
</trans-unit>
<trans-unit id="1817902710689724227" datatype="html">
<source>Import Activities</source>
<target state="translated">导入活动记录</target>
@ -4160,7 +4172,7 @@
<target state="new">Trial</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts</context>
<context context-type="linenumber">121</context>
<context context-type="linenumber">125</context>
</context-group>
</trans-unit>
<trans-unit id="79310201207169632" datatype="html">
@ -4327,14 +4339,6 @@
<context context-type="linenumber">93</context>
</context-group>
</trans-unit>
<trans-unit id="8037476586059399916" datatype="html">
<source>Expires</source>
<target state="new">Expires</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">194</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
<source>Top</source>
<target state="translated">顶部</target>
@ -4471,6 +4475,14 @@
<context context-type="linenumber">26</context>
</context-group>
</trans-unit>
<trans-unit id="2640607428459636406" datatype="html">
<source>Hourly</source>
<target state="new">Hourly</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">214</context>
</context-group>
</trans-unit>
<trans-unit id="2640837868763558546" datatype="html">
<source>Unlimited Transactions</source>
<target state="translated">无限交易</target>
@ -4575,6 +4587,14 @@
<context context-type="linenumber">193</context>
</context-group>
</trans-unit>
<trans-unit id="3323137014509063489" datatype="html">
<source>Expiration</source>
<target state="new">Expiration</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="6463889888921382396" datatype="html">
<source>Email and Chat Support</source>
<target state="translated">电子邮件和聊天支持</target>
@ -4612,11 +4632,11 @@
<target state="translated">无法保存资产概况</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">634</context>
<context context-type="linenumber">655</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">637</context>
<context context-type="linenumber">658</context>
</context-group>
</trans-unit>
<trans-unit id="8289257900569435140" datatype="html">
@ -4757,24 +4777,24 @@
</context-group>
</trans-unit>
<trans-unit id="5100352603258735382" datatype="html">
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">您是否正在寻找开源替代方案<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>?<x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>幽灵作品集<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>是一个强大的投资组合管理工具,为个人提供一个全面的平台来跟踪、分析和优化他们的投资。无论您是经验丰富的投资者还是刚刚起步的投资者,Ghostfolio 都提供直观的用户界面和<x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>广泛的功能<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>帮助您做出明智的决定并掌控您的财务未来。</target>
<source>Are you looking for an open source alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>? <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>Ghostfolio<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> is a powerful portfolio management tool that provides individuals with a comprehensive platform to track, analyze, and optimize their investments. Whether you are an experienced investor or just starting out, Ghostfolio offers an intuitive user interface and a <x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>wide range of functionalities<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> to help you make informed decisions and take control of your financial future.</source>
<target state="translated">您是否正在寻找开源替代方案<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>?<x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkAbout&quot;&gt;"/>幽灵作品集<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>是一个强大的投资组合管理工具,为个人提供一个全面的平台来跟踪、分析和优化他们的投资。无论您是经验丰富的投资者还是刚刚起步的投资者,Ghostfolio 都提供直观的用户界面和<x id="START_LINK_1" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot; &gt;"/>广泛的功能<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>帮助您做出明智的决定并掌控您的财务未来。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">19</context>
</context-group>
</trans-unit>
<trans-unit id="7314014538091101522" datatype="html">
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio 是一款开源软件 (OSS),提供了一种经济高效的替代方案<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>使其特别适合预算紧张的个人,例如<x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>追求财务独立,提前退休(FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> 。通过利用开发者社区和个人理财爱好者的集体努力,Ghostfolio 不断增强其功能、安全性和用户体验。</target>
<source>Ghostfolio is an open source software (OSS), providing a cost-effective alternative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> making it particularly suitable for individuals on a tight budget, such as those <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>pursuing Financial Independence, Retire Early (FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>. By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience.</source>
<target state="translated">Ghostfolio 是一款开源软件 (OSS),提供了一种经济高效的替代方案<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>使其特别适合预算紧张的个人,例如<x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;../en/blog/2023/07/exploring-the-path-to-fire&quot; &gt;"/>追求财务独立,提前退休(FIRE)<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> 。通过利用开发者社区和个人理财爱好者的集体努力,Ghostfolio 不断增强其功能、安全性和用户体验。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">33</context>
</context-group>
</trans-unit>
<trans-unit id="2315631726271602419" datatype="html">
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">让我们更深入地了解 Ghostfolio 与<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>下面的比较表可帮助您全面了解 Ghostfolio 相对于其他产品的定位<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>。我们将探讨功能、数据隐私、定价等各个方面,让您根据个人需求做出明智的选择。</target>
<source>Let’s dive deeper into the detailed Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>. We will explore various aspects such as features, data privacy, pricing, and more, allowing you to make a well-informed choice for your personal requirements.</source>
<target state="translated">让我们更深入地了解 Ghostfolio 与<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>下面的比较表可帮助您全面了解 Ghostfolio 相对于其他产品的定位<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>。我们将探讨功能、数据隐私、定价等各个方面,让您根据个人需求做出明智的选择。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">44</context>
@ -4793,8 +4813,8 @@
</context-group>
</trans-unit>
<trans-unit id="4909535316439940790" datatype="html">
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>比较表</target>
<source>Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table</source>
<target state="translated">Ghostfolio vs<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>比较表</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">55</context>
@ -4957,8 +4977,8 @@
</context-group>
</trans-unit>
<trans-unit id="2192861316878557060" datatype="html">
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2.name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">请注意,在 Ghostfolio 与<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>的比较表中提供的信息基于我们的独立研究和分析。该网站不隶属于<x id="INTERPOLATION" equiv-text="{{ product2.name }}"/>或比较中提到的任何其他产品。随着个人理财工具格局的不断发展,直接从相应的产品页面验证任何具体的细节或变化至关重要。数据需要刷新吗?帮助我们在<x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> 上维护准确的数据。</target>
<source>Please note that the information provided in the Ghostfolio vs <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> comparison table is based on our independent research and analysis. This website is not affiliated with <x id="INTERPOLATION" equiv-text="{{ product2().name }}"/> or any other product mentioned in the comparison. As the landscape of personal finance tools evolves, it is essential to verify any specific details or changes directly from the respective product page. Data needs a refresh? Help us maintain accurate data on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</source>
<target state="translated">请注意,在 Ghostfolio 与<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>的比较表中提供的信息基于我们的独立研究和分析。该网站不隶属于<x id="INTERPOLATION" equiv-text="{{ product2().name }}"/>或比较中提到的任何其他产品。随着个人理财工具格局的不断发展,直接从相应的产品页面验证任何具体的细节或变化至关重要。数据需要刷新吗?帮助我们在<x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot;&gt;"/>GitHub<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> 上维护准确的数据。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">312</context>
@ -4985,7 +5005,7 @@
<target state="translated">全球的</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">60</context>
<context context-type="linenumber">51</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
@ -5957,7 +5977,7 @@
<target state="translated">当前市场价格为</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">749</context>
<context context-type="linenumber">770</context>
</context-group>
</trans-unit>
<trans-unit id="6563391987554512024" datatype="html">
@ -5965,7 +5985,7 @@
<target state="translated">测试</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">573</context>
<context context-type="linenumber">588</context>
</context-group>
</trans-unit>
<trans-unit id="2570446216260149991" datatype="html">
@ -6073,7 +6093,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">92</context>
<context context-type="linenumber">100</context>
</context-group>
</trans-unit>
<trans-unit id="858192247408211331" datatype="html">
@ -6129,7 +6149,7 @@
<target state="translated">本月至今</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6141,7 +6161,7 @@
<target state="translated">本周至今</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context>
<context context-type="linenumber">220</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6181,7 +6201,7 @@
<target state="translated">年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">216</context>
<context context-type="linenumber">232</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
@ -6201,7 +6221,7 @@
<target state="translated">年</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">220</context>
<context context-type="linenumber">236</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
@ -6246,7 +6266,7 @@
<target state="translated">数据收集</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">596</context>
<context context-type="linenumber">611</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-overview/admin-overview.html</context>
@ -6281,6 +6301,14 @@
<context context-type="linenumber">240</context>
</context-group>
</trans-unit>
<trans-unit id="2988589012964101797" datatype="html">
<source>Daily</source>
<target state="new">Daily</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">210</context>
</context-group>
</trans-unit>
<trans-unit id="2998033970178753887" datatype="html">
<source>Oops! It looks like you’re making too many requests. Please slow down a bit.</source>
<target state="translated">哎呀!看来您提出了太多要求。请慢一点。</target>
@ -6510,7 +6538,7 @@
<target state="translated">另类</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">86</context>
<context context-type="linenumber">94</context>
</context-group>
</trans-unit>
<trans-unit id="2818570902941667477" datatype="html">
@ -6518,7 +6546,7 @@
<target state="translated">应用</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">87</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="647668541461749965" datatype="html">
@ -6526,7 +6554,7 @@
<target state="translated">预算管理</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">88</context>
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1274247756500564795" datatype="html">
@ -6586,7 +6614,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">89</context>
<context context-type="linenumber">97</context>
</context-group>
</trans-unit>
<trans-unit id="1284643802050750978" datatype="html">
@ -6602,7 +6630,7 @@
<target state="translated">家族办公室</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">90</context>
<context context-type="linenumber">98</context>
</context-group>
</trans-unit>
<trans-unit id="3178143531053451735" datatype="html">
@ -6610,7 +6638,7 @@
<target state="translated">投资者</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">93</context>
<context context-type="linenumber">101</context>
</context-group>
</trans-unit>
<trans-unit id="6984983607470794786" datatype="html">
@ -6622,7 +6650,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">102</context>
</context-group>
</trans-unit>
<trans-unit id="4852914940817689575" datatype="html">
@ -6634,7 +6662,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">96</context>
<context context-type="linenumber">104</context>
</context-group>
</trans-unit>
<trans-unit id="8440128775129354214" datatype="html">
@ -6642,7 +6670,7 @@
<target state="translated">隐私</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">97</context>
<context context-type="linenumber">105</context>
</context-group>
</trans-unit>
<trans-unit id="5093701986340458388" datatype="html">
@ -6650,7 +6678,7 @@
<target state="translated">软件</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">99</context>
<context context-type="linenumber">107</context>
</context-group>
</trans-unit>
<trans-unit id="2932360890997178383" datatype="html">
@ -6658,7 +6686,7 @@
<target state="translated">工具</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">100</context>
<context context-type="linenumber">108</context>
</context-group>
</trans-unit>
<trans-unit id="2657610384052021428" datatype="html">
@ -6666,7 +6694,7 @@
<target state="translated">用户体验</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">101</context>
<context context-type="linenumber">109</context>
</context-group>
</trans-unit>
<trans-unit id="1099393285611854080" datatype="html">
@ -6674,7 +6702,7 @@
<target state="translated">财富</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">102</context>
<context context-type="linenumber">110</context>
</context-group>
</trans-unit>
<trans-unit id="3311387105238837884" datatype="html">
@ -6682,7 +6710,7 @@
<target state="translated">财富管理</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts</context>
<context context-type="linenumber">103</context>
<context context-type="linenumber">111</context>
</context-group>
</trans-unit>
<trans-unit id="3477953895055172777" datatype="html">
@ -6706,7 +6734,7 @@
<target state="translated">错误</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">740</context>
<context context-type="linenumber">761</context>
</context-group>
</trans-unit>
<trans-unit id="5322473252816589112" datatype="html">
@ -6758,7 +6786,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">601</context>
<context context-type="linenumber">616</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6810,7 +6838,7 @@
<target state="translated">关闭</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">603</context>
<context context-type="linenumber">618</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -6838,7 +6866,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">229</context>
<context context-type="linenumber">234</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
@ -6986,8 +7014,8 @@
</context-group>
</trans-unit>
<trans-unit id="2137905359212133111" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 是开源软件</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 是开源软件</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">139</context>
@ -6998,8 +7026,8 @@
</context-group>
</trans-unit>
<trans-unit id="1056127468546316650" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 不是开源软件</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> is not Open Source Software</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 不是开源软件</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">146</context>
@ -7034,8 +7062,8 @@
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 可以自托管</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 可以自托管</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">178</context>
@ -7054,8 +7082,8 @@
</context-group>
</trans-unit>
<trans-unit id="6979762073619328236" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 无法自托管</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be self-hosted</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 无法自托管</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">185</context>
@ -7066,8 +7094,8 @@
</context-group>
</trans-unit>
<trans-unit id="7900108539442184659" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 可以匿名使用</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> can be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 可以匿名使用</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">217</context>
@ -7078,8 +7106,8 @@
</context-group>
</trans-unit>
<trans-unit id="4605555143173907624" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 无法匿名使用</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> cannot be used anonymously</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 无法匿名使用</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">224</context>
@ -7090,8 +7118,8 @@
</context-group>
</trans-unit>
<trans-unit id="7305671611654052345" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 提供免费计划</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> offers a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 提供免费计划</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">256</context>
@ -7102,8 +7130,8 @@
</context-group>
</trans-unit>
<trans-unit id="3528100267920632809" datatype="html">
<source><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1.name }}"/> 不提供免费计划</target>
<source><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> does not offer a free plan</source>
<target state="translated"><x id="INTERPOLATION" equiv-text="{{ product1().name }}"/> 不提供免费计划</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/resources/personal-finance-tools/product-page.html</context>
<context context-type="linenumber">263</context>
@ -7356,7 +7384,7 @@
<target state="translated">保存</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">612</context>
<context context-type="linenumber">627</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html</context>
@ -7464,7 +7492,7 @@
<target state="translated">延迟</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="6882618704933649036" datatype="html">
@ -7472,7 +7500,7 @@
<target state="translated">即时</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="8214660894894142610" datatype="html">
@ -7480,7 +7508,7 @@
<target state="translated">默认市场价格</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">486</context>
<context context-type="linenumber">501</context>
</context-group>
</trans-unit>
<trans-unit id="1713271461473302108" datatype="html">
@ -7488,7 +7516,7 @@
<target state="translated">模式</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">523</context>
<context context-type="linenumber">538</context>
</context-group>
</trans-unit>
<trans-unit id="3540108566782816830" datatype="html">
@ -7496,7 +7524,7 @@
<target state="translated">选择器</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">539</context>
<context context-type="linenumber">554</context>
</context-group>
</trans-unit>
<trans-unit id="645724892732039501" datatype="html">
@ -7504,7 +7532,7 @@
<target state="translated">HTTP 请求标头</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">499</context>
<context context-type="linenumber">514</context>
</context-group>
</trans-unit>
<trans-unit id="8635324470284879211" datatype="html">
@ -7512,7 +7540,7 @@
<target state="translated">收盘</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">239</context>
<context context-type="linenumber">255</context>
</context-group>
</trans-unit>
<trans-unit id="4547068148181074902" datatype="html">
@ -7520,7 +7548,7 @@
<target state="translated">实时</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">243</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="7109040016560023658" datatype="html">
@ -7721,7 +7749,7 @@
<target state="translated"><x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) 已在使用中。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">681</context>
<context context-type="linenumber">702</context>
</context-group>
</trans-unit>
<trans-unit id="5612909502553004436" datatype="html">
@ -7729,7 +7757,7 @@
<target state="translated">在更新到 <x id="PH" equiv-text="assetProfileIdentifier.symbol"/> (<x id="PH_1" equiv-text="assetProfileIdentifier.dataSource"/>) 时发生错误。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">689</context>
<context context-type="linenumber">710</context>
</context-group>
</trans-unit>
<trans-unit id="4391289919356861627" datatype="html">
@ -8080,7 +8108,7 @@
<target state="translated">当前月份</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">208</context>
<context context-type="linenumber">224</context>
</context-group>
</trans-unit>
<trans-unit id="7387635272539030076" datatype="html">

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

@ -5,11 +5,13 @@ import ms from 'ms';
import { ColorScheme, DateRange } from './types';
export const ghostfolioPrefix = 'GF';
/* @deprecated */
export const ghostfolioScraperApiSymbolPrefix = `_${ghostfolioPrefix}_`;
export const ghostfolioFearAndGreedIndexDataSourceCryptocurrencies =
DataSource.MANUAL;
export const ghostfolioFearAndGreedIndexDataSourceStocks = DataSource.RAPID_API;
export const ghostfolioFearAndGreedIndexSymbol = `${ghostfolioScraperApiSymbolPrefix}FEAR_AND_GREED_INDEX`;
export const ghostfolioFearAndGreedIndexSymbolCryptocurrencies = `${ghostfolioPrefix}_FEAR_AND_GREED_INDEX_CRYPTOCURRENCIES`;
export const ghostfolioFearAndGreedIndexSymbolStocks = `${ghostfolioPrefix}_FEAR_AND_GREED_INDEX_STOCKS`;
@ -88,8 +90,12 @@ export const DEFAULT_PAGE_SIZE = 50;
export const DEFAULT_PORT = 3333;
export const DEFAULT_PROCESSOR_GATHER_ASSET_PROFILE_CONCURRENCY = 1;
export const DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY = 1;
export const DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_TIMEOUT =
ms('1 minute');
export const DEFAULT_PROCESSOR_GATHER_STATISTICS_CONCURRENCY = 1;
export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY = 1;
export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT = 30000;
export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT =
ms('30 seconds');
export const DEFAULT_REDACTED_PATHS = [
'accounts[*].balance',
@ -228,6 +234,7 @@ export const HEADER_KEY_SKIP_INTERCEPTOR = 'X-Skip-Interceptor';
export const MAX_TOP_HOLDINGS = 50;
export const NUMERICAL_PRECISION_THRESHOLD_3_FIGURES = 100;
export const NUMERICAL_PRECISION_THRESHOLD_4_FIGURES = 1000;
export const NUMERICAL_PRECISION_THRESHOLD_5_FIGURES = 10000;
export const NUMERICAL_PRECISION_THRESHOLD_6_FIGURES = 100000;

12
libs/common/src/lib/dtos/update-asset-profile.dto.ts

@ -1,6 +1,12 @@
import { IsCurrencyCode } from '@ghostfolio/common/validators/is-currency-code';
import { AssetClass, AssetSubClass, DataSource, Prisma } from '@prisma/client';
import {
AssetClass,
AssetSubClass,
DataGatheringFrequency,
DataSource,
Prisma
} from '@prisma/client';
import {
IsArray,
IsBoolean,
@ -32,6 +38,10 @@ export class UpdateAssetProfileDto {
@IsOptional()
currency?: string;
@IsEnum(DataGatheringFrequency)
@IsOptional()
dataGatheringFrequency?: DataGatheringFrequency;
@IsEnum(DataSource)
@IsOptional()
dataSource?: DataSource;

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

@ -1,7 +1,6 @@
import { NumberParser } from '@internationalized/number';
import {
Type as ActivityType,
DataSource,
MarketData,
Prisma,
SymbolProfile,
@ -38,7 +37,6 @@ import {
DEFAULT_CURRENCY,
DEFAULT_LOCALE,
DERIVED_CURRENCIES,
ghostfolioFearAndGreedIndexSymbol,
ghostfolioFearAndGreedIndexSymbolCryptocurrencies,
ghostfolioFearAndGreedIndexSymbolStocks,
ghostfolioScraperApiSymbolPrefix
@ -157,7 +155,6 @@ export function canDeleteAssetProfile({
!isBenchmark &&
!isDerivedCurrency(getCurrencyFromSymbol(symbol)) &&
!isRootCurrency(getCurrencyFromSymbol(symbol)) &&
symbol !== ghostfolioFearAndGreedIndexSymbol &&
symbol !== ghostfolioFearAndGreedIndexSymbolCryptocurrencies &&
symbol !== ghostfolioFearAndGreedIndexSymbolStocks &&
watchedByCount === 0
@ -168,14 +165,6 @@ export function capitalize(aString: string) {
return aString.charAt(0).toUpperCase() + aString.slice(1).toLowerCase();
}
export function decodeDataSource(encodedDataSource: string) {
if (encodedDataSource) {
return Buffer.from(encodedDataSource, 'hex').toString();
}
return undefined;
}
export function downloadAsFile({
content,
contentType = 'text/plain',
@ -201,14 +190,6 @@ export function downloadAsFile({
a.click();
}
export function encodeDataSource(aDataSource: DataSource) {
if (aDataSource) {
return Buffer.from(aDataSource, 'utf-8').toString('hex');
}
return undefined;
}
export function extractNumberFromString({
locale = 'en-US',
value

8
libs/common/src/lib/interfaces/enhanced-symbol-profile.interface.ts

@ -1,4 +1,9 @@
import { AssetClass, AssetSubClass, DataSource } from '@prisma/client';
import {
AssetClass,
AssetSubClass,
DataGatheringFrequency,
DataSource
} from '@prisma/client';
import { Country } from './country.interface';
import { DataProviderInfo } from './data-provider-info.interface';
@ -15,6 +20,7 @@ export interface EnhancedSymbolProfile {
createdAt: Date;
currency?: string;
cusip?: string;
dataGatheringFrequency?: DataGatheringFrequency;
dataProviderInfo?: DataProviderInfo;
dataSource: DataSource;
dateOfFirstActivity?: Date;

2
libs/common/src/lib/interfaces/holding.interface.ts

@ -1,5 +1,5 @@
export interface Holding {
allocationInPercentage: number;
name: string;
valueInBaseCurrency: number;
valueInBaseCurrency?: number;
}

4
libs/common/src/lib/interfaces/index.ts

@ -47,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 { AssetProfileResponse } from './responses/asset-profile-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';
@ -67,7 +68,6 @@ import type { HistoricalResponse } from './responses/historical-response.interfa
import type { ImportResponse } from './responses/import-response.interface';
import type { InfoResponse } from './responses/info-response.interface';
import type { LookupResponse } from './responses/lookup-response.interface';
import type { MarketDataDetailsResponse } from './responses/market-data-details-response.interface';
import type { MarketDataOfMarketsResponse } from './responses/market-data-of-markets-response.interface';
import type { OAuthResponse } from './responses/oauth-response.interface';
import type { PlatformsResponse } from './responses/platforms-response.interface';
@ -125,6 +125,7 @@ export {
AssetClassSelectorOption,
AssetProfileIdentifier,
AssetProfileItem,
AssetProfileResponse,
AssetProfilesResponse,
AssetResponse,
AttestationCredentialJSON,
@ -160,7 +161,6 @@ export {
LookupItem,
LookupResponse,
MarketData,
MarketDataDetailsResponse,
MarketDataOfMarketsResponse,
NullableLineChartItem,
OAuthResponse,

2
libs/common/src/lib/interfaces/responses/market-data-details-response.interface.ts → libs/common/src/lib/interfaces/responses/asset-profile-response.interface.ts

@ -2,7 +2,7 @@ import { MarketData } from '@prisma/client';
import { EnhancedSymbolProfile } from '../enhanced-symbol-profile.interface';
export interface MarketDataDetailsResponse {
export interface AssetProfileResponse {
assetProfile: Partial<EnhancedSymbolProfile>;
marketData: MarketData[];
}

13
libs/common/src/lib/interfaces/responses/export-response.interface.ts

@ -1,13 +1,7 @@
import {
Account,
DataSource,
Order,
Platform,
SymbolProfile,
Tag
} from '@prisma/client';
import { Account, Order, Platform, SymbolProfile, Tag } from '@prisma/client';
import { AccountBalance } from '../account-balance.interface';
import { AssetProfileIdentifier } from '../asset-profile-identifier.interface';
import { MarketData } from '../market-data.interface';
import { UserSettings } from '../user-settings.interface';
@ -24,10 +18,11 @@ export interface ExportResponse {
| 'symbolProfileId'
| 'updatedAt'
| 'userId'
> & { dataSource: DataSource; date: string; symbol: string })[];
> & { date: string } & AssetProfileIdentifier)[];
assetProfiles: (Omit<
SymbolProfile,
| 'createdAt'
| 'dataGatheringFrequency'
| 'id'
| 'scraperConfiguration'
| 'symbolMapping'

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

@ -44,10 +44,6 @@ export interface PortfolioHoldingResponse {
netPerformanceWithCurrencyEffect: number;
performances: Benchmark['performances'];
quantity: number;
/* @deprecated */
SymbolProfile: EnhancedSymbolProfile;
tags: Tag[];
value: number;
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save