diff --git a/.github/workflows/extract-locales.yml b/.github/workflows/extract-locales.yml index c17eac5b6..b8b79b946 100644 --- a/.github/workflows/extract-locales.yml +++ b/.github/workflows/extract-locales.yml @@ -33,8 +33,8 @@ jobs: uses: peter-evans/create-pull-request@v7 with: author: 'github-actions[bot] ' - branch: 'feature/update-locales' + branch: 'task/update-locales' commit-message: 'Update locales' delete-branch: true - title: 'Feature/update locales' + title: 'Task/update locales' token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fde9874a2..68abade5f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,8 +1,8 @@ { "recommendations": [ "angular.ng-template", + "esbenp.prettier-vscode", "firsttris.vscode-jest-runner", - "nrwl.angular-console", - "prettier.prettier-vscode" + "nrwl.angular-console" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 36091af85..9bf4d12b5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - "editor.defaultFormatter": "prettier.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true } diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eac30a5c..edbfa5460 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,20 +7,196 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Changed + +- Upgraded `twitter-api-v2` from version `1.27.0` to `1.29.0` + +## 2.237.0 - 2026-02-08 + +### Changed + +- Removed the deprecated `transactionCount` in the portfolio calculator and service +- Refreshed the cryptocurrencies list +- Upgraded `Nx` from version `22.4.1` to `22.4.5` + +### Fixed + +- Fixed the accounts of the assistant for the impersonation mode +- Fixed the tags of the assistant for the impersonation mode + +## 2.236.0 - 2026-02-05 + +### Changed + +- Removed the deprecated `transactionCount` in the endpoint `GET api/v1/admin` +- Upgraded `stripe` from version `20.1.0` to `20.3.0` + +### Fixed + +- Fixed an exception when fetching the top holdings for ETF and mutual fund assets from _Yahoo Finance_ + +## 2.235.0 - 2026-02-03 + +### Added + +- Added the ability to fetch top holdings for ETF and mutual fund assets from _Yahoo Finance_ +- Added support for the impersonation mode in the endpoint `GET api/v1/account/:id/balances` +- Added an action menu to the user detail dialog in the users section of the admin control panel + +### Changed + +- Optimized the value redaction interceptor for the impersonation mode by introducing `fast-redact` +- Refactored `showTransactions` in favor of `showActivitiesCount` in the accounts table component +- Refactored `transactionCount` in favor of `activitiesCount` in the accounts table component +- Deprecated `transactionCount` in favor of `activitiesCount` in the endpoint `GET api/v1/admin` +- Removed the deprecated `firstBuyDate` in the portfolio calculator +- Upgraded `yahoo-finance2` from version `3.11.2` to `3.13.0` + +## 2.234.0 - 2026-01-30 + +### Changed + +- Improved the usability of the create asset profile dialog in the market data section of the admin control panel +- Improved the language localization for Chinese (`zh`) +- Improved the language localization for German (`de`) +- Improved the language localization for Spanish (`es`) +- Upgraded `angular` from version `21.0.6` to `21.1.1` +- Upgraded `lodash` from version `4.17.21` to `4.17.23` +- Upgraded `Nx` from version `22.3.3` to `22.4.1` +- Upgraded `prettier` from version `3.8.0` to `3.8.1` + +## 2.233.0 - 2026-01-23 + +### Changed + +- Deprecated `firstBuyDate` in favor of `dateOfFirstActivity` in the portfolio calculator +- Deprecated `transactionCount` in favor of `activitiesCount` in the portfolio calculator and service +- Removed the deprecated `firstBuyDate` from the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Refreshed the cryptocurrencies list +- Upgraded `prettier` from version `3.7.4` to `3.8.0` + +## 2.232.0 - 2026-01-19 + +### Added + +- Extended the analysis page to include the total amount, change and performance with currency effects (experimental) + +### Changed + +- Deprecated `firstBuyDate` in favor of `dateOfFirstActivity` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Improved the language localization for German (`de`) +- Upgraded `countries-list` from version `3.2.0` to `3.2.2` + +## 2.231.0 - 2026-01-17 + +### Changed + +- Removed the deprecated platforms from the info service +- Removed the deprecated activities from the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` + +### Fixed + +- Fixed a numeric parsing error related to cash positions on the _X-ray_ page +- Fixed the total fee calculation in the holding detail dialog related to activities in a custom currency +- Fixed the total fee calculation in the summary related to activities in a custom currency + +## 2.230.0 - 2026-01-14 + +### Added + +- Set up the language localization for Korean (`ko`) + +### Changed + +- Restored the support for specific calendar year date ranges (`2024`, `2023`, `2022`, etc.) in the holdings table (experimental) + +### Fixed + +- Fixed the total fee calculation in the holding detail dialog related to activities in a custom currency +- Fixed the total fee calculation in the summary related to activities in a custom currency + +## 2.229.0 - 2026-01-11 + +### Changed + +- Set the active sort column in the accounts table component +- Deprecated `activities` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Moved the admin service to `@ghostfolio/ui/services` +- Moved the data service to `@ghostfolio/ui/services` +- Refactored the dividend import +- Refreshed the cryptocurrencies list + +### Fixed + +- Fixed the net worth calculation to prevent the double counting of cash positions +- Fixed the filtering by asset class in the endpoint `GET api/v1/portfolio/holdings` +- Fixed the case-insensitive sorting in the accounts table component +- Fixed the case-insensitive sorting in the benchmark component +- Fixed the case-insensitive sorting in the holdings table component + +## 2.228.0 - 2026-01-03 + +### Added + +- Extended the portfolio holdings to include performance with currency effects for cash positions + +### Changed + +- Integrated the endpoint to get all platforms (`GET api/v1/platforms`) into the create or update account dialog +- Extracted the scraper configuration to a dedicated tab in the asset profile details dialog of the admin control panel +- Improved the language localization for German (`de`) +- Upgraded `@date-fns/utc` from version `2.1.0` to `2.1.1` + +### Fixed + +- Improved the table headers’ alignment of the accounts table on mobile + +## 2.227.0 - 2026-01-02 + +### Changed + +- Initialized the input properties in the _FIRE_ calculator +- Removed the deprecated public _Stripe_ key +- Upgraded `stripe` from version `18.5.0` to `20.1.0` + +### Fixed + +- Fixed the import of `jsonpath` to support REST APIs (`JSON`) via the scraper configuration + +## 2.226.0 - 2026-01-01 + +### Added + +- Extended the content of the _Self-Hosting_ section by information about additional data providers on the Frequently Asked Questions (FAQ) page + +### Changed + +- Upgraded `class-validator` from version `0.14.2` to `0.14.3` +- Upgraded `yahoo-finance2` from version `3.10.2` to `3.11.2` + +## 2.225.0 - 2025-12-31 + ### Added - Added a new endpoint to get all platforms (`GET api/v1/platforms`) +- Added the session url to the endpoint response of the _Stripe_ checkout ### Changed - Improved the routing of the user detail dialog in the users section of the admin control panel - Lifted the asset profile identifier editing restriction for `MANUAL` data sources in the asset profile details dialog of the admin control panel +- Deprecated the public _Stripe_ key - Improved the language localization for German (`de`) -- Upgraded `angular` from version `20.2.4` to `20.3.9` +- Eliminated `ngx-stripe` +- Upgraded `angular` from version `20.2.4` to `21.0.6` +- Upgraded `marked` from version `15.0.4` to `17.0.1` +- Upgraded `ngx-device-detector` from version `10.1.0` to `11.0.0` - Upgraded `ng-extract-i18n-merge` from `3.1.0` to `3.2.1` -- Upgraded `Nx` from version `21.5.1` to `22.1.3` +- Upgraded `ngx-markdown` from version `20.0.0` to `21.0.1` +- Upgraded `Nx` from version `21.5.1` to `22.3.3` - Upgraded `shx` from version `0.3.4` to `0.4.0` - Upgraded `storybook` from version `9.1.5` to `10.1.10` +- Upgraded `zone.js` from version `0.15.1` to `0.16.0` ### Fixed diff --git a/README.md b/README.md index 822825b57..3be15e49f 100644 --- a/README.md +++ b/README.md @@ -85,31 +85,32 @@ We provide official container images hosted on [Docker Hub](https://hub.docker.c ### Supported Environment Variables -| Name | Type | Default Value | Description | -| ------------------------ | --------------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -| `ACCESS_TOKEN_SALT` | `string` | | A random string used as salt for access tokens | -| `API_KEY_COINGECKO_DEMO` | `string` (optional) |   | The _CoinGecko_ Demo API key | -| `API_KEY_COINGECKO_PRO` | `string` (optional) | | The _CoinGecko_ Pro API key | -| `DATABASE_URL` | `string` | | The database connection URL, e.g. `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?sslmode=prefer` | -| `HOST` | `string` (optional) | `0.0.0.0` | The host where the Ghostfolio application will run on | -| `JWT_SECRET_KEY` | `string` | | A random string used for _JSON Web Tokens_ (JWT) | -| `LOG_LEVELS` | `string[]` (optional) | | The logging levels for the Ghostfolio application, e.g. `["debug","error","log","warn"]` | -| `PORT` | `number` (optional) | `3333` | The port where the Ghostfolio application will run on | -| `POSTGRES_DB` | `string` | | The name of the _PostgreSQL_ database | -| `POSTGRES_PASSWORD` | `string` | | The password of the _PostgreSQL_ database | -| `POSTGRES_USER` | `string` | | The user of the _PostgreSQL_ database | -| `REDIS_DB` | `number` (optional) | `0` | The database index of _Redis_ | -| `REDIS_HOST` | `string` | | The host where _Redis_ is running | -| `REDIS_PASSWORD` | `string` | | The password of _Redis_ | -| `REDIS_PORT` | `number` | | The port where _Redis_ is running | -| `REQUEST_TIMEOUT` | `number` (optional) | `2000` | The timeout of network requests to data providers in milliseconds | -| `ROOT_URL` | `string` (optional) | `http://0.0.0.0:3333` | The root URL of the Ghostfolio application, used for generating callback URLs and external links. | +| Name | Type | Default Value | Description | +| --------------------------- | --------------------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| `ACCESS_TOKEN_SALT` | `string` | | A random string used as salt for access tokens | +| `API_KEY_COINGECKO_DEMO` | `string` (optional) |   | The _CoinGecko_ Demo API key | +| `API_KEY_COINGECKO_PRO` | `string` (optional) | | The _CoinGecko_ Pro API key | +| `DATABASE_URL` | `string` | | The database connection URL, e.g. `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?sslmode=prefer` | +| `ENABLE_FEATURE_AUTH_TOKEN` | `boolean` (optional) | `true` | Enables authentication via security token | +| `HOST` | `string` (optional) | `0.0.0.0` | The host where the Ghostfolio application will run on | +| `JWT_SECRET_KEY` | `string` | | A random string used for _JSON Web Tokens_ (JWT) | +| `LOG_LEVELS` | `string[]` (optional) | | The logging levels for the Ghostfolio application, e.g. `["debug","error","log","warn"]` | +| `PORT` | `number` (optional) | `3333` | The port where the Ghostfolio application will run on | +| `POSTGRES_DB` | `string` | | The name of the _PostgreSQL_ database | +| `POSTGRES_PASSWORD` | `string` | | The password of the _PostgreSQL_ database | +| `POSTGRES_USER` | `string` | | The user of the _PostgreSQL_ database | +| `REDIS_DB` | `number` (optional) | `0` | The database index of _Redis_ | +| `REDIS_HOST` | `string` | | The host where _Redis_ is running | +| `REDIS_PASSWORD` | `string` | | The password of _Redis_ | +| `REDIS_PORT` | `number` | | The port where _Redis_ is running | +| `REQUEST_TIMEOUT` | `number` (optional) | `2000` | The timeout of network requests to data providers in milliseconds | +| `ROOT_URL` | `string` (optional) | `http://0.0.0.0:3333` | The root URL of the Ghostfolio application, used for generating callback URLs and external links. | #### OpenID Connect OIDC (Experimental) | Name | Type | Default Value | Description | | -------------------------- | --------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------- | -| `ENABLE_FEATURE_AUTH_OIDC` | `boolean` (optional) | `false` | Enables _OpenID Connect_ authentication | +| `ENABLE_FEATURE_AUTH_OIDC` | `boolean` (optional) | `false` | Enables authentication via _OpenID Connect_ | | `OIDC_AUTHORIZATION_URL` | `string` (optional) | | Manual override for the OIDC authorization endpoint (falls back to the discovery from the issuer) | | `OIDC_CALLBACK_URL` | `string` (optional) | `${ROOT_URL}/api/auth/oidc/callback` | The OIDC callback URL | | `OIDC_CLIENT_ID` | `string` | | The OIDC client ID | @@ -241,7 +242,7 @@ Deprecated: `GET http://localhost:3333/api/v1/auth/anonymous/ -

- Browser testing via
- - LambdaTest Logo - -

+ + TestMu AI Logo + ## Analytics @@ -331,6 +329,8 @@ If you like to support this project, become a [**Sponsor**](https://github.com/s ## License -© 2021 - 2025 [Ghostfolio](https://ghostfol.io) +© 2021 - 2026 [Ghostfolio](https://ghostfol.io) Licensed under the [AGPLv3 License](https://www.gnu.org/licenses/agpl-3.0.html). + +[^1]: Available with [**Ghostfolio Premium**](https://ghostfol.io/en/pricing). diff --git a/apps/api/src/app/account/account.controller.ts b/apps/api/src/app/account/account.controller.ts index 542b199fd..052720176 100644 --- a/apps/api/src/app/account/account.controller.ts +++ b/apps/api/src/app/account/account.controller.ts @@ -132,12 +132,16 @@ export class AccountController { @UseGuards(AuthGuard('jwt'), HasPermissionGuard) @UseInterceptors(RedactValuesInResponseInterceptor) public async getAccountBalancesById( + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Param('id') id: string ): Promise { + const impersonationUserId = + await this.impersonationService.validateImpersonationId(impersonationId); + return this.accountBalanceService.getAccountBalances({ filters: [{ id, type: 'ACCOUNT' }], userCurrency: this.request.user.settings.settings.baseCurrency, - userId: this.request.user.id + userId: impersonationUserId || this.request.user.id }); } diff --git a/apps/api/src/app/account/account.service.ts b/apps/api/src/app/account/account.service.ts index 398a89bb9..e1b01a6ed 100644 --- a/apps/api/src/app/account/account.service.ts +++ b/apps/api/src/app/account/account.service.ts @@ -150,15 +150,15 @@ export class AccountService { }); return accounts.map((account) => { - let transactionCount = 0; + let activitiesCount = 0; for (const { isDraft } of account.activities) { if (!isDraft) { - transactionCount += 1; + activitiesCount += 1; } } - const result = { ...account, transactionCount }; + const result = { ...account, activitiesCount }; delete result.activities; diff --git a/apps/api/src/app/admin/admin.service.ts b/apps/api/src/app/admin/admin.service.ts index 47c8ffd1d..792b0e567 100644 --- a/apps/api/src/app/admin/admin.service.ts +++ b/apps/api/src/app/admin/admin.service.ts @@ -138,11 +138,11 @@ export class AdminService { public async get(): Promise { const dataSources = Object.values(DataSource); - const [enabledDataSources, settings, transactionCount, userCount] = + const [activitiesCount, enabledDataSources, settings, userCount] = await Promise.all([ + this.prismaService.order.count(), this.dataProviderService.getDataSources(), this.propertyService.get(), - this.prismaService.order.count(), this.countUsersWithAnalytics() ]); @@ -182,9 +182,9 @@ export class AdminService { ).filter(Boolean); return { + activitiesCount, dataProviders, settings, - transactionCount, userCount, version: environment.version }; diff --git a/apps/api/src/app/endpoints/market-data/market-data.controller.ts b/apps/api/src/app/endpoints/market-data/market-data.controller.ts index 987d34918..0dae82d2c 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.controller.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.controller.ts @@ -2,6 +2,8 @@ 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 { @@ -28,7 +30,8 @@ import { Param, Post, Query, - UseGuards + UseGuards, + UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; @@ -86,6 +89,8 @@ export class MarketDataController { @Get(':dataSource/:symbol') @UseGuards(AuthGuard('jwt')) + @UseInterceptors(TransformDataSourceInRequestInterceptor) + @UseInterceptors(TransformDataSourceInResponseInterceptor) public async getMarketDataBySymbol( @Param('dataSource') dataSource: DataSource, @Param('symbol') symbol: string diff --git a/apps/api/src/app/endpoints/market-data/market-data.module.ts b/apps/api/src/app/endpoints/market-data/market-data.module.ts index a8b355de3..d5d64673d 100644 --- a/apps/api/src/app/endpoints/market-data/market-data.module.ts +++ b/apps/api/src/app/endpoints/market-data/market-data.module.ts @@ -1,5 +1,7 @@ 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'; @@ -13,7 +15,9 @@ import { MarketDataController } from './market-data.controller'; AdminModule, MarketDataServiceModule, SymbolModule, - SymbolProfileModule + SymbolProfileModule, + TransformDataSourceInRequestModule, + TransformDataSourceInResponseModule ] }) export class MarketDataModule {} diff --git a/apps/api/src/app/endpoints/platforms/platforms.controller.ts b/apps/api/src/app/endpoints/platforms/platforms.controller.ts index 46303a3f8..92ba77297 100644 --- a/apps/api/src/app/endpoints/platforms/platforms.controller.ts +++ b/apps/api/src/app/endpoints/platforms/platforms.controller.ts @@ -15,7 +15,9 @@ export class PlatformsController { @HasPermission(permissions.readPlatforms) @UseGuards(AuthGuard('jwt'), HasPermissionGuard) public async getPlatforms(): Promise { - const platforms = await this.platformService.getPlatforms(); + const platforms = await this.platformService.getPlatforms({ + orderBy: { name: 'asc' } + }); return { platforms }; } diff --git a/apps/api/src/app/import/import.controller.ts b/apps/api/src/app/import/import.controller.ts index 2681444df..81481fd65 100644 --- a/apps/api/src/app/import/import.controller.ts +++ b/apps/api/src/app/import/import.controller.ts @@ -103,6 +103,7 @@ export class ImportController { const activities = await this.importService.getDividends({ dataSource, symbol, + userCurrency: this.request.user.settings.settings.baseCurrency, userId: this.request.user.id }); diff --git a/apps/api/src/app/import/import.module.ts b/apps/api/src/app/import/import.module.ts index 88990af2e..a4a13f941 100644 --- a/apps/api/src/app/import/import.module.ts +++ b/apps/api/src/app/import/import.module.ts @@ -6,6 +6,7 @@ import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module' import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.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 { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.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'; @@ -24,6 +25,7 @@ import { ImportService } from './import.service'; controllers: [ImportController], imports: [ AccountModule, + ApiModule, CacheModule, ConfigurationModule, DataGatheringModule, diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 2deef1c44..7e8e333b9 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -2,6 +2,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; +import { ApiService } from '@ghostfolio/api/services/api/api.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; @@ -25,7 +26,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { - AccountWithPlatform, + AccountWithValue, OrderWithAccount, UserWithSettings } from '@ghostfolio/common/types'; @@ -43,6 +44,7 @@ import { ImportDataDto } from './import-data.dto'; export class ImportService { public constructor( private readonly accountService: AccountService, + private readonly apiService: ApiService, private readonly configurationService: ConfigurationService, private readonly dataGatheringService: DataGatheringService, private readonly dataProviderService: DataProviderService, @@ -57,8 +59,12 @@ export class ImportService { public async getDividends({ dataSource, symbol, + userCurrency, userId - }: AssetProfileIdentifier & { userId: string }): Promise { + }: AssetProfileIdentifier & { + userCurrency: string; + userId: string; + }): Promise { try { const holding = await this.portfolioService.getHolding({ dataSource, @@ -71,36 +77,45 @@ export class ImportService { return []; } - const { activities, firstBuyDate, historicalData } = holding; + const filters = this.apiService.buildFiltersFromQueryParams({ + filterByDataSource: dataSource, + filterBySymbol: symbol + }); - const [[assetProfile], dividends] = await Promise.all([ - this.symbolProfileService.getSymbolProfiles([ - { - dataSource, - symbol - } - ]), - await this.dataProviderService.getDividends({ - dataSource, - symbol, - from: parseDate(firstBuyDate), - granularity: 'day', - to: new Date() - }) - ]); + const { dateOfFirstActivity, historicalData } = holding; - const accounts = activities - .filter(({ account }) => { - return !!account; - }) - .map(({ account }) => { - return account; - }); + const [{ accounts }, { activities }, [assetProfile], dividends] = + await Promise.all([ + this.portfolioService.getAccountsWithAggregations({ + filters, + userId, + withExcludedAccounts: true + }), + this.orderService.getOrders({ + filters, + userCurrency, + userId, + startDate: parseDate(dateOfFirstActivity) + }), + this.symbolProfileService.getSymbolProfiles([ + { + dataSource, + symbol + } + ]), + await this.dataProviderService.getDividends({ + dataSource, + symbol, + from: parseDate(dateOfFirstActivity), + granularity: 'day', + to: new Date() + }) + ]); const account = this.isUniqueAccount(accounts) ? accounts[0] : undefined; return await Promise.all( - Object.entries(dividends).map(async ([dateString, { marketPrice }]) => { + Object.entries(dividends).map(([dateString, { marketPrice }]) => { const quantity = historicalData.find((historicalDataItem) => { return historicalDataItem.date === dateString; @@ -695,11 +710,11 @@ export class ImportService { ); } - private isUniqueAccount(accounts: AccountWithPlatform[]) { + private isUniqueAccount(accounts: AccountWithValue[]) { const uniqueAccountIds = new Set(); - for (const account of accounts) { - uniqueAccountIds.add(account.id); + for (const { id } of accounts) { + uniqueAccountIds.add(id); } return uniqueAccountIds.size === 1; diff --git a/apps/api/src/app/info/info.service.ts b/apps/api/src/app/info/info.service.ts index 3802e3ef4..9b4a4d597 100644 --- a/apps/api/src/app/info/info.service.ts +++ b/apps/api/src/app/info/info.service.ts @@ -1,4 +1,3 @@ -import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; 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'; @@ -38,7 +37,6 @@ export class InfoService { private readonly configurationService: ConfigurationService, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly jwtService: JwtService, - private readonly platformService: PlatformService, private readonly propertyService: PropertyService, private readonly redisCacheService: RedisCacheService, private readonly subscriptionService: SubscriptionService, @@ -93,7 +91,6 @@ export class InfoService { (await this.propertyService.getByKey( PROPERTY_COUNTRIES_OF_SUBSCRIBERS )) ?? []; - info.stripePublicKey = this.configurationService.get('STRIPE_PUBLIC_KEY'); } if (this.configurationService.get('ENABLE_FEATURE_SYSTEM_MESSAGE')) { @@ -104,16 +101,12 @@ export class InfoService { benchmarks, demoAuthToken, isUserSignupEnabled, - platforms, statistics, subscriptionOffer ] = await Promise.all([ this.benchmarkService.getBenchmarkAssetProfiles(), this.getDemoAuthToken(), this.propertyService.isUserSignupEnabled(), - this.platformService.getPlatforms({ - orderBy: { name: 'asc' } - }), this.getStatistics(), this.subscriptionService.getSubscriptionOffer({ key: 'default' }) ]); @@ -128,7 +121,6 @@ export class InfoService { demoAuthToken, globalPermissions, isReadOnlyMode, - platforms, statistics, subscriptionOffer, baseCurrency: DEFAULT_CURRENCY, diff --git a/apps/api/src/app/order/order.service.ts b/apps/api/src/app/order/order.service.ts index 001d43b7a..9a4f1e46b 100644 --- a/apps/api/src/app/order/order.service.ts +++ b/apps/api/src/app/order/order.service.ts @@ -1,7 +1,10 @@ +import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service'; +import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; import { AssetProfileChangedEvent } from '@ghostfolio/api/events/asset-profile-changed.event'; import { PortfolioChangedEvent } from '@ghostfolio/api/events/portfolio-changed.event'; import { LogPerformance } from '@ghostfolio/api/interceptors/performance-logging/performance-logging.interceptor'; +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { DataGatheringService } from '@ghostfolio/api/services/queues/data-gathering/data-gathering.service'; @@ -16,6 +19,7 @@ import { import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { ActivitiesResponse, + Activity, AssetProfileIdentifier, EnhancedSymbolProfile, Filter @@ -42,8 +46,10 @@ import { randomUUID } from 'node:crypto'; @Injectable() export class OrderService { public constructor( + private readonly accountBalanceService: AccountBalanceService, private readonly accountService: AccountService, private readonly dataGatheringService: DataGatheringService, + private readonly dataProviderService: DataProviderService, private readonly eventEmitter: EventEmitter2, private readonly exchangeRateDataService: ExchangeRateDataService, private readonly prismaService: PrismaService, @@ -317,6 +323,131 @@ export class OrderService { return count; } + /** + * Generates synthetic orders for cash holdings based on account balance history. + * Treat currencies as assets with a fixed unit price of 1.0 (in their own currency) to allow + * performance tracking based on exchange rate fluctuations. + * + * @param cashDetails - The cash balance details. + * @param filters - Optional filters to apply. + * @param userCurrency - The base currency of the user. + * @param userId - The ID of the user. + * @returns A response containing the list of synthetic cash activities. + */ + public async getCashOrders({ + cashDetails, + filters = [], + userCurrency, + userId + }: { + cashDetails: CashDetails; + filters?: Filter[]; + userCurrency: string; + userId: string; + }): Promise { + const filtersByAssetClass = filters.filter(({ type }) => { + return type === 'ASSET_CLASS'; + }); + + if ( + filtersByAssetClass.length > 0 && + !filtersByAssetClass.find(({ id }) => { + return id === AssetClass.LIQUIDITY; + }) + ) { + // If asset class filters are present and none of them is liquidity, return an empty response + return { + activities: [], + count: 0 + }; + } + + const activities: Activity[] = []; + + for (const account of cashDetails.accounts) { + const { balances } = await this.accountBalanceService.getAccountBalances({ + userCurrency, + userId, + filters: [{ id: account.id, type: 'ACCOUNT' }] + }); + + let currentBalance = 0; + let currentBalanceInBaseCurrency = 0; + + for (const balanceItem of balances) { + const syntheticActivityTemplate: Activity = { + userId, + accountId: account.id, + accountUserId: account.userId, + comment: account.name, + createdAt: new Date(balanceItem.date), + currency: account.currency, + date: new Date(balanceItem.date), + fee: 0, + feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, + id: balanceItem.id, + isDraft: false, + quantity: 1, + SymbolProfile: { + activitiesCount: 0, + assetClass: AssetClass.LIQUIDITY, + assetSubClass: AssetSubClass.CASH, + countries: [], + createdAt: new Date(balanceItem.date), + currency: account.currency, + dataSource: + this.dataProviderService.getDataSourceForExchangeRates(), + holdings: [], + id: account.currency, + isActive: true, + name: account.currency, + sectors: [], + symbol: account.currency, + updatedAt: new Date(balanceItem.date) + }, + symbolProfileId: account.currency, + type: ActivityType.BUY, + unitPrice: 1, + unitPriceInAssetProfileCurrency: 1, + updatedAt: new Date(balanceItem.date), + valueInBaseCurrency: 0, + value: 0 + }; + + if (currentBalance < balanceItem.value) { + // BUY + activities.push({ + ...syntheticActivityTemplate, + quantity: balanceItem.value - currentBalance, + type: ActivityType.BUY, + value: balanceItem.value - currentBalance, + valueInBaseCurrency: + balanceItem.valueInBaseCurrency - currentBalanceInBaseCurrency + }); + } else if (currentBalance > balanceItem.value) { + // SELL + activities.push({ + ...syntheticActivityTemplate, + quantity: currentBalance - balanceItem.value, + type: ActivityType.SELL, + value: currentBalance - balanceItem.value, + valueInBaseCurrency: + currentBalanceInBaseCurrency - balanceItem.valueInBaseCurrency + }); + } + + currentBalance = balanceItem.value; + currentBalanceInBaseCurrency = balanceItem.valueInBaseCurrency; + } + } + + return { + activities, + count: activities.length + }; + } + public async getLatestOrder({ dataSource, symbol }: AssetProfileIdentifier) { return this.prismaService.order.findFirst({ orderBy: { @@ -610,22 +741,52 @@ export class OrderService { return { activities, count }; } + /** + * Retrieves all orders required for the portfolio calculator, including both standard asset orders + * and optional synthetic orders representing cash activities. + */ @LogPerformance public async getOrdersForPortfolioCalculator({ filters, userCurrency, - userId + userId, + withCash = false }: { + /** Optional filters to apply to the orders. */ filters?: Filter[]; + /** The base currency of the user. */ userCurrency: string; + /** The ID of the user. */ userId: string; + /** Whether to include cash activities in the result. */ + withCash?: boolean; }) { - return this.getOrders({ + const orders = await this.getOrders({ filters, userCurrency, userId, withExcludedAccountsAndActivities: false // TODO }); + + if (withCash) { + const cashDetails = await this.accountService.getCashDetails({ + filters, + userId, + currency: userCurrency + }); + + const cashOrders = await this.getCashOrders({ + cashDetails, + filters, + userCurrency, + userId + }); + + orders.activities.push(...cashOrders.activities); + orders.count += cashOrders.count; + } + + return orders; } public async getStatisticsByCurrency( diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index ee4219b58..2e58a4ef5 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -39,6 +39,7 @@ import { GroupBy } from '@ghostfolio/common/types'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { Logger } from '@nestjs/common'; +import { AssetSubClass } from '@prisma/client'; import { Big } from 'big.js'; import { plainToClass } from 'class-transformer'; import { @@ -119,6 +120,7 @@ export abstract class PortfolioCalculator { ({ date, feeInAssetProfileCurrency, + feeInBaseCurrency, quantity, SymbolProfile, tags = [], @@ -141,6 +143,7 @@ export abstract class PortfolioCalculator { type, date: format(date, DATE_FORMAT), fee: new Big(feeInAssetProfileCurrency), + feeInBaseCurrency: new Big(feeInBaseCurrency), quantity: new Big(quantity), unitPrice: new Big(unitPriceInAssetProfileCurrency) }; @@ -203,13 +206,19 @@ export abstract class PortfolioCalculator { let totalInterestWithCurrencyEffect = new Big(0); let totalLiabilitiesWithCurrencyEffect = new Big(0); - for (const { currency, dataSource, symbol } of transactionPoints[ - firstIndex - 1 - ].items) { - dataGatheringItems.push({ - dataSource, - symbol - }); + for (const { + assetSubClass, + currency, + dataSource, + symbol + } of transactionPoints[firstIndex - 1].items) { + // Gather data for all assets except CASH + if (assetSubClass !== 'CASH') { + dataGatheringItems.push({ + dataSource, + symbol + }); + } currencies[symbol] = currency; } @@ -329,12 +338,6 @@ export abstract class PortfolioCalculator { } = {}; for (const item of lastTransactionPoint.items) { - const feeInBaseCurrency = item.fee.mul( - exchangeRatesByCurrency[`${item.currency}${this.currency}`]?.[ - lastTransactionPoint.date - ] ?? 1 - ); - const marketPriceInBaseCurrency = ( marketSymbolMap[endDateString]?.[item.symbol] ?? item.averagePrice ).mul( @@ -383,29 +386,36 @@ export abstract class PortfolioCalculator { hasAnySymbolMetricsErrors = hasAnySymbolMetricsErrors || hasErrors; - valuesBySymbol[item.symbol] = { - currentValues, - currentValuesWithCurrencyEffect, - investmentValuesAccumulated, - investmentValuesAccumulatedWithCurrencyEffect, - investmentValuesWithCurrencyEffect, - netPerformanceValues, - netPerformanceValuesWithCurrencyEffect, - timeWeightedInvestmentValues, - timeWeightedInvestmentValuesWithCurrencyEffect - }; + const includeInTotalAssetValue = + item.assetSubClass !== AssetSubClass.CASH; + + if (includeInTotalAssetValue) { + valuesBySymbol[item.symbol] = { + currentValues, + currentValuesWithCurrencyEffect, + investmentValuesAccumulated, + investmentValuesAccumulatedWithCurrencyEffect, + investmentValuesWithCurrencyEffect, + netPerformanceValues, + netPerformanceValuesWithCurrencyEffect, + timeWeightedInvestmentValues, + timeWeightedInvestmentValuesWithCurrencyEffect + }; + } positions.push({ - feeInBaseCurrency, + includeInTotalAssetValue, timeWeightedInvestment, timeWeightedInvestmentWithCurrencyEffect, - dividend: totalDividend, - dividendInBaseCurrency: totalDividendInBaseCurrency, + activitiesCount: item.activitiesCount, averagePrice: item.averagePrice, currency: item.currency, dataSource: item.dataSource, + dateOfFirstActivity: item.dateOfFirstActivity, + dividend: totalDividend, + dividendInBaseCurrency: totalDividendInBaseCurrency, fee: item.fee, - firstBuyDate: item.firstBuyDate, + feeInBaseCurrency: item.feeInBaseCurrency, grossPerformance: !hasErrors ? (grossPerformance ?? null) : null, grossPerformancePercentage: !hasErrors ? (grossPerformancePercentage ?? null) @@ -420,9 +430,8 @@ export abstract class PortfolioCalculator { investment: totalInvestment, investmentWithCurrencyEffect: totalInvestmentWithCurrencyEffect, marketPrice: - marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? null, - marketPriceInBaseCurrency: - marketPriceInBaseCurrency?.toNumber() ?? null, + marketSymbolMap[endDateString]?.[item.symbol]?.toNumber() ?? 1, + marketPriceInBaseCurrency: marketPriceInBaseCurrency?.toNumber() ?? 1, netPerformance: !hasErrors ? (netPerformance ?? null) : null, netPerformancePercentage: !hasErrors ? (netPerformancePercentage ?? null) @@ -436,7 +445,6 @@ export abstract class PortfolioCalculator { quantity: item.quantity, symbol: item.symbol, tags: item.tags, - transactionCount: item.transactionCount, valueInBaseCurrency: new Big(marketPriceInBaseCurrency).mul( item.quantity ) @@ -925,6 +933,7 @@ export abstract class PortfolioCalculator { for (const { date, fee, + feeInBaseCurrency, quantity, SymbolProfile, tags, @@ -933,6 +942,7 @@ export abstract class PortfolioCalculator { } of this.activities) { let currentTransactionPointItem: TransactionPointSymbol; + const assetSubClass = SymbolProfile.assetSubClass; const currency = SymbolProfile.currency; const dataSource = SymbolProfile.dataSource; const factor = getFactor(type); @@ -977,37 +987,42 @@ export abstract class PortfolioCalculator { } currentTransactionPointItem = { + assetSubClass, currency, dataSource, investment, skipErrors, symbol, + activitiesCount: oldAccumulatedSymbol.activitiesCount + 1, averagePrice: newQuantity.eq(0) ? new Big(0) : investment.div(newQuantity).abs(), + dateOfFirstActivity: oldAccumulatedSymbol.dateOfFirstActivity, dividend: new Big(0), fee: oldAccumulatedSymbol.fee.plus(fee), - firstBuyDate: oldAccumulatedSymbol.firstBuyDate, + feeInBaseCurrency: + oldAccumulatedSymbol.feeInBaseCurrency.plus(feeInBaseCurrency), includeInHoldings: oldAccumulatedSymbol.includeInHoldings, quantity: newQuantity, - tags: oldAccumulatedSymbol.tags.concat(tags), - transactionCount: oldAccumulatedSymbol.transactionCount + 1 + tags: oldAccumulatedSymbol.tags.concat(tags) }; } else { currentTransactionPointItem = { + assetSubClass, currency, dataSource, fee, + feeInBaseCurrency, skipErrors, symbol, tags, + activitiesCount: 1, averagePrice: unitPrice, + dateOfFirstActivity: date, dividend: new Big(0), - firstBuyDate: date, includeInHoldings: INVESTMENT_ACTIVITY_TYPES.includes(type), investment: unitPrice.mul(quantity).mul(factor), - quantity: quantity.mul(factor), - transactionCount: 1 + quantity: quantity.mul(factor) }; } diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts index f0e2f6488..52c8489dd 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-22'), feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -102,6 +103,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 1.65, + feeInBaseCurrency: 1.65, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -131,20 +133,26 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('595.6'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('139.75'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-22', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), feeInBaseCurrency: new Big('3.2'), - firstBuyDate: '2021-11-22', grossPerformance: new Big('36.6'), grossPerformancePercentage: new Big('0.07706261539956593567'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -170,7 +178,6 @@ describe('PortfolioCalculator', () => { timeWeightedInvestmentWithCurrencyEffect: new Big( '474.93846153846153846154' ), - transactionCount: 2, valueInBaseCurrency: new Big('595.6') } ], @@ -200,6 +207,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 559 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 559 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index 10b1fabd3..3998b081d 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-22'), feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -102,6 +103,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 1.65, + feeInBaseCurrency: 1.65, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -117,6 +119,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -146,20 +149,26 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('0'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 3, averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-22', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), feeInBaseCurrency: new Big('3.2'), - firstBuyDate: '2021-11-22', grossPerformance: new Big('-12.6'), grossPerformancePercentage: new Big('-0.04408677396780965649'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -183,7 +192,6 @@ describe('PortfolioCalculator', () => { timeWeightedInvestmentWithCurrencyEffect: new Big( '285.80000000000000396627' ), - transactionCount: 3, valueInBaseCurrency: new Big('0') } ], @@ -213,6 +221,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 0 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts index 32cd9f7d4..acd0d0b2e 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-22'), feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -102,6 +103,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 1.65, + feeInBaseCurrency: 1.65, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -131,20 +133,26 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('0'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-22', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), feeInBaseCurrency: new Big('3.2'), - firstBuyDate: '2021-11-22', grossPerformance: new Big('-12.6'), grossPerformancePercentage: new Big('-0.0440867739678096571'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -168,7 +176,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('285.8'), timeWeightedInvestmentWithCurrencyEffect: new Big('285.8'), - transactionCount: 2, valueInBaseCurrency: new Big('0') } ], @@ -198,6 +205,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 0 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index bfa4d06f3..652e72db0 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -122,20 +123,26 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('297.8'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('136.6'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-30', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('1.55'), feeInBaseCurrency: new Big('1.55'), - firstBuyDate: '2021-11-30', grossPerformance: new Big('24.6'), grossPerformancePercentage: new Big('0.09004392386530014641'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -165,7 +172,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('273.2'), timeWeightedInvestmentWithCurrencyEffect: new Big('273.2'), - transactionCount: 1, valueInBaseCurrency: new Big('297.8') } ], @@ -198,6 +204,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 273.2 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 273.2 } + ]); }); it.only('with BALN.SW buy (with unit price lower than closing price)', async () => { @@ -208,6 +218,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -247,6 +258,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-30'), feeInAssetProfileCurrency: 1.55, + feeInBaseCurrency: 1.55, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts index 84ea6c251..774c1d2f6 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts @@ -110,6 +110,7 @@ describe('PortfolioCalculator', () => { ...activity, date: parseDate(activity.date), feeInAssetProfileCurrency: 4.46, + feeInBaseCurrency: 3.94, SymbolProfile: { ...symbolProfileDummyData, currency: 'USD', diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index 32b3f05c2..055356325 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -98,6 +98,7 @@ describe('PortfolioCalculator', () => { ...activity, date: parseDate(activity.date), feeInAssetProfileCurrency: 4.46, + feeInBaseCurrency: 4.46, SymbolProfile: { ...symbolProfileDummyData, currency: 'USD', @@ -131,6 +132,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot.historicalData[0]).toEqual({ date: '2021-12-11', investmentValueWithCurrencyEffect: 0, @@ -189,14 +195,15 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('44558.42'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-12-12', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('4.46'), feeInBaseCurrency: new Big('4.46'), - firstBuyDate: '2021-12-12', grossPerformance: new Big('-1458.72'), grossPerformancePercentage: new Big('-0.03273724696701543726'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -220,7 +227,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('44558.42'), timeWeightedInvestmentWithCurrencyEffect: new Big('44558.42'), - transactionCount: 1, valueInBaseCurrency: new Big('43099.7') } ], @@ -244,6 +250,11 @@ describe('PortfolioCalculator', () => { { date: '2021-12-01', investment: 44558.42 }, { date: '2022-01-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 44558.42 }, + { date: '2022-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 0c111fab2..a70cc2986 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -100,6 +100,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2015-01-01'), feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 2, SymbolProfile: { ...symbolProfileDummyData, @@ -115,6 +116,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2017-12-31'), feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -144,6 +146,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('13298.425356'), errors: [], @@ -151,14 +158,15 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('320.43'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2015-01-01', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('0'), feeInBaseCurrency: new Big('0'), - firstBuyDate: '2015-01-01', grossPerformance: new Big('27172.74').mul(0.97373), grossPerformancePercentage: new Big('0.4241983590271396608571'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -186,7 +194,6 @@ describe('PortfolioCalculator', () => { timeWeightedInvestmentWithCurrencyEffect: new Big( '636.79389574611155533947' ), - transactionCount: 2, valueInBaseCurrency: new Big('13298.425356') } ], @@ -251,6 +258,13 @@ describe('PortfolioCalculator', () => { { date: '2017-12-01', investment: -318.54266729999995 }, { date: '2018-01-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2015-01-01', investment: 637.0853345999999 }, + { date: '2016-01-01', investment: 0 }, + { date: '2017-01-01', investment: -318.54266729999995 }, + { date: '2018-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts index 618dc805c..6a45f79c6 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts @@ -98,6 +98,7 @@ describe('PortfolioCalculator', () => { ...activity, date: parseDate(activity.date), feeInAssetProfileCurrency: activity.fee, + feeInBaseCurrency: activity.fee, SymbolProfile: { ...symbolProfileDummyData, currency: 'USD', diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index 716ec7a59..64882061f 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -98,6 +98,7 @@ describe('PortfolioCalculator', () => { ...activity, date: parseDate(activity.date), feeInAssetProfileCurrency: 4.46, + feeInBaseCurrency: 4.46, SymbolProfile: { ...symbolProfileDummyData, currency: 'USD', @@ -131,6 +132,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot.historicalData[0]).toEqual({ date: '2021-12-11', investmentValueWithCurrencyEffect: 0, @@ -189,14 +195,15 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('44558.42'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-12-12', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('4.46'), feeInBaseCurrency: new Big('4.46'), - firstBuyDate: '2021-12-12', grossPerformance: new Big('-1458.72'), grossPerformancePercentage: new Big('-0.03273724696701543726'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -220,7 +227,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('44558.42'), timeWeightedInvestmentWithCurrencyEffect: new Big('44558.42'), - transactionCount: 1, valueInBaseCurrency: new Big('43099.7') } ], @@ -244,6 +250,11 @@ describe('PortfolioCalculator', () => { { date: '2021-12-01', investment: 44558.42 }, { date: '2022-01-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 44558.42 }, + { date: '2022-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts new file mode 100644 index 000000000..a53ebcf05 --- /dev/null +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -0,0 +1,290 @@ +import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; +import { AccountService } from '@ghostfolio/api/app/account/account.service'; +import { OrderService } from '@ghostfolio/api/app/order/order.service'; +import { userDummyData } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator-test-utils'; +import { PortfolioCalculatorFactory } from '@ghostfolio/api/app/portfolio/calculator/portfolio-calculator.factory'; +import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; +import { CurrentRateServiceMock } from '@ghostfolio/api/app/portfolio/current-rate.service.mock'; +import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; +import { RedisCacheServiceMock } from '@ghostfolio/api/app/redis-cache/redis-cache.service.mock'; +import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; +import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; +import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service.mock'; +import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; +import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; +import { parseDate } from '@ghostfolio/common/helper'; +import { TimelinePosition } from '@ghostfolio/common/models'; +import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; + +import { DataSource } from '@prisma/client'; +import { Big } from 'big.js'; +import { randomUUID } from 'node:crypto'; + +jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { + return { + CurrentRateService: jest.fn().mockImplementation(() => { + return CurrentRateServiceMock; + }) + }; +}); + +jest.mock( + '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service', + () => { + return { + ExchangeRateDataService: jest.fn().mockImplementation(() => { + return ExchangeRateDataServiceMock; + }) + }; + } +); + +jest.mock( + '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service', + () => { + return { + PortfolioSnapshotService: jest.fn().mockImplementation(() => { + return PortfolioSnapshotServiceMock; + }) + }; + } +); + +jest.mock('@ghostfolio/api/app/redis-cache/redis-cache.service', () => { + return { + RedisCacheService: jest.fn().mockImplementation(() => { + return RedisCacheServiceMock; + }) + }; +}); + +describe('PortfolioCalculator', () => { + let accountBalanceService: AccountBalanceService; + let accountService: AccountService; + let configurationService: ConfigurationService; + let currentRateService: CurrentRateService; + let dataProviderService: DataProviderService; + let exchangeRateDataService: ExchangeRateDataService; + let orderService: OrderService; + let portfolioCalculatorFactory: PortfolioCalculatorFactory; + let portfolioSnapshotService: PortfolioSnapshotService; + let redisCacheService: RedisCacheService; + + beforeEach(() => { + configurationService = new ConfigurationService(); + + exchangeRateDataService = new ExchangeRateDataService( + null, + null, + null, + null + ); + + accountBalanceService = new AccountBalanceService( + null, + exchangeRateDataService, + null + ); + + accountService = new AccountService( + accountBalanceService, + null, + exchangeRateDataService, + null + ); + + redisCacheService = new RedisCacheService(null, configurationService); + + dataProviderService = new DataProviderService( + configurationService, + null, + null, + null, + null, + redisCacheService + ); + + currentRateService = new CurrentRateService( + dataProviderService, + null, + null, + null + ); + + orderService = new OrderService( + accountBalanceService, + accountService, + null, + dataProviderService, + null, + exchangeRateDataService, + null, + null + ); + + portfolioSnapshotService = new PortfolioSnapshotService(null); + + portfolioCalculatorFactory = new PortfolioCalculatorFactory( + configurationService, + currentRateService, + exchangeRateDataService, + portfolioSnapshotService, + redisCacheService + ); + }); + + describe('Cash Performance', () => { + it('should calculate performance for cash assets in CHF default currency', async () => { + jest.useFakeTimers().setSystemTime(parseDate('2025-01-01').getTime()); + + const accountId = randomUUID(); + + jest + .spyOn(accountBalanceService, 'getAccountBalances') + .mockResolvedValue({ + balances: [ + { + accountId, + id: randomUUID(), + date: parseDate('2023-12-31'), + value: 1000, + valueInBaseCurrency: 850 + }, + { + accountId, + id: randomUUID(), + date: parseDate('2024-12-31'), + value: 2000, + valueInBaseCurrency: 1800 + } + ] + }); + + jest.spyOn(accountService, 'getCashDetails').mockResolvedValue({ + accounts: [ + { + balance: 2000, + comment: null, + createdAt: parseDate('2023-12-31'), + currency: 'USD', + id: accountId, + isExcluded: false, + name: 'USD', + platformId: null, + updatedAt: parseDate('2023-12-31'), + userId: userDummyData.id + } + ], + balanceInBaseCurrency: 1820 + }); + + jest + .spyOn(dataProviderService, 'getDataSourceForExchangeRates') + .mockReturnValue(DataSource.YAHOO); + + jest.spyOn(orderService, 'getOrders').mockResolvedValue({ + activities: [], + count: 0 + }); + + const { activities } = await orderService.getOrdersForPortfolioCalculator( + { + userCurrency: 'CHF', + userId: userDummyData.id, + withCash: true + } + ); + + jest.spyOn(currentRateService, 'getValues').mockResolvedValue({ + dataProviderInfos: [], + errors: [], + values: [] + }); + + const accountBalanceItems = + await accountBalanceService.getAccountBalanceItems({ + userCurrency: 'CHF', + userId: userDummyData.id + }); + + const portfolioCalculator = portfolioCalculatorFactory.createCalculator({ + accountBalanceItems, + activities, + calculationType: PerformanceCalculationType.ROAI, + currency: 'CHF', + userId: userDummyData.id + }); + + const portfolioSnapshot = await portfolioCalculator.computeSnapshot(); + + const position = portfolioSnapshot.positions.find(({ symbol }) => { + return symbol === 'USD'; + }); + + /** + * Investment: 2000 USD * 0.91 = 1820 CHF + * Investment value with currency effect: (1000 USD * 0.85) + (1000 USD * 0.90) = 1750 CHF + * Net performance: (1000 USD * 1.0) - (1000 USD * 1.0) = 0 CHF + * Total account balance: 2000 USD * 0.85 = 1700 CHF (using the exchange rate on 2024-12-31) + * Value in base currency: 2000 USD * 0.91 = 1820 CHF + */ + expect(position).toMatchObject({ + activitiesCount: 2, + averagePrice: new Big(1), + currency: 'USD', + dataSource: DataSource.YAHOO, + dateOfFirstActivity: '2023-12-31', + dividend: new Big(0), + dividendInBaseCurrency: new Big(0), + fee: new Big(0), + feeInBaseCurrency: new Big(0), + grossPerformance: new Big(0), + grossPerformancePercentage: new Big(0), + grossPerformancePercentageWithCurrencyEffect: new Big( + '0.08211603004634809014' + ), + grossPerformanceWithCurrencyEffect: new Big(70), + includeInTotalAssetValue: false, + investment: new Big(1820), + investmentWithCurrencyEffect: new Big(1750), + marketPrice: 1, + marketPriceInBaseCurrency: 0.91, + netPerformance: new Big(0), + netPerformancePercentage: new Big(0), + netPerformancePercentageWithCurrencyEffectMap: { + '1d': new Big('0.01111111111111111111'), + '1y': new Big('0.06937181021989792704'), + '5y': new Big('0.0818817546090273363'), + max: new Big('0.0818817546090273363'), + mtd: new Big('0.01111111111111111111'), + wtd: new Big('-0.05517241379310344828'), + ytd: new Big('0.01111111111111111111') + }, + netPerformanceWithCurrencyEffectMap: { + '1d': new Big(20), + '1y': new Big(60), + '5y': new Big(70), + max: new Big(70), + mtd: new Big(20), + wtd: new Big(-80), + ytd: new Big(20) + }, + quantity: new Big(2000), + symbol: 'USD', + timeWeightedInvestment: new Big('912.47956403269754768392'), + timeWeightedInvestmentWithCurrencyEffect: new Big( + '852.45231607629427792916' + ), + valueInBaseCurrency: new Big(1820) + }); + + expect(portfolioSnapshot).toMatchObject({ + hasErrors: false, + totalFeesWithCurrencyEffect: new Big(0), + totalInterestWithCurrencyEffect: new Big(0), + totalLiabilitiesWithCurrencyEffect: new Big(0) + }); + }); + }); +}); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts index aae77c876..59a5531df 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-09-01'), feeInAssetProfileCurrency: 49, + feeInBaseCurrency: 49, quantity: 0, SymbolProfile: { ...symbolProfileDummyData, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts index 495728e22..9b48a1324 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts @@ -99,6 +99,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2023-01-03'), feeInAssetProfileCurrency: 1, + feeInBaseCurrency: 0.9238, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -128,20 +129,26 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('103.10483'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('89.12'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2023-01-03', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('1'), feeInBaseCurrency: new Big('0.9238'), - firstBuyDate: '2023-01-03', grossPerformance: new Big('27.33').mul(0.8854), grossPerformancePercentage: new Big('0.3066651705565529623'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -165,7 +172,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('89.12').mul(0.8854), timeWeightedInvestmentWithCurrencyEffect: new Big('82.329056'), - transactionCount: 1, valueInBaseCurrency: new Big('103.10483') } ], @@ -217,6 +223,10 @@ describe('PortfolioCalculator', () => { investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2023-01-01', investment: 82.329056 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts index 1fd88dacc..acbf6a66b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2023-01-01'), // Date in future feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts index 4c8ccdcf5..baa6ae1ed 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts @@ -80,6 +80,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2024-03-08'), feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 0.3333333333333333, SymbolProfile: { ...symbolProfileDummyData, @@ -94,8 +95,9 @@ describe('PortfolioCalculator', () => { { ...activityDummyData, date: new Date('2024-03-13'), - quantity: 0.6666666666666666, feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, + quantity: 0.6666666666666666, SymbolProfile: { ...symbolProfileDummyData, currency: 'USD', @@ -109,8 +111,9 @@ describe('PortfolioCalculator', () => { { ...activityDummyData, date: new Date('2024-03-14'), - quantity: 1, feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, + quantity: 1, SymbolProfile: { ...symbolProfileDummyData, currency: 'USD', diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts index 0331e163e..b19adb642 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-09-16'), feeInAssetProfileCurrency: 19, + feeInBaseCurrency: 19, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -102,6 +103,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2021-11-16'), feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -129,13 +131,14 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('298.58'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-09-16', dividend: new Big('0.62'), dividendInBaseCurrency: new Big('0.62'), fee: new Big('19'), - firstBuyDate: '2021-09-16', grossPerformance: new Big('33.25'), grossPerformancePercentage: new Big('0.11136043941322258691'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -159,8 +162,7 @@ describe('PortfolioCalculator', () => { }, quantity: new Big('1'), symbol: 'MSFT', - tags: [], - transactionCount: 2 + tags: [] } ], totalFeesWithCurrencyEffect: new Big('19'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts index fdd9e4718..6c47af7ca 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts @@ -93,6 +93,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big(0), hasErrors: false, @@ -108,6 +113,8 @@ describe('PortfolioCalculator', () => { expect(investments).toEqual([]); expect(investmentsByMonth).toEqual([]); + + expect(investmentsByYear).toEqual([]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index 650944421..fecf17011 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -101,6 +101,7 @@ describe('PortfolioCalculator', () => { ...activity, date: parseDate(activity.date), feeInAssetProfileCurrency: activity.fee, + feeInBaseCurrency: activity.fee, SymbolProfile: { ...symbolProfileDummyData, currency: activity.currency, @@ -128,20 +129,26 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('87.8'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('75.80'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2022-03-07', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('4.25'), feeInBaseCurrency: new Big('4.25'), - firstBuyDate: '2022-03-07', grossPerformance: new Big('21.93'), grossPerformancePercentage: new Big('0.15113417083448194384'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -167,7 +174,6 @@ describe('PortfolioCalculator', () => { timeWeightedInvestmentWithCurrencyEffect: new Big( '145.10285714285714285714' ), - transactionCount: 2, valueInBaseCurrency: new Big('87.8') } ], @@ -197,6 +203,10 @@ describe('PortfolioCalculator', () => { { date: '2022-03-01', investment: 151.6 }, { date: '2022-04-01', investment: -75.8 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2022-01-01', investment: 75.8 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index 2e408dc3c..adbb5c3ff 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -101,6 +101,7 @@ describe('PortfolioCalculator', () => { ...activity, date: parseDate(activity.date), feeInAssetProfileCurrency: activity.fee, + feeInBaseCurrency: activity.fee, SymbolProfile: { ...symbolProfileDummyData, currency: activity.currency, @@ -128,6 +129,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot.historicalData[0]).toEqual({ date: '2022-03-06', investmentValueWithCurrencyEffect: 0, @@ -187,14 +193,15 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2022-03-07', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('0'), feeInBaseCurrency: new Big('0'), - firstBuyDate: '2022-03-07', grossPerformance: new Big('19.86'), grossPerformancePercentage: new Big('0.13100263852242744063'), grossPerformancePercentageWithCurrencyEffect: new Big( @@ -218,7 +225,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('151.6'), timeWeightedInvestmentWithCurrencyEffect: new Big('151.6'), - transactionCount: 2, valueInBaseCurrency: new Big('0') } ], @@ -248,6 +254,10 @@ describe('PortfolioCalculator', () => { { date: '2022-03-01', investment: 151.6 }, { date: '2022-04-01', investment: -151.6 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2022-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index 3c7c3be4b..6fc94622f 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -87,6 +87,7 @@ describe('PortfolioCalculator', () => { ...activityDummyData, date: new Date('2022-01-01'), feeInAssetProfileCurrency: 0, + feeInBaseCurrency: 0, quantity: 1, SymbolProfile: { ...symbolProfileDummyData, @@ -115,21 +116,22 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('500000'), currency: 'USD', dataSource: 'MANUAL', + dateOfFirstActivity: '2022-01-01', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('0'), feeInBaseCurrency: new Big('0'), - firstBuyDate: '2022-01-01', grossPerformance: new Big('0'), grossPerformancePercentage: new Big('0'), grossPerformancePercentageWithCurrencyEffect: new Big('0'), grossPerformanceWithCurrencyEffect: new Big('0'), investment: new Big('500000'), investmentWithCurrencyEffect: new Big('500000'), - marketPrice: null, + marketPrice: 1, marketPriceInBaseCurrency: 500000, netPerformance: new Big('0'), netPerformancePercentage: new Big('0'), @@ -144,7 +146,6 @@ describe('PortfolioCalculator', () => { tags: [], timeWeightedInvestment: new Big('500000'), timeWeightedInvestmentWithCurrencyEffect: new Big('500000'), - transactionCount: 1, valueInBaseCurrency: new Big('500000') } ], diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts index d4fad7d93..fe912510a 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator.ts @@ -13,7 +13,14 @@ import { PerformanceCalculationType } from '@ghostfolio/common/types/performance import { Logger } from '@nestjs/common'; import { Big } from 'big.js'; -import { addMilliseconds, differenceInDays, format, isBefore } from 'date-fns'; +import { + addMilliseconds, + differenceInDays, + eachYearOfInterval, + format, + isBefore, + isThisYear +} from 'date-fns'; import { cloneDeep, sortBy } from 'lodash'; export class RoaiPortfolioCalculator extends PortfolioCalculator { @@ -34,7 +41,11 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { let totalTimeWeightedInvestment = new Big(0); let totalTimeWeightedInvestmentWithCurrencyEffect = new Big(0); - for (const currentPosition of positions) { + for (const currentPosition of positions.filter( + ({ includeInTotalAssetValue }) => { + return includeInTotalAssetValue; + } + )) { if (currentPosition.feeInBaseCurrency) { totalFeesWithCurrencyEffect = totalFeesWithCurrencyEffect.plus( currentPosition.feeInBaseCurrency @@ -188,6 +199,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { }) ); + const isCash = orders[0]?.SymbolProfile?.assetSubClass === 'CASH'; + if (orders.length <= 0) { return { currentValues: {}, @@ -244,6 +257,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { // For BUY / SELL activities with a MANUAL data source where no historical market price is available, // the calculation should fall back to using the activity’s unit price. unitPriceAtEndDate = latestActivity.unitPrice; + } else if (isCash) { + unitPriceAtEndDate = new Big(1); } if ( @@ -295,7 +310,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { quantity: new Big(0), SymbolProfile: { dataSource, - symbol + symbol, + assetSubClass: isCash ? 'CASH' : undefined }, type: 'BUY', unitPrice: unitPriceAtStartDate @@ -308,7 +324,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { itemType: 'end', SymbolProfile: { dataSource, - symbol + symbol, + assetSubClass: isCash ? 'CASH' : undefined }, quantity: new Big(0), type: 'BUY', @@ -348,7 +365,8 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { quantity: new Big(0), SymbolProfile: { dataSource, - symbol + symbol, + assetSubClass: isCash ? 'CASH' : undefined }, type: 'BUY', unitPrice: marketSymbolMap[dateString]?.[symbol] ?? lastUnitPrice, @@ -826,15 +844,14 @@ export class RoaiPortfolioCalculator extends PortfolioCalculator { 'max', 'mtd', 'wtd', - 'ytd' - // TODO: - // ...eachYearOfInterval({ end, start }) - // .filter((date) => { - // return !isThisYear(date); - // }) - // .map((date) => { - // return format(date, 'yyyy'); - // }) + 'ytd', + ...eachYearOfInterval({ end, start }) + .filter((date) => { + return !isThisYear(date); + }) + .map((date) => { + return format(date, 'yyyy'); + }) ] as DateRange[]) { const dateInterval = getIntervalFromDateRange(dateRange); const endDate = dateInterval.endDate; diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order-item.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order-item.interface.ts index 06e471d67..42759b521 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order-item.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order-item.interface.ts @@ -3,7 +3,6 @@ import { Big } from 'big.js'; import { PortfolioOrder } from './portfolio-order.interface'; export interface PortfolioOrderItem extends PortfolioOrder { - feeInBaseCurrency?: Big; feeInBaseCurrencyWithCurrencyEffect?: Big; itemType?: 'end' | 'start'; unitPriceFromMarketData?: Big; diff --git a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts index 9362184c7..2dbd68f12 100644 --- a/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts @@ -3,10 +3,11 @@ import { Activity } from '@ghostfolio/common/interfaces'; export interface PortfolioOrder extends Pick { date: string; fee: Big; + feeInBaseCurrency: Big; quantity: Big; SymbolProfile: Pick< Activity['SymbolProfile'], - 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId' + 'assetSubClass' | 'currency' | 'dataSource' | 'name' | 'symbol' | 'userId' >; unitPrice: Big; } diff --git a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts index f4ceadf3b..7f3f54ff5 100644 --- a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts @@ -1,18 +1,20 @@ -import { DataSource, Tag } from '@prisma/client'; +import { AssetSubClass, DataSource, Tag } from '@prisma/client'; import { Big } from 'big.js'; export interface TransactionPointSymbol { + activitiesCount: number; + assetSubClass: AssetSubClass; averagePrice: Big; currency: string; dataSource: DataSource; + dateOfFirstActivity: string; dividend: Big; fee: Big; - firstBuyDate: string; + feeInBaseCurrency: Big; includeInHoldings: boolean; investment: Big; quantity: Big; skipErrors: boolean; symbol: string; tags?: Tag[]; - transactionCount: number; } diff --git a/apps/api/src/app/portfolio/portfolio.controller.ts b/apps/api/src/app/portfolio/portfolio.controller.ts index 03796dad6..b8aefe0ac 100644 --- a/apps/api/src/app/portfolio/portfolio.controller.ts +++ b/apps/api/src/app/portfolio/portfolio.controller.ts @@ -195,11 +195,13 @@ export class PortfolioController { 'excludedAccountsAndActivities', 'fees', 'filteredValueInBaseCurrency', + 'fireWealth', 'grossPerformance', 'grossPerformanceWithCurrencyEffect', 'interestInBaseCurrency', 'items', 'liabilities', + 'liabilitiesInBaseCurrency', 'netPerformance', 'netPerformanceWithCurrencyEffect', 'totalBuy', @@ -329,7 +331,7 @@ export class PortfolioController { types: ['DIVIDEND'] }); - let dividends = await this.portfolioService.getDividends({ + let dividends = this.portfolioService.getDividends({ activities, groupBy }); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index faabee79b..7be375473 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -179,9 +179,9 @@ export class PortfolioService { return Promise.all( accounts.map(async (account) => { + let activitiesCount = 0; let dividendInBaseCurrency = 0; let interestInBaseCurrency = 0; - let transactionCount = 0; for (const { currency, @@ -214,7 +214,7 @@ export class PortfolioService { } if (!isDraft) { - transactionCount += 1; + activitiesCount += 1; } } @@ -223,9 +223,9 @@ export class PortfolioService { const result = { ...account, + activitiesCount, dividendInBaseCurrency, interestInBaseCurrency, - transactionCount, valueInBaseCurrency, allocationInPercentage: 0, balanceInBaseCurrency: this.exchangeRateDataService.toCurrency( @@ -262,6 +262,8 @@ export class PortfolioService { withExcludedAccounts }); + let activitiesCount = 0; + const searchQuery = filters.find(({ type }) => { return type === 'SEARCH_QUERY'; })?.id; @@ -281,9 +283,10 @@ export class PortfolioService { let totalDividendInBaseCurrency = new Big(0); let totalInterestInBaseCurrency = new Big(0); let totalValueInBaseCurrency = new Big(0); - let transactionCount = 0; for (const account of accounts) { + activitiesCount += account.activitiesCount; + totalBalanceInBaseCurrency = totalBalanceInBaseCurrency.plus( account.balanceInBaseCurrency ); @@ -296,7 +299,6 @@ export class PortfolioService { totalValueInBaseCurrency = totalValueInBaseCurrency.plus( account.valueInBaseCurrency ); - transactionCount += account.transactionCount; } for (const account of accounts) { @@ -310,7 +312,7 @@ export class PortfolioService { return { accounts, - transactionCount, + activitiesCount, totalBalanceInBaseCurrency: totalBalanceInBaseCurrency.toNumber(), totalDividendInBaseCurrency: totalDividendInBaseCurrency.toNumber(), totalInterestInBaseCurrency: totalInterestInBaseCurrency.toNumber(), @@ -318,13 +320,13 @@ export class PortfolioService { }; } - public async getDividends({ + public getDividends({ activities, groupBy }: { activities: Activity[]; groupBy?: GroupBy; - }): Promise { + }): InvestmentItem[] { let dividends = activities.map(({ currency, date, value }) => { return { date: format(date, DATE_FORMAT), @@ -522,10 +524,6 @@ export class PortfolioService { return type === 'ACCOUNT'; }) ?? false; - const isFilteredByCash = filters?.some(({ id, type }) => { - return id === AssetClass.LIQUIDITY && type === 'ASSET_CLASS'; - }); - const isFilteredByClosedHoldings = filters?.some(({ id, type }) => { return id === 'CLOSED' && type === 'HOLDING_TYPE'; @@ -557,6 +555,9 @@ export class PortfolioService { assetProfileIdentifiers ); + const cashSymbolProfiles = this.getCashSymbolProfiles(cashDetails); + symbolProfiles.push(...cashSymbolProfiles); + const symbolProfileMap: { [symbol: string]: EnhancedSymbolProfile } = {}; for (const symbolProfile of symbolProfiles) { symbolProfileMap[symbolProfile.symbol] = symbolProfile; @@ -568,9 +569,10 @@ export class PortfolioService { } for (const { + activitiesCount, currency, + dateOfFirstActivity, dividend, - firstBuyDate, grossPerformance, grossPerformanceWithCurrencyEffect, grossPerformancePercentage, @@ -584,7 +586,6 @@ export class PortfolioService { quantity, symbol, tags, - transactionCount, valueInBaseCurrency } of positions) { if (isFilteredByClosedHoldings === true) { @@ -611,13 +612,13 @@ export class PortfolioService { } holdings[symbol] = { + activitiesCount, currency, markets, marketsAdvanced, marketPrice, symbol, tags, - transactionCount, allocationInPercentage: filteredValueInBaseCurrency.eq(0) ? 0 : valueInBaseCurrency.div(filteredValueInBaseCurrency).toNumber(), @@ -625,7 +626,7 @@ export class PortfolioService { assetSubClass: assetProfile.assetSubClass, countries: assetProfile.countries, dataSource: assetProfile.dataSource, - dateOfFirstActivity: parseDate(firstBuyDate), + dateOfFirstActivity: parseDate(dateOfFirstActivity), dividend: dividend?.toNumber() ?? 0, grossPerformance: grossPerformance?.toNumber() ?? 0, grossPerformancePercent: grossPerformancePercentage?.toNumber() ?? 0, @@ -661,18 +662,6 @@ export class PortfolioService { }; } - if (filters?.length === 0 || isFilteredByAccount || isFilteredByCash) { - const cashPositions = this.getCashPositions({ - cashDetails, - userCurrency, - value: filteredValueInBaseCurrency - }); - - for (const symbol of Object.keys(cashPositions)) { - holdings[symbol] = cashPositions[symbol]; - } - } - const { accounts, platforms } = await this.getValueOfAccountsAndPlatforms({ activities, filters, @@ -802,11 +791,12 @@ export class PortfolioService { } const { + activitiesCount, averagePrice, currency, + dateOfFirstActivity, dividendInBaseCurrency, - fee, - firstBuyDate, + feeInBaseCurrency, grossPerformance, grossPerformancePercentage, grossPerformancePercentageWithCurrencyEffect, @@ -820,8 +810,7 @@ export class PortfolioService { quantity, tags, timeWeightedInvestment, - timeWeightedInvestmentWithCurrencyEffect, - transactionCount + timeWeightedInvestmentWithCurrencyEffect } = holding; const activitiesOfHolding = activities.filter(({ SymbolProfile }) => { @@ -832,7 +821,10 @@ export class PortfolioService { }); const dividendYieldPercent = getAnnualizedPerformancePercent({ - daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), + daysInMarket: differenceInDays( + new Date(), + parseDate(dateOfFirstActivity) + ), netPerformancePercentage: timeWeightedInvestment.eq(0) ? new Big(0) : dividendInBaseCurrency.div(timeWeightedInvestment) @@ -840,7 +832,10 @@ export class PortfolioService { const dividendYieldPercentWithCurrencyEffect = getAnnualizedPerformancePercent({ - daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), + daysInMarket: differenceInDays( + new Date(), + parseDate(dateOfFirstActivity) + ), netPerformancePercentage: timeWeightedInvestmentWithCurrencyEffect.eq(0) ? new Big(0) : dividendInBaseCurrency.div(timeWeightedInvestmentWithCurrencyEffect) @@ -849,7 +844,7 @@ export class PortfolioService { const historicalData = await this.dataProviderService.getHistorical( [{ dataSource, symbol }], 'day', - parseISO(firstBuyDate), + parseISO(dateOfFirstActivity), new Date() ); @@ -914,7 +909,7 @@ export class PortfolioService { // Add historical entry for buy date, if no historical data available historicalDataArray.push({ averagePrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, - date: firstBuyDate, + date: dateOfFirstActivity, marketPrice: activitiesOfHolding[0].unitPriceInAssetProfileCurrency, quantity: activitiesOfHolding[0].quantity }); @@ -927,25 +922,20 @@ export class PortfolioService { ); return { - firstBuyDate, + activitiesCount, + dateOfFirstActivity, marketPrice, marketPriceMax, marketPriceMin, SymbolProfile, tags, - activities: activitiesOfHolding, - activitiesCount: transactionCount, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), dividendYieldPercent: dividendYieldPercent.toNumber(), dividendYieldPercentWithCurrencyEffect: dividendYieldPercentWithCurrencyEffect.toNumber(), - feeInBaseCurrency: this.exchangeRateDataService.toCurrency( - fee.toNumber(), - SymbolProfile.currency, - userCurrency - ), + feeInBaseCurrency: feeInBaseCurrency.toNumber(), grossPerformance: grossPerformance?.toNumber(), grossPerformancePercent: grossPerformancePercentage?.toNumber(), grossPerformancePercentWithCurrencyEffect: @@ -1548,6 +1538,37 @@ export class PortfolioService { return cashPositions; } + private getCashSymbolProfiles(cashDetails: CashDetails) { + const cashSymbols = [ + ...new Set(cashDetails.accounts.map(({ currency }) => currency)) + ]; + + return cashSymbols.map((currency) => { + const account = cashDetails.accounts.find( + ({ currency: accountCurrency }) => { + return accountCurrency === currency; + } + ); + + return { + currency, + activitiesCount: 0, + assetClass: AssetClass.LIQUIDITY, + assetSubClass: AssetSubClass.CASH, + countries: [], + createdAt: account.createdAt, + dataSource: DataSource.MANUAL, + holdings: [], + id: currency, + isActive: true, + name: currency, + sectors: [], + symbol: currency, + updatedAt: account.updatedAt + }; + }); + } + private getDividendsByGroup({ dividends, groupBy @@ -1644,6 +1665,7 @@ export class PortfolioService { }): PortfolioPosition { return { currency, + activitiesCount: 0, allocationInPercentage: 0, assetClass: AssetClass.LIQUIDITY, assetSubClass: AssetSubClass.CASH, @@ -1667,7 +1689,6 @@ export class PortfolioService { sectors: [], symbol: currency, tags: [], - transactionCount: 0, valueInBaseCurrency: balance }; } @@ -1854,18 +1875,17 @@ export class PortfolioService { netPerformanceWithCurrencyEffect } = performance; - const dividendInBaseCurrency = - await portfolioCalculator.getDividendInBaseCurrency(); - const totalEmergencyFund = this.getTotalEmergencyFund({ emergencyFundHoldingsValueInBaseCurrency, userSettings: user.settings?.settings as UserSettings }); - const fees = await portfolioCalculator.getFeesInBaseCurrency(); + const dateOfFirstActivity = portfolioCalculator.getStartDate(); - const firstOrderDate = portfolioCalculator.getStartDate(); + const dividendInBaseCurrency = + await portfolioCalculator.getDividendInBaseCurrency(); + const fees = await portfolioCalculator.getFeesInBaseCurrency(); const interest = await portfolioCalculator.getInterestInBaseCurrency(); const liabilities = @@ -1923,7 +1943,7 @@ export class PortfolioService { .minus(liabilities) .toNumber(); - const daysInMarket = differenceInDays(new Date(), firstOrderDate); + const daysInMarket = differenceInDays(new Date(), dateOfFirstActivity); const annualizedPerformancePercent = getAnnualizedPerformancePercent({ daysInMarket, @@ -1942,6 +1962,7 @@ export class PortfolioService { annualizedPerformancePercent, annualizedPerformancePercentWithCurrencyEffect, cash, + dateOfFirstActivity, excludedAccountsAndActivities, netPerformance, netPerformancePercentage, @@ -1954,7 +1975,6 @@ export class PortfolioService { }).length, committedFunds: committedFunds.toNumber(), currentValueInBaseCurrency: currentValueInBaseCurrency.toNumber(), - dateOfFirstActivity: firstOrderDate, dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), emergencyFund: { assets: emergencyFundHoldingsValueInBaseCurrency, @@ -2158,7 +2178,7 @@ export class PortfolioService { accounts[account?.id || UNKNOWN_KEY] = { balance: 0, currency: account?.currency, - name: account.name, + name: account?.name, valueInBaseCurrency: currentValueOfSymbolInBaseCurrency }; } @@ -2172,7 +2192,7 @@ export class PortfolioService { platforms[account?.platformId || UNKNOWN_KEY] = { balance: 0, currency: account?.currency, - name: account.platform?.name, + name: account?.platform?.name, valueInBaseCurrency: currentValueOfSymbolInBaseCurrency }; } diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 0fad8c8ac..689ee3e6a 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -35,7 +35,7 @@ export class SubscriptionService { this.stripe = new Stripe( this.configurationService.get('STRIPE_SECRET_KEY'), { - apiVersion: '2025-08-27.basil' + apiVersion: '2026-01-28.clover' } ); } @@ -100,7 +100,7 @@ export class SubscriptionService { ); return { - sessionId: session.id + sessionUrl: session.url }; } diff --git a/apps/api/src/app/user/user.controller.ts b/apps/api/src/app/user/user.controller.ts index 397ae016b..6346ce43a 100644 --- a/apps/api/src/app/user/user.controller.ts +++ b/apps/api/src/app/user/user.controller.ts @@ -1,8 +1,11 @@ import { HasPermission } from '@ghostfolio/api/decorators/has-permission.decorator'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; +import { RedactValuesInResponseInterceptor } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.interceptor'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; +import { ImpersonationService } from '@ghostfolio/api/services/impersonation/impersonation.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service'; +import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { DeleteOwnUserDto, UpdateOwnAccessTokenDto, @@ -28,7 +31,8 @@ import { Param, Post, Put, - UseGuards + UseGuards, + UseInterceptors } from '@nestjs/common'; import { REQUEST } from '@nestjs/core'; import { JwtService } from '@nestjs/jwt'; @@ -43,6 +47,7 @@ import { UserService } from './user.service'; export class UserController { public constructor( private readonly configurationService: ConfigurationService, + private readonly impersonationService: ImpersonationService, private readonly jwtService: JwtService, private readonly prismaService: PrismaService, private readonly propertyService: PropertyService, @@ -107,13 +112,19 @@ export class UserController { @Get() @UseGuards(AuthGuard('jwt'), HasPermissionGuard) + @UseInterceptors(RedactValuesInResponseInterceptor) public async getUser( - @Headers('accept-language') acceptLanguage: string + @Headers('accept-language') acceptLanguage: string, + @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string ): Promise { - return this.userService.getUser( - this.request.user, - acceptLanguage?.split(',')?.[0] - ); + const impersonationUserId = + await this.impersonationService.validateImpersonationId(impersonationId); + + return this.userService.getUser({ + impersonationUserId, + locale: acceptLanguage?.split(',')?.[0], + user: this.request.user + }); } @Post() diff --git a/apps/api/src/app/user/user.module.ts b/apps/api/src/app/user/user.module.ts index 8a21b0a55..7ca68d275 100644 --- a/apps/api/src/app/user/user.module.ts +++ b/apps/api/src/app/user/user.module.ts @@ -1,7 +1,9 @@ import { OrderModule } from '@ghostfolio/api/app/order/order.module'; import { SubscriptionModule } from '@ghostfolio/api/app/subscription/subscription.module'; +import { RedactValuesInResponseModule } from '@ghostfolio/api/interceptors/redact-values-in-response/redact-values-in-response.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { I18nModule } from '@ghostfolio/api/services/i18n/i18n.module'; +import { ImpersonationModule } from '@ghostfolio/api/services/impersonation/impersonation.module'; import { PrismaModule } from '@ghostfolio/api/services/prisma/prisma.module'; import { PropertyModule } from '@ghostfolio/api/services/property/property.module'; import { TagModule } from '@ghostfolio/api/services/tag/tag.module'; @@ -18,6 +20,7 @@ import { UserService } from './user.service'; imports: [ ConfigurationModule, I18nModule, + ImpersonationModule, JwtModule.register({ secret: process.env.JWT_SECRET_KEY, signOptions: { expiresIn: '30 days' } @@ -25,6 +28,7 @@ import { UserService } from './user.service'; OrderModule, PrismaModule, PropertyModule, + RedactValuesInResponseModule, SubscriptionModule, TagModule ], diff --git a/apps/api/src/app/user/user.service.ts b/apps/api/src/app/user/user.service.ts index 3280fbfac..def0b94d9 100644 --- a/apps/api/src/app/user/user.service.ts +++ b/apps/api/src/app/user/user.service.ts @@ -30,7 +30,7 @@ import { PROPERTY_IS_READ_ONLY_MODE, PROPERTY_SYSTEM_MESSAGE, TAG_ID_EXCLUDE_FROM_ANALYSIS, - locale + locale as defaultLocale } from '@ghostfolio/common/config'; import { User as IUser, @@ -49,7 +49,7 @@ import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { Prisma, Role, User } from '@prisma/client'; import { differenceInDays, subDays } from 'date-fns'; -import { sortBy, without } from 'lodash'; +import { without } from 'lodash'; import { createHmac } from 'node:crypto'; @Injectable() @@ -96,10 +96,17 @@ export class UserService { return { accessToken, hashedAccessToken }; } - public async getUser( - { accounts, id, permissions, settings, subscription }: UserWithSettings, - aLocale = locale - ): Promise { + public async getUser({ + impersonationUserId, + locale = defaultLocale, + user + }: { + impersonationUserId: string; + locale?: string; + user: UserWithSettings; + }): Promise { + const { id, permissions, settings, subscription } = user; + const userData = await Promise.all([ this.prismaService.access.findMany({ include: { @@ -108,22 +115,31 @@ export class UserService { orderBy: { alias: 'asc' }, where: { granteeUserId: id } }), + this.prismaService.account.findMany({ + orderBy: { + name: 'asc' + }, + where: { + userId: impersonationUserId || user.id + } + }), this.prismaService.order.count({ - where: { userId: id } + where: { userId: impersonationUserId || user.id } }), this.prismaService.order.findFirst({ orderBy: { date: 'asc' }, - where: { userId: id } + where: { userId: impersonationUserId || user.id } }), - this.tagService.getTagsForUser(id) + this.tagService.getTagsForUser(impersonationUserId || user.id) ]); const access = userData[0]; - const activitiesCount = userData[1]; - const firstActivity = userData[2]; - let tags = userData[3].filter((tag) => { + const accounts = userData[1]; + const activitiesCount = userData[2]; + const firstActivity = userData[3]; + let tags = userData[4].filter((tag) => { return tag.id !== TAG_ID_EXCLUDE_FROM_ANALYSIS; }); @@ -146,7 +162,6 @@ export class UserService { } return { - accounts, activitiesCount, id, permissions, @@ -160,10 +175,13 @@ export class UserService { permissions: accessItem.permissions }; }), + accounts: accounts.sort((a, b) => { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }), dateOfFirstActivity: firstActivity?.date ?? new Date(), settings: { ...(settings.settings as UserSettings), - locale: (settings.settings as UserSettings)?.locale ?? aLocale + locale: (settings.settings as UserSettings)?.locale ?? locale } }; } @@ -516,9 +534,10 @@ export class UserService { currentPermissions.push(permissions.impersonateAllUsers); } - user.accounts = sortBy(user.accounts, ({ name }) => { - return name.toLowerCase(); + user.accounts = user.accounts.sort((a, b) => { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }); + user.permissions = currentPermissions.sort(); return user; diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index 80c07fc64..e456f6f1d 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -4,6 +4,7 @@ "4": "4", "7": "Lucky7", "8": "8", + "21": "2131KOBUSHIDE", "32": "Project 32", "42": "Semantic Layer", "47": "President Trump", @@ -20,8 +21,10 @@ "1337": "EliteCoin", "1717": "1717 Masonic Commemorative Token", "2015": "2015 coin", + "2016": "2016 coin", "2024": "2024", "2025": "2025 TOKEN", + "2026": "2026", "2049": "TOKEN 2049", "2192": "LERNITAS", "4444": "4444 Meme", @@ -55,6 +58,7 @@ "10SET": "Tenset", "1ART": "ArtWallet", "1CAT": "Bitcoin Cats", + "1COIN": "1 coin can change your life", "1CR": "1Credit", "1EARTH": "EarthFund", "1ECO": "1eco", @@ -83,6 +87,7 @@ "1UP": "Uptrennd", "1WO": "1World", "2022M": "2022MOON", + "2026MEMECLUB": "2026", "20EX": "20ex", "21BTC": "21.co Wrapped BTC", "21X": "21X", @@ -113,6 +118,7 @@ "3DES": "3DES", "3DVANCE": "3D Vance", "3FT": "ThreeFold Token", + "3KDS": "3KDS", "3KM": "3 Kingdoms Multiverse", "3P": "Web3Camp", "3RDEYE": "3rd Eye", @@ -146,11 +152,13 @@ "7E": "7ELEVEN", "88MPH": "88mph", "8BIT": "8BIT Coin", + "8BITCOIN": "8-Bit COIN", "8BT": "8 Circuit Studios", "8LNDS": "8Lends", "8PAY": "8Pay", "8X8": "8X8 Protocol", "99BTC": "99 Bitcoins", + "9BIT": "The9bit", "9DOGS": "NINE DOGS", "9GAG": "9GAG", "9MM": "Shigure UI", @@ -175,13 +183,17 @@ "AAC": "Double-A Chain", "AAG": "AAG Ventures", "AAI": "AutoAir AI", + "AALON": "American Airlines Group (Ondo Tokenized)", + "AAPLON": "Apple (Ondo Tokenized)", "AAPLX": "Apple xStock", "AAPX": "AMPnet", + "AARBWBTC": "Aave Arbitrum WBTC", "AARDY": "Baby Aardvark", "AARK": "Aark", "AART": "ALL.ART", "AAST": "AASToken", "AAT": "Agricultural Trade Chain", + "AAVAWBTC": "Aave aWBTC", "AAVE": "Aave", "AAVEE": "AAVE.e (Avalanche Bride)", "AAVEGOTCHIFOMO": "Aavegotchi FOMO", @@ -295,7 +307,8 @@ "ADEL": "Akropolis Delphi", "ADF": "Art de Finance", "ADH": "Adhive", - "ADI": "Aditus", + "ADI": "ADI", + "ADITUS": "Aditus", "ADIX": "Adix Token", "ADK": "Aidos Kuneen", "ADL": "Adel", @@ -412,6 +425,7 @@ "AGVC": "AgaveCoin", "AGVE": "Agave", "AGX": "Agricoin", + "AHARWBTC": "Aave Harmony WBTC", "AHOO": "Ahoolee", "AHT": "AhaToken", "AI": "Sleepless", @@ -429,6 +443,7 @@ "AIAI": "All In AI", "AIAKITA": "AiAkita", "AIAT": "AI Analysis Token", + "AIAV": "AI AVatar", "AIB": "AdvancedInternetBlock", "AIBABYDOGE": "AIBabyDoge", "AIBB": "AiBB", @@ -502,6 +517,7 @@ "AIPAD": "AIPAD", "AIPE": "AI Prediction Ecosystem", "AIPEPE": "AI PEPE KING", + "AIPF": "AI Powered Finance", "AIPG": "AI Power Grid", "AIPIN": "AI PIN", "AIPO": "Aipocalypto", @@ -546,7 +562,7 @@ "AIVV1": "AIVille Governance Token", "AIWALLET": "AiWallet Token", "AIWS": "AIWS", - "AIX": "ALIENX", + "AIX": "Ai Xovia", "AIX9": "AthenaX9", "AIXBT": "aixbt by Virtuals", "AIXCB": "aixCB by Virtuals", @@ -619,6 +635,7 @@ "ALIEN": "AlienCoin", "ALIENPEP": "Alien Pepe", "ALIENS": "Aliens", + "ALIENX": "ALIENX", "ALIF": " ALIF COIN", "ALINK": "Aave LINK v1", "ALIS": "ALISmedia", @@ -626,6 +643,7 @@ "ALITA": "Alita Network", "ALITATOKEN": "Alita Token", "ALIX": "AlinX", + "ALK": "Alkemi Network DAO Token", "ALKI": "Alkimi", "ALKIMI": "ALKIMI", "ALLBI": "ALL BEST ICO", @@ -639,6 +657,7 @@ "ALMANAK": "Almanak", "ALMC": "Awkward Look Monkey Club", "ALME": "Alita", + "ALMEELA": "Almeela", "ALMOND": "Almond", "ALN": "Aluna", "ALNV1": "Aluna v1", @@ -690,6 +709,7 @@ "AMAL": "AMAL", "AMAPT": "Amnis Finance", "AMATEN": "Amaten", + "AMATO": "AMATO", "AMAZINGTEAM": "AmazingTeamDAO", "AMB": "AirDAO", "AMBER": "AmberCoin", @@ -698,6 +718,7 @@ "AMBRX": "Amber xStock", "AMBT": "AMBT Token", "AMC": "AI Meta Coin", + "AMCON": "AMC Entertainment (Ondo Tokenized)", "AMDC": "Allmedi Coin", "AMDG": "AMDG", "AMDX": "AMD xStock", @@ -825,6 +846,7 @@ "AOK": "AOK", "AOL": "AOL (America Online)", "AOP": "Ark Of Panda", + "AOPTWBTC": "Aave Optimism WBTC", "AOS": "AOS", "AOT": "Age of Tanks", "AP": "America Party", @@ -861,6 +883,7 @@ "APOL": "Apollo FTW", "APOLL": "Apollon Limassol", "APOLLO": "Apollo Crypto", + "APOLWBTC": "Aave Polygon WBTC", "APP": "Moon App", "APPA": "Dappad", "APPC": "AppCoins", @@ -914,7 +937,9 @@ "ARAW": "Araw", "ARB": "Arbitrum", "ARBI": "Arbipad", + "ARBINU": "ArbInu", "ARBIT": "Arbit Coin", + "ARBITROVE": "Arbitrove Governance Token", "ARBP": "ARB Protocol", "ARBS": "Arbswap", "ARBT": "ARBITRAGE", @@ -1041,6 +1066,7 @@ "ASBNB": "Astherus Staked BNB", "ASC": "All InX SMART CHAIN", "ASCEND": "Ascend", + "ASCN": "AlphaScan", "ASD": "AscendEX Token", "ASDEX": "AstraDEX", "ASEED": "aUSD SEED (Acala)", @@ -1082,6 +1108,7 @@ "ASTA": "ASTA", "ASTER": "Aster", "ASTERINU": "Aster INU", + "ASTHERUSUSDF": "Astherus USDF", "ASTO": "Altered State Token", "ASTON": "Aston", "ASTONV": "Aston Villa Fan Token", @@ -1133,6 +1160,7 @@ "ATLA": "Atleta Network", "ATLAS": "Star Atlas", "ATLASD": "Atlas DEX", + "ATLASOFUSA": "Atlas", "ATLX": "Atlantis Loans Polygon", "ATM": "Atletico de Madrid Fan Token", "ATMA": "ATMA", @@ -1151,6 +1179,7 @@ "ATON": "Further Network", "ATOPLUS": "ATO+", "ATOR": "ATOR Protocol", + "ATOS": "Atoshi", "ATOZ": "Race Kingdom", "ATP": "Atlas Protocol", "ATPAY": "AtPay", @@ -1173,6 +1202,7 @@ "AUCO": "Advanced United Continent", "AUCTION": "Bounce", "AUDC": "Aussie Digital", + "AUDD": "Australian Digital Dollar", "AUDF": "Forte AUD", "AUDIO": "Audius", "AUDM": "Macropod Stablecoin", @@ -1260,6 +1290,7 @@ "AWARE": "ChainAware.ai", "AWARETOKEN": "AWARE", "AWAX": "AWAX", + "AWBTC": "Aave interest bearing WBTC", "AWC": "Atomic Wallet Coin", "AWE": "AWE Network", "AWK": "Awkward Monkey Base", @@ -1302,6 +1333,7 @@ "AXT": "AIX", "AXYS": "Axys", "AYA": "Aryacoin", + "AYFI": "Aave YFI", "AYNI": "Ayni Gold", "AZ": "Azbit", "AZA": "Kaliza", @@ -1314,6 +1346,7 @@ "AZR": "Azure", "AZU": "Azultec", "AZUKI": "Azuki", + "AZUKI2": "AZUKI 2.0", "AZUKIDAO": "AzukiDAO", "AZUM": "Azuma Coin", "AZUR": "Azuro Protocol", @@ -1354,6 +1387,7 @@ "BABYBOME": "Book of Baby Memes", "BABYBOMEOW": "Baby of BOMEOW", "BABYBONK": "Baby Bonk", + "BABYBOOM": "BabyBoomToken", "BABYBOSS": "Baby Boss", "BABYBROC": "Baby Broccoli", "BABYBROCCOL": "Baby Broccoli", @@ -1535,6 +1569,7 @@ "BAOM": "Battle of Memes", "BAOS": "BaoBaoSol", "BAOV1": "BaoToken v1", + "BAP3X": "bAP3X", "BAR": "FC Barcelona Fan Token", "BARA": "Capybara", "BARAKATUH": "Barakatuh", @@ -1599,6 +1634,7 @@ "BB": "BounceBit", "BB1": "Bitbond", "BBADGER": "Badger Sett Badger", + "BBAION": "BigBear.ai Holdings (Ondo Tokenized)", "BBANK": "BlockBank", "BBB": "BitBullBot", "BBBTC": "Big Back Bitcoin", @@ -1632,7 +1668,7 @@ "BBS": "BBSCoin", "BBSNEK": "BabySNEK", "BBSOL": "Bybit Staked SOL", - "BBT": "BabyBoomToken", + "BBT": "BurgerBlastToken", "BBTC": "Binance Wrapped BTC", "BBTF": "Block Buster Tech Inc", "BBUSD": "BounceBit USD", @@ -1678,6 +1714,7 @@ "BCOINM": "Bomb Crypto (MATIC)", "BCOINSOL": "Bomb Crypto (SOL)", "BCOINTON": "Bomb Crypto (TON)", + "BCONG": "BabyCong", "BCOQ": "BLACK COQINU", "BCP": "BlockChainPeople", "BCPAY": "Bitcashpay", @@ -1728,13 +1765,15 @@ "BEAMMW": "Beam", "BEAN": "Bean", "BEANS": "SUNBEANS (BEANS)", - "BEAR": "Bear Inu", + "BEAR": "3X Short Bitcoin Token", "BEARIN": "Bear in Bathrobe", + "BEARINU": "Bear Inu", "BEAST": "MrBeast", "BEAT": "Beat Token", "BEATAI": "eBeat AI", "BEATLES": "JohnLennonC0IN", "BEATS": "Sol Beats", + "BEATSWAP": "BeatSwap", "BEATTOKEN": "BEAT Token", "BEAVER": "beaver", "BEB1M": "BeB", @@ -1816,7 +1855,7 @@ "BES": "battle esports coin", "BESA": "Besa Gaming", "BESHARE": "Beshare Token", - "BEST": "Bitpanda Ecosystem Token", + "BEST": "Best Wallet Token", "BESTC": "BestChain", "BETA": "Beta Finance", "BETACOIN": "BetaCoin", @@ -1851,6 +1890,7 @@ "BFLOKI": "BurnFloki", "BFLY": "Butterfly Protocol", "BFM": "BenefitMine", + "BFR": "Buffer Token", "BFT": "BF Token", "BFTB": "Brazil Fan Token", "BFTC": "BITS FACTOR", @@ -1975,7 +2015,8 @@ "BIPC": "BipCoin", "BIPX": "Bispex", "BIR": "Birake", - "BIRB": "Birb", + "BIRB": "Moonbirds", + "BIRBV1": "Birb", "BIRD": "BIRD", "BIRDCHAIN": "Birdchain", "BIRDD": "BIRD DOG", @@ -2016,6 +2057,7 @@ "BITCOINCONFI": "Bitcoin Confidential", "BITCOINOTE": "BitcoiNote", "BITCOINP": "Bitcoin Private", + "BITCOINSCRYPT": "Bitcoin Scrypt", "BITCOINV": "BitcoinV", "BITCONNECT": "BitConnect Coin", "BITCORE": "BitCore", @@ -2038,6 +2080,7 @@ "BITOK": "BitOKX", "BITONE": "BITONE", "BITORB": "BitOrbit", + "BITPANDA": "Bitpanda Ecosystem Token", "BITRA": "Bitratoken", "BITRADIO": "Bitradio", "BITREWARDS": "BitRewards", @@ -2098,6 +2141,7 @@ "BLACKSALE": "Black Sale", "BLACKST": "Black Stallion", "BLACKSWAN": "BlackSwan AI", + "BLACKWHALE": "The Black Whale", "BLADE": "BladeGames", "BLADEW": "BladeWarrior", "BLAKEBTC": "BlakeBitcoin", @@ -2143,9 +2187,11 @@ "BLOB": "B.O.B the Blob", "BLOBERC20": "Blob", "BLOC": "Blockcloud", - "BLOCK": "Blockasset", + "BLOCK": "Block", + "BLOCKASSET": "Blockasset", "BLOCKB": "Block Browser", "BLOCKBID": "Blockbid", + "BLOCKCHAINTRADED": "Blockchain Traded Fund", "BLOCKF": "Block Farm Club", "BLOCKG": "BlockGames", "BLOCKIFY": "Blockify.Games", @@ -2218,6 +2264,7 @@ "BM": "BitMoon", "BMAGA": "Baby Maga", "BMARS": "Binamars", + "BMAX": "BMAX", "BMB": "Beamable Network Token", "BMBO": "Bamboo Coin", "BMC": "Blackmoon Crypto", @@ -2495,6 +2542,7 @@ "BOWSC": "BowsCoin", "BOWSER": "Bowser", "BOX": "DeBoxToken", + "BOXABL": "BOXABL", "BOXCAT": "BOXCAT", "BOXETH": "Cat-in-a-Box Ether", "BOXT": "BOX Token", @@ -2516,6 +2564,7 @@ "BPD": "Beautiful Princess Disorder", "BPDAI": "Binance-Peg Dai (Binance Bridge)", "BPDOGE": "Binance-Peg DogeZilla (Binance Bridge)", + "BPEPE": "BABY PEPE", "BPEPEF": "Baby Pepe Floki", "BPET": "BPET", "BPINKY": "BPINKY", @@ -2579,6 +2628,7 @@ "BRETTGOLD": "Brett Gold", "BRETTONETH": "Brett ETH", "BRETTSUI": "Brett (brettsui.com)", + "BREV": "Brevis Token", "BREW": "CafeSwap Token", "BREWERY": "Brewery Consortium Coin", "BREWLABS": "Brewlabs", @@ -2737,6 +2787,7 @@ "BTCAS": "BitcoinAsia", "BTCAT": "Bitcoin Cat", "BTCB": "Bitcoin BEP2", + "BTCBAM": "BitCoin Bam", "BTCBASE": "Bitcoin on Base", "BTCBR": "Bitcoin BR", "BTCBRV1": "Bitcoin BR v1", @@ -2752,6 +2803,7 @@ "BTCHD": "Bitcoin HD", "BTCINU": "Bitcoin Inu", "BTCIX": "BITCOLOJIX", + "BTCJ": "Bitcoin (JustCrypto)", "BTCK": "Bitcoin Turbo Koin", "BTCL": "BTC Lite", "BTCM": "BTCMoon", @@ -2767,10 +2819,10 @@ "BTCR": "BitCurrency", "BTCRED": "Bitcoin Red", "BTCRY": "BitCrystal", - "BTCS": "Bitcoin Scrypt", + "BTCS": "BTCs", "BTCSR": "BTC Strategic Reserve", "BTCST": "BTC Standard Hashrate Token", - "BTCT": "Bitcoin Token", + "BTCTOKEN": "Bitcoin Token", "BTCUS": "Bitcoinus", "BTCV": "Bitcoin Vault", "BTCVB": "BitcoinVB", @@ -2782,9 +2834,10 @@ "BTELEGRAM": "BetterTelegram Token", "BTEV1": "Betero v1", "BTEX": "BTEX", - "BTF": "Blockchain Traded Fund", + "BTF": "Bitfinity Network", "BTFA": "Banana Task Force Ape", "BTG": "Bitcoin Gold", + "BTGON": "B2Gold (Ondo Tokenized)", "BTH": "Bithereum", "BTK": "Bostoken", "BTL": "Bitlocus", @@ -2927,13 +2980,16 @@ "BURRRD": "BURRRD", "BURT": "BURT", "BUSD": "Binance USD", + "BUSD0": "Bond USD0", "BUSDC": "BUSD", "BUSY": "Busy DAO", "BUT": "Bucket Token", "BUTT": "Buttercat", + "BUTTC": "Buttcoin", "BUTTCOIN": "The Next Bitcoin", "BUTTHOLE": "Butthole Coin", "BUTTPLUG": "fartcoin killer", + "BUTWHY": "ButWhy", "BUX": "BUX", "BUXCOIN": "Buxcoin", "BUY": "Burency", @@ -2965,6 +3021,7 @@ "BXA": "Blockchain Exchange Alliance", "BXBT": "BoxBet", "BXC": "BonusCloud", + "BXE": "Banxchange", "BXF": "BlackFort Token", "BXH": "BXH", "BXK": "Bitbook Gambling", @@ -3030,7 +3087,7 @@ "CAG": "Change", "CAGA": "Crypto Asset Governance Alliance", "CAH": "Moon Tropica", - "CAI": "Chasm", + "CAI": "CharacterX", "CAID": "ClearAid", "CAILA": "Caila", "CAIR": "Crypto-AI-Robo.com", @@ -3126,7 +3183,8 @@ "CASPER": "Casper DeFi", "CASPERTOKEN": "Casper Token", "CASPUR": "Caspur Zoomies", - "CAST": "Castello Coin", + "CAST": "CAST ORACLES", + "CASTELLOCOIN": "Castello Coin", "CASTLE": "bitCastle", "CAT": "Simon's Cat", "CATA": "CATAMOTO", @@ -3187,6 +3245,7 @@ "CATW": "Cat wif Hands", "CATWARRIOR": "Cat warrior", "CATWIF": "CatWifHat", + "CATWIFM": "catwifmask", "CATX": "CAT.trade Protocol", "CATZ": "CatzCoin", "CAU": "Canxium", @@ -3236,6 +3295,7 @@ "CBX": "CropBytes", "CBXRP": "Coinbase Wrapped XRP", "CBY": "Carbify", + "CBYTE": "CBYTE", "CC": "Canton Coin", "CC10": "Cryptocurrency Top 10 Tokens Index", "CCA": "CCA", @@ -3310,6 +3370,7 @@ "CENTRA": "Centra", "CENTS": "Centience", "CENX": "Centcex", + "CEO": "CEO", "CEODOGE": "CEO DOGE", "CERBER": "CERBEROGE", "CERE": "Cere Network", @@ -3384,12 +3445,14 @@ "CHARGED": "GoCharge Tech", "CHARIZARD": "Charizard Inu", "CHARL": "Charlie", + "CHARLI": "Charlie Trump Dog", "CHARLIE": "Charlie Kirk", "CHARM": "Charm Coin", "CHARS": "CHARS", "CHART": "BetOnChart", "CHARTA": "CHARTAI", "CHARTIQ": "ChartIQ", + "CHAS": "Chasm", "CHASH": "CleverHash", "CHAT": "Solchat", "CHATAI": "ChatAI Token", @@ -3496,6 +3559,7 @@ "CHR": "Chroma", "CHRETT": "Chinese BRETT", "CHRISPUMP": "Christmas Pump", + "CHRONOEFFE": "Chronoeffector", "CHRP": "Chirpley", "CHS": "Chainsquare", "CHSB": "SwissBorg", @@ -3545,6 +3609,7 @@ "CIX100": "Cryptoindex", "CJ": "CryptoJacks", "CJC": "CryptoJournal", + "CJL": "Cjournal", "CJR": "Conjure", "CJT": "ConnectJob Token", "CKB": "Nervos Network", @@ -3564,6 +3629,8 @@ "CLASH": "GeorgePlaysClashRoyale", "CLASHUB": "Clashub", "CLASS": "Class Coin", + "CLAWD": "clawd.atg.eth", + "CLAWNCH": "CLAWNCH", "CLAY": "Clayton", "CLAYN": "Clay Nation", "CLB": "Cloudbric", @@ -3588,7 +3655,8 @@ "CLIN": "Clinicoin", "CLINK": "cLINK", "CLINT": "Clinton", - "CLIPPY": "CLIPPY", + "CLIPPY": "Clippy", + "CLIPPYETH": "CLIPPY", "CLIPS": "Clips", "CLIQ": "DefiCliq", "CLIST": "Chainlist", @@ -3695,7 +3763,8 @@ "COC": "Coin of the champions", "COCAINE": "THE GOOD STUFF", "COCK": "Shibacock", - "COCO": "COCO COIN", + "COCO": "coco", + "COCOCOIN": "COCO COIN", "COCONUT": "Coconut", "COCOR": "Cocoro", "COCORO": "Cocoro", @@ -3726,8 +3795,10 @@ "COI": "Coinnec", "COINAI": "Coinbase AI Agent", "COINB": "Coinbidex", + "COINBANK": "CoinBank", "COINBT": "CoinBot", "COINBUCK": "Coinbuck", + "COINCOLLECT": "CoinCollect", "COINDEALTOKEN": "CoinDeal Token", "COINDEFI": "Coin", "COINDEPO": "CoinDepo Token", @@ -3737,6 +3808,7 @@ "COINLION": "CoinLion", "COINM": "CoinMarketPrime", "COINONAT": "Coinonat", + "COINRADR": "CoinRadr", "COINSCOPE": "Coinscope", "COINSL": "CoinsLoot", "COINVEST": "Coinvest", @@ -3750,11 +3822,12 @@ "COLA": "Cola", "COLISEUM": "Coliseum", "COLL": "Collateral Pay", + "COLLAB": "Collab.Land", "COLLAR": "PolyPup Finance", "COLLAT": "Collaterize", "COLLE": "Collective Care", "COLLEA": "Colle AI", - "COLLECT": "CoinCollect", + "COLLECT": "Collect on Fanable", "COLLG": "Collateral Pay Governance", "COLON": "Colon", "COLR": "colR Coin", @@ -3813,6 +3886,7 @@ "COPIUM": "Copium", "COPPER": "COPPER", "COPS": "Cops Finance", + "COPXON": "Global X Copper Miners ETF (Ondo Tokenized)", "COPYCAT": "Copycat Finance", "COQ": "Coq Inu", "COR": "Coreto", @@ -3890,6 +3964,7 @@ "CPLO": "Cpollo", "CPM": "Crypto Pump Meme", "CPN": "CompuCoin", + "CPNGON": "Coupang (Ondo Tokenized)", "CPO": "Cryptopolis", "CPOO": "Cockapoo", "CPOOL": "Clearpool", @@ -3922,6 +3997,7 @@ "CRAPPY": "CrappyBird", "CRASH": "Solana Crash", "CRASHBOYS": "CRASHBOYS", + "CRAT": "CratD2C", "CRAVE": "CraveCoin", "CRAYRABBIT": "CrazyRabbit", "CRAZ": "CRAZY FLOKI", @@ -3970,6 +4046,7 @@ "CREPECOIN": "Crepe Coin", "CRES": "Cresio", "CRESV1": "Cresio v1", + "CRETA": "Creta World", "CREV": "CryptoRevolution", "CREVA": "Creva Coin", "CREW": "CREW INU", @@ -4356,6 +4433,7 @@ "DANJ": "Danjuan Cat", "DANK": "DarkKush", "DANKDOGE": "Dank Doge", + "DANKDOGEAI": "DankDogeAI", "DANNY": "Degen Danny", "DAO": "DAO Maker", "DAO1": "DAO1", @@ -4778,8 +4856,10 @@ "DINGER": "Dinger Token", "DINGO": "Dingocoin", "DINNER": "Trump Dinner", - "DINO": "DinoLFG", + "DINO": "DINO", + "DINOLFG": "DinoLFG", "DINOS": "Dinosaur Inu", + "DINOSOL": "DINOSOL", "DINOSWAP": "DinoSwap", "DINT": "DinarTether", "DINU": "Dogey-Inu", @@ -4840,6 +4920,7 @@ "DLXV": "Delta-X", "DLY": "Daily Finance", "DLYCOP": "Daily COP", + "DM": "Dumb Money", "DMA": "Dragoma", "DMAGA": "Dark MAGA", "DMAIL": "DMAIL Network", @@ -4863,6 +4944,7 @@ "DMTR": "Dimitra", "DMX": "Dymmax", "DMZ": "DeMon Token", + "DN": "DeepNode", "DN8": "Pldgr", "DNA": "Metaverse", "DNAPEPE": "DNA PEPE", @@ -4872,6 +4954,7 @@ "DNFLX": "Netflix Tokenized Stock Defichain", "DNFT": "DareNFT", "DNN": "DNN Token", + "DNNON": "Denison Mines (Ondo Tokenized)", "DNO": "Denaro", "DNODE": "DecentraNode", "DNOTES": "Dnotes", @@ -4947,6 +5030,7 @@ "DOGEIN": "Doge In Glasses", "DOGEINU": "Doge Inu", "DOGEIUS": "DOGEIUS", + "DOGEJ": "Dogecoin (JustCrypto)", "DOGEKING": "DogeKing", "DOGELEGION": "DOGE LEGION", "DOGEM": "Doge Matrix", @@ -4974,6 +5058,7 @@ "DOGEZILLA": "DogeZilla", "DOGEZILLAV1": "DogeZilla v1", "DOGG": "Doggo", + "DOGGO": "DOGGO", "DOGGS": "Doggensnout", "DOGGY": "Doggy", "DOGGYCOIN": "DOGGY", @@ -5035,7 +5120,8 @@ "DONKEY": "donkey", "DONNIEFIN": "Donnie Finance", "DONS": "The Dons", - "DONT": "Donald Trump (dont.cash)", + "DONT": "DisclaimerCoin", + "DONTCASH": "DONT", "DONU": "Donu", "DONUT": "Donut", "DONUTS": "The Simpsons", @@ -5390,6 +5476,7 @@ "ECET": "Evercraft Ecotechnologies", "ECG": "EcoSmart", "ECH": "EthereCash", + "ECHELON": "Echelon Token", "ECHO": "Echo", "ECHOBOT": "ECHO BOT", "ECHOD": "EchoDEX", @@ -5487,6 +5574,7 @@ "EGGC": "EggCoin", "EGGMAN": "Eggman Inu", "EGGP": "Eggplant Finance", + "EGGT": "Egg N Partners", "EGGY": "EGGY", "EGI": "eGame", "EGL": "The Eagle Of Truth", @@ -5507,6 +5595,7 @@ "EHASH": "EHash", "EHIVE": "eHive", "EHRT": "Eight Hours Token", + "EICOIN": "EICOIN", "EIFI": "EIFI FINANCE", "EIGEN": "EigenLayer", "EIGENP": "Eigenpie", @@ -5591,6 +5680,7 @@ "ELONTRUMP": "ELON TRUMP", "ELP": "Ellerium", "ELS": "Ethlas", + "ELSA": "Elsa", "ELT": "Element Black", "ELTC2": "eLTC", "ELTCOIN": "ELTCOIN", @@ -5661,6 +5751,7 @@ "ENEDEX": "Enedex", "ENERGYLEDGER": "Energy Ledger", "ENERGYX": "Safe Energy", + "ENEXSPACE": "ENEX", "ENF": "enfineo", "ENG": "Enigma", "ENGT": "Engagement Token", @@ -5683,6 +5774,7 @@ "ENTER": "EnterCoin", "ENTR": "EnterDAO", "ENTRC": "ENTER COIN", + "ENTROPY": "Entropy", "ENTRP": "Hut34 Project", "ENTRY": "ENTRY", "ENTS": "Ents", @@ -5692,7 +5784,7 @@ "ENVIENTA": "Envienta", "ENVION": "Envion", "ENVOY": "Envoy A.I", - "ENX": "ENEX", + "ENX": "Enigma", "EOC": "EveryonesCoin", "EON": "Exscudo", "EONC": "Dimension", @@ -5711,6 +5803,7 @@ "EPETS": "Etherpets", "EPIC": "Epic Chain", "EPICCASH": "Epic Cash", + "EPICV1": "Ethernity Chain", "EPIK": "EPIK Token", "EPIKO": "Epiko", "EPIX": "Byepix", @@ -5743,6 +5836,7 @@ "ERA7": "Era Token", "ERASWAP": "Era Swap Token", "ERB": "ERBCoin", + "ERBB": "Exchange Request for Bitbon", "ERC": "EuropeCoin", "ERC20": "ERC20", "ERC20V1": "ERC20 v1", @@ -5781,7 +5875,7 @@ "ESGC": "ESG Chain", "ESH": "Switch", "ESHIB": "Euro Shiba Inu", - "ESIM": "EvoSimGame", + "ESIM": "DEPINSIM Token", "ESM": "EL SALVADOR MEME", "ESN": "Ethersocial", "ESNC": "Galaxy Arena Metaverse", @@ -5832,6 +5926,7 @@ "ETHEREM": "Etherempires", "ETHEREUMMEME": "Solana Ethereum Meme", "ETHEREUMP": "ETHEREUMPLUS", + "ETHEREUMSCRYPT": "EthereumScrypt", "ETHERINC": "EtherInc", "ETHERKING": "Ether Kingdoms Token", "ETHERNITY": "Ethernity Chain", @@ -5842,6 +5937,7 @@ "ETHFI": "Ether.fi", "ETHI": "Ethical Finance", "ETHIX": "EthicHub", + "ETHJ": "Ethereum (JustCrypto)", "ETHM": "Ethereum Meta", "ETHO": "The Etho Protocol", "ETHOS": "Ethos Project", @@ -5853,7 +5949,7 @@ "ETHPR": "Ethereum Premium", "ETHPY": "Etherpay", "ETHR": "Ethereal", - "ETHS": "EthereumScrypt", + "ETHS": "Ethscriptions", "ETHSHIB": "Eth Shiba", "ETHV": "Ethverse", "ETHW": "Ethereum PoW", @@ -5914,6 +6010,7 @@ "EURU": "Upper Euro", "EURX": "eToro Euro", "EUSD": "Egoras Dollar", + "EUSX": "eUSX", "EUT": "EarnUp Token", "EUTBL": "Spiko EU T-Bills Money Market Fund", "EV": "EVAI", @@ -5952,6 +6049,7 @@ "EVOC": "EVOCPLUS", "EVOL": "EVOL NETWORK", "EVOS": "EVOS", + "EVOSIM": "EvoSimGame", "EVOVERSES": "EvoVerses", "EVR": "Everus", "EVRICE": "Evrice", @@ -6026,6 +6124,7 @@ "F2C": "Ftribe Fighters", "F2K": "Farm2Kitchen", "F3": "Friend3", + "F5": "F5-promoT5", "F7": "Five7", "F9": "Falcon Nine", "FAB": "FABRK Token", @@ -6066,6 +6165,7 @@ "FAN": "Fanadise", "FAN360": "Fan360", "FANC": "fanC", + "FANCYTHATTOKEN": "Fancy That", "FAND": "Fandomdao", "FANG": "FANG Token", "FANS": "Fantasy Cash", @@ -6140,6 +6240,7 @@ "FCTC": "FaucetCoin", "FCTR": "FactorDAO", "FDC": "Fidance", + "FDGC": "FINTECH DIGITAL GOLD COIN", "FDLS": "FIDELIS", "FDM": "Fandom", "FDO": "Firdaos", @@ -6211,6 +6312,7 @@ "FIC": "Filecash", "FID": "Fidira", "FIDA": "Bonfida", + "FIDD": "Fidelity Digital Dollar", "FIDLE": "Fidlecoin", "FIDO": "FIDO", "FIDU": "Fidu", @@ -6287,6 +6389,7 @@ "FK": "FK Coin", "FKBIDEN": "Fkbiden", "FKGARY": "Fuck Gary Gensler", + "FKH": "Flying Ketamine Horse", "FKPEPE": "Fuck Pepe", "FKR": "Flicker", "FKRPRO": "FlickerPro", @@ -6412,7 +6515,7 @@ "FNB": "FNB protocol", "FNC": "Fancy Games", "FNCT": "Financie Token", - "FNCY": "Fancy That", + "FNCY": "FNCY", "FND": "Rare FND", "FNDZ": "FNDZ Token", "FNF": "FunFi", @@ -6440,7 +6543,10 @@ "FOFARIO": "Fofar", "FOFO": "FOFO", "FOFOTOKEN": "FOFO Token", + "FOG": "FOGnet", "FOGE": "Fat Doge", + "FOGO": "Fogo", + "FOGV1": "FOGnet v1", "FOIN": "Foin", "FOL": "Folder Protocol", "FOLD": "Manifold Finance", @@ -6466,6 +6572,7 @@ "FORA": "UFORIKA", "FORCE": "TriForce Tokens", "FORCEC": "Force Coin", + "FORDON": "Ford Motor (Ondo Tokenized)", "FORE": "FORE Protocol", "FOREFRONT": "Forefront", "FOREST": "Forest", @@ -6595,6 +6702,7 @@ "FRR": "Frontrow", "FRSP": "Forkspot", "FRST": "FirstCoin", + "FRT": "FORT Token", "FRTC": "FART COIN", "FRTN": "EbisusBay Fortune", "FRTS": "Fruits", @@ -6709,6 +6817,7 @@ "FWB": "Friends With Benefits Pro", "FWBV1": "Friends With Benefits Pro v1", "FWC": "Qatar 2022", + "FWCL": "Legends", "FWH": "FigureWifHat", "FWOG": "Fwog", "FWT": "Freeway Token", @@ -6824,6 +6933,7 @@ "GASP": "GASP", "GASPCOIN": "gAsp", "GASS": "Gasspas", + "GAST": "Gas Town", "GASTRO": "GastroCoin", "GAT": "Gather", "GATA": "Gata", @@ -7042,6 +7152,7 @@ "GIGASWAP": "GigaSwap", "GIGGLE": "Giggle Fund", "GIGGLEACADEMY": "Giggle Academy", + "GIGL": "GIGGLE PANDA", "GIGS": "Climate101", "GIGX": "GigXCoin", "GIKO": "Giko Cat", @@ -7131,6 +7242,7 @@ "GMDP": "GMD Protocol", "GME": "GameStop", "GMEE": "GAMEE", + "GMEON": "GameStop (Ondo Tokenized)", "GMEPEPE": "GAMESTOP PEPE", "GMETHERFRENS": "GM", "GMETRUMP": "GME TRUMP", @@ -7209,6 +7321,7 @@ "GOFINDXR": "Gofind XR", "GOFX": "GooseFX", "GOG": "Guild of Guardians", + "GOGE": "GOLD DOGE", "GOGLZ": "GOGGLES", "GOGLZV1": "GOGGLES v1", "GOGO": "GOGO Finance", @@ -7319,10 +7432,12 @@ "GPU": "Node AI", "GPUCOIN": "GPU Coin", "GPUINU": "GPU Inu", + "GPUNET": "GPUnet", "GPX": "GPEX", "GQ": "Galactic Quadrant", "GR": "GROM", "GRAB": "GRABWAY", + "GRABON": "Grab Holdings (Ondo Tokenized)", "GRACY": "Gracy", "GRAI": "Gravita Protocol", "GRAIL": "Camelot Token", @@ -7331,6 +7446,7 @@ "GRAND": "Grand Theft Ape", "GRANDCOIN": "GrandCoin", "GRANDMA": "Grandma", + "GRANT": "GrantiX Token", "GRAPE": "GrapeCoin", "GRAPHGRAIAI": "GraphGrail AI", "GRASS": "Grass", @@ -7455,6 +7571,7 @@ "GTAN": "Giant Token", "GTAVI": "GTAVI", "GTBOT": "Gaming-T-Bot", + "GTBTC": "Gate Wrapped BTC", "GTC": "Gitcoin", "GTCC": "GTC COIN", "GTCOIN": "Game Tree", @@ -7517,6 +7634,7 @@ "GVT": "Genesis Vision", "GW": "Gyrowin", "GWD": "GreenWorld", + "GWEI": "ETHGas", "GWGW": "GoWrap", "GWT": "Galaxy War", "GX": "GameX", @@ -7558,6 +7676,7 @@ "HACHIKO": "Hachiko Inu Token", "HACHIONB": "Hachi On Base", "HACK": "HACK", + "HADES": "Hades", "HAEDAL": "Haedal Protocol", "HAGGIS": "New Born Haggis Pygmy Hippo", "HAHA": "Hasaki", @@ -7572,6 +7691,7 @@ "HALF": "0.5X Long Bitcoin Token", "HALFP": "Half Pizza", "HALFSHIT": "0.5X Long Shitcoin Index Token", + "HALIS": "Halis", "HALLO": "Halloween Coin", "HALLOWEEN": "HALLOWEEN", "HALO": "Halo Coin", @@ -7772,6 +7892,7 @@ "HIENS3": "hiENS3", "HIENS4": "hiENS4", "HIFI": "Hifi Finance", + "HIFIDENZA": "hiFIDENZA", "HIFLUF": "hiFLUF", "HIFRIENDS": "hiFRIENDS", "HIGAZERS": "hiGAZERS", @@ -7811,6 +7932,7 @@ "HITBTC": "HitBTC Token", "HITOP": "Hitop", "HIUNDEAD": "hiUNDEAD", + "HIVALHALLA": "hiVALHALLA", "HIVE": "Hive", "HIVP": "HiveSwap", "HIX": "HELIX Orange", @@ -7829,13 +7951,13 @@ "HLG": "Holograph", "HLINK": "Chainlink (Harmony One Bridge)", "HLM": "Helium", - "HLN": "Holonus", + "HLN": "Ēnosys", "HLO": "Halo", "HLOV1": "Halo v1", "HLP": "Purpose Coin", "HLPR": "HELPER COIN", "HLPT": "HLP Token", - "HLS": "Halis", + "HLS": "Helios", "HLT": "HyperLoot", "HLTC": "Huobi LTC", "HLX": "Helex", @@ -7894,6 +8016,7 @@ "HOLDON4": "HoldOn4DearLife", "HOLDS": "Holdstation", "HOLO": "Holoworld", + "HOLON": "Holonus", "HOLY": "Holy Trinity", "HOM": "Homeety", "HOME": "Home", @@ -7984,6 +8107,7 @@ "HSN": "Hyper Speed Network", "HSOL": "Helius Staked SOL", "HSP": "Horse Power", + "HSR": "Hshare", "HSS": "Hashshare", "HST": "Decision Token", "HSUI": "Suicune", @@ -8005,6 +8129,7 @@ "HTN": "Hoosat Network", "HTO": "Heavenland HTO", "HTR": "Hathor", + "HTS": "Home3", "HTT": "Hello Art", "HTX": "HTX", "HTZ": "Hertz Network", @@ -8111,6 +8236,7 @@ "IAI": "inheritance Art", "IAM": "IAME Identity", "IAOMIN": "Yao Ming", + "IAUON": "iShares Gold Trust (Ondo Tokenized)", "IB": "Iron Bank", "IBANK": "iBankCoin", "IBAT": "Battle Infinity", @@ -8179,6 +8305,7 @@ "IDLE": "IDLE", "IDM": "IDM", "IDNA": "Idena", + "IDNG": "IDNGold", "IDO": "Idexo", "IDOL": "MEET48 Token", "IDOLINU": "IDOLINU", @@ -8268,7 +8395,7 @@ "IMS": "Independent Money System", "IMST": "Imsmart", "IMT": "Immortal Token", - "IMU": "imusify", + "IMUSIFY": "imusify", "IMVR": "ImmVRse", "IMX": "Immutable X", "IN": "INFINIT", @@ -8342,12 +8469,14 @@ "INSPI": "InspireAI", "INSR": "Insurabler", "INSTAMINE": "Instamine Nuggets", + "INSTANTSPONSOR": "Instant Sponsor Token", "INSTAR": "Insights Network", "INSUR": "InsurAce", "INSURANCE": "insurance", "INSURC": "InsurChain Coin", "INSUREDFIN": "Insured Finance", "INT": "Internet Node token", + "INTCON": "Intel (Ondo Tokenized)", "INTCX": "Intel xStock", "INTD": "INTDESTCOIN", "INTE": "InteractWith", @@ -8427,9 +8556,11 @@ "IQN": "IQeon", "IQQ": "Iqoniq", "IQT": "IQ Protocol", + "IR": "Infrared Governance Token", "IRA": "Diligence", "IRC": "IRIS", "IRENA": "Irena Coin Apps", + "IRENON": "IREN (Ondo Tokenized)", "IRIS": "IRIS Network", "IRISTOKEN": "Iris Ecosystem", "IRL": "IrishCoin", @@ -8503,6 +8634,7 @@ "IVZ": "InvisibleCoin", "IW": "iWallet", "IWFT": "İstanbul Wild Cats", + "IWMON": "iShares Russell 2000 ETF (Ondo Tokenized)", "IWT": "IwToken", "IX": "X-Block", "IXC": "IXcoin", @@ -8527,6 +8659,7 @@ "J9BC": "J9CASINO", "JACK": "Jack Token", "JACKPOT": "Solana Jackpot", + "JACKSON": "Jackson", "JACS": "JACS", "JACY": "JACY", "JADE": "Jade Protocol", @@ -8558,6 +8691,7 @@ "JAWN": "Long Jawn Silvers", "JAWS": "AutoShark", "JAY": "Jaypeggers", + "JBC": "Japan Brand Coin", "JBO": "JBOX", "JBOT": "JACKBOT", "JBS": "JumBucks Coin", @@ -8596,6 +8730,7 @@ "JERRYINUCOM": "Jerry Inu", "JES": "Jesus", "JESSE": "jesse", + "JESSECOIN": "jesse", "JEST": "Jester", "JESUS": "Jesus Coin", "JET": "Jet Protocol", @@ -8603,6 +8738,7 @@ "JETCOIN": "Jetcoin", "JETFUEL": "Jetfuel Finance", "JETTON": "JetTon Game", + "JETUSD": "JETUSD", "JEUR": "Jarvis Synthetic Euro", "JEW": "Shekel", "JEWEL": "DeFi Kingdoms", @@ -8624,6 +8760,7 @@ "JIM": "Jim", "JIN": "JinPeng", "JIND": "JINDO INU", + "JINDO": "JINDOGE", "JINDOGE": "Jindoge", "JIO": "JIO Token", "JITOSOL": "Jito Staked SOL", @@ -8650,6 +8787,7 @@ "JNX": "Janex", "JNY": "JNY", "JOB": "Jobchain", + "JOBCOIN": "buy instead of getting a job", "JOBIESS": "JobIess", "JOBS": "JobsCoin", "JOBSEEK": "JobSeek AI", @@ -8665,7 +8803,8 @@ "JOHNNY": "Johnny The Bull", "JOINCOIN": "JoinCoin", "JOINT": "Joint Ventures", - "JOJO": "JOJO", + "JOJO": "JOJOWORLD", + "JOJOSCLUB": "JOJO", "JOJOTOKEN": "JOJO", "JOK": "JokInTheBox", "JOKER": "JOKER", @@ -8749,6 +8888,7 @@ "JWBTC": "Wrapped Bitcoin (TON Bridge)", "JWIF": "Jerrywifhat", "JWL": "Jewels", + "JWT": "JW Token", "JYAI": "Jerry The Turtle By Matt Furie", "JYC": "Joe-Yo Coin", "K": "Sidekick", @@ -8757,7 +8897,13 @@ "KAAI": "KanzzAI", "KAAS": "KAASY.AI", "KAB": "KABOSU", - "KABOSU": "Kabosu Family", + "KABOSU": "X Meme Dog", + "KABOSUCOIN": "Kabosu", + "KABOSUCOM": "Kabosu", + "KABOSUFAMILY": "Kabosu Family", + "KABOSUTOKEN": "Kabosu", + "KABOSUTOKENETH": "KABOSU", + "KABUTO": "Kabuto", "KABY": "Kaby Arena", "KAC": "KACO Finance", "KACY": "markkacy", @@ -8865,6 +9011,7 @@ "KDC": "Klondike Coin", "KDG": "Kingdom Game 4.0", "KDIA": "KDIA COIN", + "KDK": "Kodiak Token", "KDOE": "Kudoe", "KDOGE": "KingDoge", "KDT": "Kenyan Digital Token", @@ -8926,6 +9073,7 @@ "KGC": "Krypton Galaxy Coin", "KGEN": "KGeN", "KGO": "Kiwigo", + "KGST": "KGST", "KGT": "Kaby Gaming Token", "KHAI": "khai", "KHEOWZOO": "khaokheowzoo", @@ -9055,6 +9203,7 @@ "KNDC": "KanadeCoin", "KNDM": "Kingdom", "KNDX": "Kondux", + "KNEKTED": "Knekted", "KNFT": "KStarNFT", "KNG": "BetKings", "KNGN": "KingN Coin", @@ -9067,13 +9216,14 @@ "KNOW": "KNOW", "KNOX": "KnoxDAO", "KNS": "Kenshi", - "KNT": "Knekted", + "KNT": "KayakNet", "KNTO": "Kento", "KNTQ": "Kinetiq Governance Token", "KNU": "Keanu", "KNUT": "Knut From Zoo", "KNUXX": "Knuxx Bully of ETH", "KNW": "Knowledge", + "KO": "Kyuzo's Friends", "KOAI": "KOI", "KOALA": "KOALA", "KOBAN": "KOBAN", @@ -9089,6 +9239,7 @@ "KOII": "Koii", "KOIN": "Koinos", "KOINB": "KoinBülteni Token", + "KOINDEX": "KOIN", "KOINETWORK": "Koi Network", "KOIP": "KoiPond", "KOJI": "Koji", @@ -9548,16 +9699,18 @@ "LIQUIDIUM": "LIQUIDIUM•TOKEN", "LIR": "Let it Ride", "LIS": "Realis Network", - "LISA": "Lisa Simpson", + "LISA": "LISA Token", "LISAS": "Lisa Simpson", + "LISASIMPSONCLUB": "Lisa Simpson", "LIST": "KList Protocol", "LISTA": "Lista DAO", "LISTEN": "Listen", "LISUSD": "lisUSD", - "LIT": "Litentry", + "LIT": "Lighter", "LITE": "Lite USD", "LITEBTC": "LiteBitcoin", "LITENETT": "Litenett", + "LITENTRY": "Litentry", "LITH": "Lithium Finance", "LITHIUM": "Lithium", "LITHO": "Lithosphere", @@ -9566,7 +9719,7 @@ "LITTLEGUY": "just a little guy", "LITTLEMANYU": "Little Manyu", "LIV": "LiviaCoin", - "LIVE": "TRONbetLive", + "LIVE": "SecondLive", "LIVENCOIN": "LivenPay", "LIVESEY": "Dr. Livesey", "LIVESTARS": "Live Stars", @@ -9689,7 +9842,7 @@ "LORY": "Yield Parrot", "LOS": "Lord Of SOL", "LOST": "Lost Worlds", - "LOT": "Lukki Operating Token", + "LOT": "League of Traders", "LOTES": "Loteo", "LOTEU": "Loteo", "LOTT": "Beauty bakery lott", @@ -9732,6 +9885,7 @@ "LQT": "Lifty", "LQTY": "Liquity", "LRC": "Loopring", + "LRCV1": "Loopring v1", "LRDS": "BLOCKLORDS", "LRG": "Largo Coin", "LRN": "Loopring [NEO]", @@ -9764,6 +9918,7 @@ "LTCC": "Listerclassic Coin", "LTCD": "LitecoinDark", "LTCH": "Litecoin Cash", + "LTCJ": "Litecoin (JustCrypto)", "LTCP": "LitecoinPro", "LTCR": "LiteCreed", "LTCU": "LiteCoin Ultra", @@ -9815,6 +9970,7 @@ "LUFFYV1": "Luffy v1", "LUIGI": "Luigi Inu", "LUIS": "Tongue Cat", + "LUKKI": "Lukki Operating Token", "LULU": "LULU", "LUM": "Luminous", "LUMA": "LUMA Token", @@ -9901,6 +10057,7 @@ "M0": "M by M^0", "M1": "SupplyShock", "M2O": "M2O Token", + "M3H": "MehVerseCoin", "M3M3": "M3M3", "M87": "MESSIER", "MA": "Mind-AI", @@ -9919,6 +10076,8 @@ "MADOG": "MarvelDoge", "MADP": "Mad Penguin", "MADPEPE": "Mad Pepe", + "MADU": "Nicolas Maduro", + "MADURO": "MADURO", "MAECENAS": "Maecenas", "MAEP": "Maester Protocol", "MAF": "MetaMAFIA", @@ -9950,6 +10109,7 @@ "MAGICK": "Cosmic Universe Magick", "MAGICV": "Magicverse", "MAGIK": "Magik Finance", + "MAGMA": "MAGMA", "MAGN": "Magnate Finance", "MAGNE": "Magnetix", "MAGNET": "Yield Magnet", @@ -10018,6 +10178,7 @@ "MAPS": "MAPS", "MAPU": "MatchAwards Platform Utility Token", "MAR3": "Mar3 AI", + "MARAON": "MARA Holdings (Ondo Tokenized)", "MARCO": "MELEGA", "MARCUS": "Marcus Cesar Inu", "MARE": "Mare Finance", @@ -10044,6 +10205,7 @@ "MARSMI": "MarsMi", "MARSO": "Marso.Tech", "MARSRISE": "MarsRise", + "MARSTOKEN": "Mars Token", "MARSUPILAMI": "MARSUPILAMI INU", "MARSW": "Marswap", "MART": "ArtMeta", @@ -10071,7 +10233,7 @@ "MASTERMIX": "Master MIX Token", "MASTERTRADER": "MasterTraderCoin", "MASYA": "MASYA", - "MAT": "My Master Wa", + "MAT": "Matchain", "MATA": "Ninneko", "MATAR": "MATAR AI", "MATCH": "Matching Game", @@ -10179,6 +10341,7 @@ "MCIV": "Mars Civ Project", "MCL": "McLaren F1", "MCLB": "Millennium Club Coin", + "MCM": "Mochimo", "MCN": "mCoin", "MCO": "Crypto.com", "MCO2": "Moss Carbon Credit", @@ -10198,6 +10361,7 @@ "MCU": "MediChain", "MCUSD": "Moola Celo USD", "MCV": "MCV Token", + "MCX": "MachiX Token", "MD": "MetaDeck", "MDA": "Moeda", "MDAI": "MindAI", @@ -10248,6 +10412,7 @@ "MEF": "MEFLEX", "MEFA": "Metaverse Face", "MEFAI": "META FINANCIAL AI", + "MEFI": "Meo Finance", "MEGA": "MegaFlash", "MEGABOT": "Megabot", "MEGAD": "Mega Dice Casino", @@ -10286,6 +10451,7 @@ "MEMEAI": "Meme Ai", "MEMEBRC": "MEME", "MEMECOIN": "just memecoin", + "MEMECOINDAOAI": "MemeCoinDAO", "MEMECUP": "Meme Cup", "MEMEETF": "Meme ETF", "MEMEFI": "MemeFi", @@ -10297,7 +10463,7 @@ "MEMEMUSK": "MEME MUSK", "MEMENTO": "MEMENTO•MORI (Runes)", "MEMERUNE": "MEME•ECONOMICS", - "MEMES": "MemeCoinDAO", + "MEMES": "memes will continue", "MEMESAI": "Memes AI", "MEMESQUAD": "Meme Squad", "MEMET": "MEMETOON", @@ -10366,6 +10532,7 @@ "METANIAV1": "METANIAGAMES", "METANO": "Metano", "METAPK": "Metapocket", + "METAPLACE": "Metaplace", "METAQ": "MetaQ", "METAS": "Metaseer", "METAT": "MetaTrace", @@ -10484,7 +10651,7 @@ "MIININGNFT": "MiningNFT", "MIKE": "Mike", "MIKS": "MIKS COIN", - "MIL": "Milllionaire Coin", + "MIL": "Mil", "MILA": "MILADY MEME TOKEN", "MILC": "Micro Licensing Coin", "MILE": "milestoneBased", @@ -10497,6 +10664,7 @@ "MILLI": "Million", "MILLIM": "Millimeter", "MILLIMV1": "Millimeter v1", + "MILLLIONAIRECOIN": "Milllionaire Coin", "MILLY": "milly", "MILO": "Milo Inu", "MILOCEO": "Milo CEO", @@ -10510,6 +10678,7 @@ "MIMO": "MIMO Parallel Governance Token", "MIN": "MINDOL", "MINA": "Mina Protocol", + "MINAR": "Miner Arena", "MINC": "MinCoin", "MIND": "Morpheus Labs", "MINDBODY": "Mind Body Soul", @@ -10766,6 +10935,7 @@ "MOLK": "Mobilink Token", "MOLLARS": "MollarsToken", "MOLLY": "Molly", + "MOLT": "Moltbook", "MOM": "Mother of Memes", "MOMA": "Mochi Market", "MOMIJI": "MAGA Momiji", @@ -10781,6 +10951,7 @@ "MONAV": "Monavale", "MONB": "MonbaseCoin", "MONDO": "mondo", + "MONEROAI": "Monero AI", "MONEROCHAN": "Monerochan", "MONET": "Claude Monet Memeory Coin", "MONETA": "Moneta", @@ -10889,6 +11060,7 @@ "MOTIONCOIN": "Motion", "MOTO": "Motocoin", "MOUND": "Mound Token", + "MOUNTA": "Mountain Protocol", "MOUTAI": "Moutai", "MOV": "MovieCoin", "MOVD": "MOVE Network", @@ -10911,7 +11083,7 @@ "MPAA": "MPAA", "MPAD": "MultiPad", "MPAY": "Menapay", - "MPC": "Metaplace", + "MPC": "Partisia Blockchain", "MPD": "Metapad", "MPG": "Max Property Group", "MPH": "Morpher", @@ -10970,6 +11142,7 @@ "MSCT": "MUSE ENT NFT", "MSD": "MSD", "MSFT": "Microsoft 6900", + "MSFTON": "Microsoft (Ondo Tokenized)", "MSFTX": "Microsoft xStock", "MSG": "MsgSender", "MSGO": "MetaSetGO", @@ -10993,6 +11166,7 @@ "MSTRX": "MicroStrategy xStock", "MSU": "MetaSoccer", "MSUSHI": "Sushi (Multichain)", + "MSVP": "MetaSoilVerseProtocol", "MSWAP": "MoneySwap", "MT": "Mint Token", "MTA": "Meta", @@ -11010,6 +11184,7 @@ "MTHB": "MTHAIBAHT", "MTHD": "Method Finance", "MTHN": "MTH Network", + "MTHT": "MetaHint", "MTIK": "MatikaToken", "MTIX": "Matrix Token", "MTK": "Moya Token", @@ -11072,6 +11247,7 @@ "MUNITY": "Metahorse Unity", "MUNK": "Dramatic Chipmunk", "MUNSUN": "MUNSUN", + "MUON": "Micron Technology (Ondo Tokenized)", "MURA": "Murasaki", "MURATIAI": "MuratiAI", "MUSCAT": "MusCat", @@ -11119,9 +11295,11 @@ "MWD": "MEW WOOF DAO", "MWETH": "Moonwell Flagship ETH (Morpho Vault)", "MWH": "Melania Wif Hat", + "MWT": "Mountain Wolf Token", "MWXT": "MWX Token", "MX": "MX Token", - "MXC": "Machine Xchange Coin", + "MXC": "MXC Token", + "MXCV1": "Machine Xchange Coin v1", "MXD": "Denarius", "MXGP": "MXGP Fan Token", "MXM": "Maximine", @@ -11144,10 +11322,12 @@ "MYL": "MyLottoCoin", "MYLINX": "Linx", "MYLO": "MYLOCAT", + "MYMASTERWAR": "My Master Wa", "MYNE": "ITSMYNE", "MYO": "Mycro", "MYOBU": "Myōbu", "MYRA": "Mytheria", + "MYRC": "MYRC", "MYRE": "Myre", "MYRIA": "Myria", "MYRO": "Myro", @@ -11175,6 +11355,7 @@ "N3": "Network3", "N3DR": "NeorderDAO ", "N3ON": "N3on", + "N4T": "Nobel For Trump", "N64": "N64", "N7": "Number7", "N8V": "NativeCoin", @@ -11389,6 +11570,7 @@ "NEWSTOKENS": "NewsTokens", "NEWT": "Newton Protocol", "NEWTON": "Newtonium", + "NEWYORKCOIN": "NewYorkCoin", "NEX": "Nash Exchange", "NEXA": "Nexa", "NEXAI": "NexAI", @@ -11416,6 +11598,7 @@ "NFCR": "NFCore", "NFD": "Feisty Doge NFT", "NFE": "Edu3Labs", + "NFLXON": "Netflix (Ondo Tokenized)", "NFLXX": "Netflix xStock", "NFM": "NFMart", "NFN": "Nafen", @@ -11453,6 +11636,7 @@ "NGL": "Entangle", "NGM": "e-Money", "NGMI": "NGMI Coin", + "NGNT": "Naira Token", "NGTG": "NUGGET TRAP", "NHCT": "Nano Healthcare Token", "NHI": "Non Human Intelligence", @@ -11464,6 +11648,7 @@ "NIC": "NewInvestCoin", "NICE": "Nice", "NICEC": "NiceCoin", + "NIETZSCHEAN": "Nietzschean Penguin", "NIF": "Unifty", "NIFT": "Niftify", "NIFTSY": "Envelop", @@ -11495,6 +11680,7 @@ "NINU": "Nvidia Inu", "NIOB": "Niob Finance", "NIOCTIB": "nioctiB", + "NIOON": "NIO (Ondo Tokenized)", "NIOX": "Autonio", "NIOXV1": "Autonio v1", "NIOXV2": "Autonio v2", @@ -11550,6 +11736,7 @@ "NOBS": "No BS Crypto", "NOC": "Nono Coin", "NOCHILL": "AVAX HAS NO CHILL", + "NOCK": "Nockchain", "NODE": "NodeOps", "NODELYAI": "NodelyAI", "NODESYNAPSE": "NodeSynapse", @@ -11595,7 +11782,9 @@ "NOTDOG": "NOTDOG", "NOTE": "Republic Note", "NOTECANTO": "Note", - "NOTHING": "NOTHING", + "NOTHING": "Youll own nothing & be happy", + "NOTHINGCASH": "NOTHING", + "NOTIFAI": "NotifAi News", "NOTINU": "NOTCOIN INU", "NOTIONAL": "Notional Finance", "NOV": "Novara Calcio Fan Token", @@ -11611,6 +11800,7 @@ "NPER": "NPER", "NPICK": "NPICK BLOCK", "NPLC": "Plus Coin", + "NPLCV1": "PlusCoin v1", "NPM": "Neptune Mutual", "NPRO": "NPRO", "NPT": "Neopin", @@ -11624,6 +11814,7 @@ "NRCH": "EnreachDAO", "NRFB": "NuriFootBall", "NRG": "Energi", + "NRGE": "New Resources Generation Energy", "NRGY": "NRGY Defi", "NRK": "Nordek", "NRM": "Neuromachine", @@ -11703,6 +11894,7 @@ "NVA": "Neeva Defi", "NVB": "NovaBank", "NVC": "NovaCoin", + "NVDAON": "NVIDIA (Ondo Tokenized)", "NVDAX": "NVIDIA xStock", "NVDX": "Nodvix", "NVG": "NightVerse Game", @@ -11722,6 +11914,7 @@ "NWIF": "neirowifhat", "NWP": "NWPSolution", "NWS": "Nodewaves", + "NXA": "NEXA Agent", "NXC": "Nexium", "NXD": "Nexus Dubai", "NXDT": "NXD Next", @@ -11743,7 +11936,7 @@ "NYANDOGE": "NyanDOGE International", "NYANTE": "Nyantereum International", "NYBBLE": "Nybble", - "NYC": "NewYorkCoin", + "NYC": "NYC", "NYCREC": "NYCREC", "NYE": "NewYork Exchange", "NYEX": "Nyerium", @@ -11766,7 +11959,8 @@ "OAS": "Oasis City", "OASC": "Oasis City", "OASI": "Oasis Metaverse", - "OASIS": "Oasis", + "OASIS": "OASIS", + "OASISPLATFORM": "Oasis", "OAT": "OAT Network", "OATH": "OATH Protocol", "OAX": "Oax", @@ -11798,6 +11992,7 @@ "OCE": "OceanEX Token", "OCEAN": "Ocean Protocol", "OCEANT": "Poseidon Foundation", + "OCEANV1": "Ocean Protocol v1", "OCH": "Orchai", "OCICAT": "OciCat", "OCL": "Oceanlab", @@ -11945,7 +12140,7 @@ "OMNIXIO": "OMNIX", "OMNOM": "Doge Eat Doge", "OMNOMN": "Omega Network", - "OMT": "Mars Token", + "OMT": "Oracle Meta Technologies", "OMV1": "OM Token (v1)", "OMX": "Project Shivom", "OMZ": "Open Meta City", @@ -11955,6 +12150,7 @@ "ONCH": "OnchainPoints.xyz", "ONDO": "Ondo", "ONDOAI": "Ondo DeFAI", + "ONDSON": "Ondas Holdings (Ondo Tokenized)", "ONE": "Harmony", "ONEROOT": "OneRoot Network", "ONES": "OneSwap DAO", @@ -11983,12 +12179,14 @@ "ONUS": "ONUS", "ONX": "OnX.finance", "OOB": "Oobit", + "OOBV1": "Oobit", "OOE": "OpenOcean", "OOFP": "OOFP", "OOGI": "OOGI", "OOKI": "Ooki", "OOKS": "Onooks", "OOM": "OomerBot", + "OOOO": "oooo", "OOPS": "OOPS", "OORC": "Orbit Bridge Klaytn Orbit Chain", "OORT": "OORT", @@ -12010,6 +12208,7 @@ "OPENCUSTODY": "Open Custody Protocol", "OPENDAO": "OpenDAO", "OPENGO": "OPEN Governance Token", + "OPENON": "Opendoor Technologies (Ondo Tokenized)", "OPENP": "Open Platform", "OPENRI": "Open Rights Exchange", "OPENSOURCE": "Open Source Network", @@ -12174,7 +12373,8 @@ "OWB": "OWB", "OWC": "Oduwa", "OWD": "Owlstand", - "OWL": "OWL Token", + "OWL": "Owlto", + "OWLTOKEN": "OWL Token", "OWN": "OTHERWORLD", "OWNDATA": "OWNDATA", "OWNLY": "Ownly", @@ -12198,6 +12398,7 @@ "OZG": "Ozagold", "OZK": "OrdiZK", "OZMPC": "Ozempic", + "OZNI": "Ni Token", "OZO": "Ozone Chain", "OZONE": "Ozone metaverse", "OZONEC": "Ozonechain", @@ -12207,6 +12408,7 @@ "P202": "Project 202", "P2P": "Sentinel", "P2PS": "P2P Solutions Foundation", + "P2PV1": "Sentinel", "P33L": "THE P33L", "P3D": "3DPass", "P404": "Potion 404", @@ -12222,6 +12424,7 @@ "PACOCA": "Pacoca", "PACP": "PAC Protocol", "PACT": "impactMarket", + "PACTTOKEN": "PACT community token", "PACTV1": "impactMarket v1", "PAD": "NearPad", "PAF": "Pacific", @@ -12265,6 +12468,7 @@ "PANGEA": "PANGEA", "PANIC": "PanicSwap", "PANO": "PanoVerse", + "PANTHER": "Panther Protocol", "PANTOS": "Pantos", "PAO": "South Pao", "PAPA": "Papa Bear", @@ -12377,10 +12581,12 @@ "PCN": "PeepCoin", "PCNT": "Playcent", "PCO": "Pecunio", + "PCOCK": "PulseChain Peacock", "PCOIN": "Pioneer Coin", "PCR": "Paycer Protocol", "PCS": "Pabyosi Coin", "PCSP": "GenomicDao G-Stroke", + "PCT": "PET CASH TOKEN", "PCW": "Power Crypto World", "PCX": "ChainX", "PD": "PUDEL", @@ -12391,6 +12597,7 @@ "PDD": "PDDOLLAR", "PDEX": "Polkadex", "PDF": "Port of DeFi Network", + "PDI": "Phuture DeFi Index", "PDJT": "President Donald J. Trump", "PDOG": "Polkadog", "PDOGE": "PolkaDoge", @@ -12453,6 +12660,7 @@ "PENDY": "Pendy", "PENG": "Peng", "PENGCOIN": "PENG", + "PENGO": "Petro Penguins", "PENGU": "Pudgy Penguins", "PENGUAI": "PENGU AI", "PENGUI": "Penguiana", @@ -12513,6 +12721,7 @@ "PEPEMO": "PepeMo", "PEPEMOON": "PEPEMOON", "PEPEMUSK": "pepemusk", + "PEPENODE": "PEPENODE", "PEPEOFSOL": "Pepe of Solana", "PEPEPI": "PEPEPi", "PEPER": "Baby Pepe", @@ -12548,6 +12757,7 @@ "PERC": "Perion", "PERCY": "Percy Verence", "PERI": "PERI Finance", + "PERKSCOIN": "PerksCoin ", "PERL": "PERL.eco", "PERMIAN": "Permian", "PERP": "Perpetual Protocol", @@ -12575,7 +12785,10 @@ "PEUSD": "peg-eUSD", "PEW": "pepe in a memes world", "PEX": "Pexcoin", + "PF": "Purple Frog", + "PFEON": "Pfizer (Ondo Tokenized)", "PFEX": "Pfizer xStock", + "PFF": "PumpFunFloki", "PFI": "PrimeFinance", "PFID": "Pofid Dao", "PFL": "Professional Fighters League Fan Token", @@ -12671,6 +12884,7 @@ "PIKAM": "Pikamoon", "PIKE": "Pike Token", "PIKO": "Pinnako", + "PIKZ": "PIKZ", "PILLAR": "PillarFi", "PILOT": "Unipilot", "PIM": "PIM", @@ -12765,7 +12979,7 @@ "PLAYCOIN": "PlayCoin", "PLAYFUN": "PLAYFUN", "PLAYKEY": "Playkey", - "PLAYSOL": "Play Solana", + "PLAYSOLANA": "Play Solana", "PLAYTOKEN": "Play Token", "PLB": "Paladeum", "PLBT": "Polybius", @@ -12808,12 +13022,14 @@ "PLSX": "PulseX", "PLT": "Poollotto.finance", "PLTC": "PlatonCoin", + "PLTRON": "Palantir Technologies (Ondo Tokenized)", "PLTRX": "Palantir xStock", "PLTX": "PlutusX", "PLTXYZ": "Add.xyz", "PLU": "Pluton", "PLUG": "PL^Gnet", "PLUGCN": "Plug Chain", + "PLUGON": "Plug Power (Ondo Tokenized)", "PLUME": "Plume", "PLUP": "PoolUp", "PLURA": "PluraCoin", @@ -12838,7 +13054,7 @@ "PMOON": "Pookimoon", "PMPY": "Prometheum Prodigy", "PMR": "Pomerium Utility Token", - "PMT": "POWER MARKET", + "PMT": "Public Masterpiece Token", "PMTN": "Peer Mountain", "PMX": "Phillip Morris xStock", "PNB": "Pink BNB", @@ -12908,7 +13124,7 @@ "POLLEN": "Beraborrow", "POLLUK": "Jasse Polluk", "POLLUX": "Pollux Coin", - "POLLY": "Polynetica", + "POLLY": "Polly Penguin", "POLNX": "eToro Polish Zloty", "POLO": "NftyPlay", "POLS": "Polkastarter", @@ -12917,6 +13133,7 @@ "POLY": "Polymath Network", "POLYCUB": "PolyCub", "POLYDOGE": "PolyDoge", + "POLYN": "Polynetica", "POLYPAD": "PolyPad", "POLYX": "Polymesh", "POM": "Proof Of Memes", @@ -13001,7 +13218,9 @@ "POUW": "Pouwifhat", "POW": "PowBlocks", "POWELL": "Jerome Powell", - "POWER": "Powerloom Token", + "POWER": "Power", + "POWERLOOM": "Powerloom Token", + "POWERMARKET": "POWER MARKET", "POWR": "Power Ledger", "POWSCHE": "Powsche", "POX": "Monkey Pox", @@ -13042,6 +13261,7 @@ "PREAI": "Predict Crypto", "PREC": "Precipitate.AI", "PRED": "Predictcoin", + "PREDIC": "PredicTools", "PREM": "Premium", "PREME": "PREME Token", "PREMIA": "Premia", @@ -13050,6 +13270,7 @@ "PRESI": "Turbo Trump", "PRESID": "President Ron DeSantis", "PRESIDEN": "President Elon", + "PRESSX": "PressX", "PRFT": "Proof Suite Token", "PRG": "Paragon", "PRI": "PRIVATEUM INITIATIVE", @@ -13149,6 +13370,7 @@ "PSWAP": "Polkaswap", "PSY": "PsyOptions", "PSYOP": "PSYOP", + "PSYOPANIME": "PsyopAnime", "PT": "Phemex", "PTA": "PentaCoin", "PTAS": "La Peseta", @@ -13247,8 +13469,9 @@ "PUX": "pukkamex", "PVC": "PVC Meta", "PVFYBO": "JRVGCUPVSC", - "PVP": "PvP", + "PVP": "Pvpfun", "PVPCHAIN": "PVPChain", + "PVPGAME": "PvP", "PVT": "Punkvism Token", "PVU": "Plant vs Undead Token", "PWAR": "PolkaWar", @@ -13261,14 +13484,16 @@ "PWR": "MaxxChain", "PWRC": "PWR Coin", "PWT": "PANDAINU", - "PX": "PXcoin", + "PX": "Not Pixel", "PXB": "PixelBit", "PXC": "PhoenixCoin", + "PXCOIN": "PXcoin", "PXG": "PlayGame", "PXI": "Prime-X1", "PXL": "PIXEL", "PXP": "PointPay", "PXT": "Pixer Eternity", + "PYBOBO": "Capybobo", "PYC": "PayCoin", "PYE": "CreamPYE", "PYI": "PYRIN", @@ -13278,6 +13503,7 @@ "PYME": "PymeDAO", "PYN": "Paynetic", "PYP": "PayPro", + "PYPLON": "PayPal (Ondo Tokenized)", "PYQ": "PolyQuity", "PYR": "Vulcan Forged", "PYRAM": "Pyram Token", @@ -13314,6 +13540,7 @@ "QBX": "qiibee foundation", "QBZ": "QUEENBEE", "QC": "Qcash", + "QCAD": "QCAD", "QCH": "QChi", "QCN": "Quazar Coin", "QCO": "Qravity", @@ -13385,6 +13612,7 @@ "QUA": "Quantum Tech", "QUAC": "QUACK", "QUACK": "Rich Quack", + "QUADRANS": "QuadransToken", "QUAI": "Quai Network", "QUAIN": "QUAIN", "QUAM": "Quam Network", @@ -13446,7 +13674,7 @@ "RADAR": "DappRadar", "RADI": "RadicalCoin", "RADIO": "RadioShack", - "RADR": "CoinRadr", + "RADR": "RADR", "RADX": "Radx AI", "RAFF": "Ton Raffles", "RAFFLES": "Degen Raffles", @@ -13461,6 +13689,7 @@ "RAIF": "RAI Finance", "RAIIN": "Raiin", "RAIL": "Railgun", + "RAILS": "Rails Token", "RAIN": "Rain", "RAINBOW": "Rainbow Token", "RAINC": "RainCheck", @@ -13470,6 +13699,7 @@ "RAIREFLEX": "Rai Reflex Index", "RAISE": "Raise Token", "RAIT": "Rabbitgame", + "RAITOKEN": "RAI", "RAIZER": "RAIZER", "RAK": "Rake Finance", "RAKE": "Rake Coin", @@ -13497,16 +13727,18 @@ "RATOTHERAT": "Rato The Rat", "RATS": "Rats", "RATWIF": "RatWifHat", - "RAVE": "Ravendex", + "RAVE": "RaveDAO", "RAVELOUS": "Ravelous", "RAVEN": "Raven Protocol", "RAVENCOINC": "Ravencoin Classic", + "RAVENDEX": "Ravendex", "RAWDOG": "RawDog", "RAWG": "RAWG", "RAY": "Raydium", "RAYS": "Rays Network", "RAZE": "Raze Network", "RAZOR": "Razor Network", + "RAZORCOIN": "RazorCoin", "RB": "REBorn", "RBBT": "RabbitCoin", "RBC": "Rubic", @@ -13588,6 +13820,7 @@ "REALYN": "Real", "REAP": "ReapChain", "REAPER": "Grim Finance", + "REAT": "REAT", "REAU": "Vira-lata Finance", "REBD": "REBORN", "REBL": "REBL", @@ -13810,7 +14043,8 @@ "RIVUS": "RivusDAO", "RIYA": "Etheriya", "RIZ": "Rivalz Network", - "RIZE": "Rizespor Token", + "RIZE": "RIZE", + "RIZESPOR": "Rizespor Token", "RIZO": "HahaYes", "RIZOLOL": "Rizo", "RIZZ": "Rizz", @@ -13852,10 +14086,12 @@ "RNDR": "Render Token", "RNDX": "Round X", "RNEAR": "Near (Rainbow Bridge)", + "RNGR": "Ranger", "RNS": "RenosCoin", "RNT": "REAL NIGGER TATE", "RNTB": "BitRent", "RNX": "ROONEX", + "ROA": "ROA CORE", "ROAD": "ROAD", "ROAM": "Roam Token", "ROAR": "Alpha DEX", @@ -13889,6 +14125,7 @@ "ROK": "Rockchain", "ROKM": "Rocket Ma", "ROKO": "Roko", + "ROLL": "Roll", "ROLLSROYCE": "RollsRoyce", "ROLS": "RollerSwap", "ROM": "ROMCOIN", @@ -13993,6 +14230,7 @@ "RTM": "Raptoreum", "RTR": "Restore The Republic", "RTT": "Restore Truth Token", + "RTX": "RateX", "RU": "RIFI United", "RUBB": "Rubber Ducky Cult", "RUBCASH": "RUBCASH", @@ -14080,7 +14318,7 @@ "RYT": "Real Yield Token", "RYU": "The Blue Dragon", "RYZ": "Anryze", - "RZR": "RazorCoin", + "RZR": "Rezor", "RZTO": "RZTO Token", "RZUSD": "RZUSD", "RedFlokiCEO": "Red Floki CEO", @@ -14142,6 +14380,7 @@ "SAKAI": "Sakai Vault", "SAKATA": "Sakata Inu", "SAKE": "SakeToken", + "SAKURACOIN": "Sakuracoin", "SAL": "Salvium", "SALD": "Salad", "SALE": "DxSale Network", @@ -14283,7 +14522,7 @@ "SCOIN": "ShinCoin", "SCONE": "Sportcash One", "SCOOBY": "Scooby coin", - "SCOR": "Scorista", + "SCOR": "Scor", "SCORE": "Scorecoin", "SCOT": "Scotcoin", "SCOTT": "Scottish", @@ -14345,6 +14584,7 @@ "SEAM": "Seamless Protocol", "SEAMLESS": "SeamlessSwap", "SEAN": "Starfish Finance", + "SEAS": "Seasons", "SEAT": "Seamans Token", "SEATLABNFT": "SeatlabNFT", "SEBA": "Seba", @@ -14377,6 +14617,7 @@ "SELFIEC": "Selfie Cat", "SELFT": "SelfToken", "SELLC": "Sell Token", + "SELO": "SELO+", "SEM": "Semux", "SEN": "Sentaro", "SENA": "Ethena Staked ENA", @@ -14393,7 +14634,7 @@ "SENSOR": "Sensor Protocol", "SENSOV1": "SENSO v1", "SENSUS": "Sensus", - "SENT": "Sentinel", + "SENT": "Sentient", "SENTAI": "SentAI", "SENTI": "Sentinel Bot Ai", "SENTIS": "Sentism AI Token", @@ -14419,6 +14660,7 @@ "SETH": "sETH", "SETH2": "sETH2", "SETHER": "Sether", + "SETHH": "Staked ETH Harbour", "SETS": "Sensitrust", "SEUR": "Synth sEUR", "SEW": "simpson in a memes world", @@ -14461,6 +14703,7 @@ "SGB": "Songbird", "SGDX": "eToro Singapore Dollar", "SGE": "Society of Galactic Exploration", + "SGI": "SmartGolfToken", "SGLY": "Singularity", "SGN": "Signals Network", "SGO": "SafuuGO", @@ -14482,7 +14725,6 @@ "SHANG": "Shanghai Inu", "SHAR": "Shark Cat", "SHARBI": "SHARBI", - "SHARD": "ShardCoin", "SHARDS": "WorldShards", "SHARE": "Seigniorage Shares", "SHARECHAIN": "ShareChain", @@ -14530,6 +14772,7 @@ "SHIBACASH": "ShibaCash", "SHIBADOG": "Shiba San", "SHIBAI": "AiShiba", + "SHIBAINU": "SHIBA INU", "SHIBAKEN": "Shibaken Finance", "SHIBAMOM": "Shiba Mom", "SHIBANCE": "Shibance Token", @@ -14580,6 +14823,7 @@ "SHIRO": "Shiro Neko", "SHIROSOL": "Shiro Neko (shirosol.online)", "SHIRYOINU": "Shiryo-Inu", + "SHISA": "SHISA", "SHISHA": "Shisha Coin", "SHIT": "I will poop it NFT", "SHITC": "Shitcoin", @@ -14599,6 +14843,7 @@ "SHOKI": "Shoki", "SHON": "ShonToken", "SHONG": "Shong Inu", + "SHOOK": "SHOOK", "SHOOT": "Mars Battle", "SHOOTER": "Top Down Survival Shooter", "SHOP": "Shoppi Coin", @@ -14628,9 +14873,11 @@ "SHUFFLE": "SHUFFLE!", "SHVR": "Shivers", "SHX": "Stronghold Token", + "SHXV1": "Stronghold Token v1", "SHY": "Shytoshi Kusama", "SHYTCOIN": "ShytCoin", "SI": "Siren", + "SI14": "Si14", "SIACLASSIC": "SiaClassic", "SIB": "SibCoin", "SIBA": "SibaInu", @@ -14646,6 +14893,7 @@ "SIFT": "Smart Investment Fund Token", "SIFU": "SIFU", "SIG": "Signal", + "SIGHT": "Empire of Sight", "SIGM": "Sigma", "SIGMA": "SIGMA", "SIGN": "Sign", @@ -14654,6 +14902,7 @@ "SIGNMETA": "Sign Token", "SIGT": "Signatum", "SIGU": "Singular", + "SIH": "Salient Investment Holding", "SIKA": "SikaSwap", "SIL": "SIL Finance Token V2", "SILENTIS": "Silentis", @@ -14691,6 +14940,7 @@ "SINE": "Sinelock", "SING": "SingularFarm", "SINGLE": "Single Finance", + "SINGULARRY": "SINGULARRY", "SINK": "Let that sink in", "SINS": "SafeInsure", "SINSO": "SINSO", @@ -14747,7 +14997,7 @@ "SKO": "Sugar Kingdom Odyssey", "SKOP": "Skulls of Pepe Token", "SKPEPE": "Sheikh Pepe", - "SKR": "Sakuracoin", + "SKR": "Seeker", "SKRB": "Sakura Bloom", "SKRIMP": "Skrimples", "SKRP": "Skraps", @@ -14804,6 +15054,7 @@ "SLOKI": "Super Floki", "SLOP": "Slop", "SLORK": "SLORK", + "SLOT": "Alphaslot", "SLOTH": "Sloth", "SLOTHA": "Slothana", "SLP": "Smooth Love Potion", @@ -14817,6 +15068,7 @@ "SLUGDENG": "SLUG DENG", "SLUMBO": "SLUMBO", "SLVLUSD": "Staked Level USD", + "SLVON": "iShares Silver Trust (Ondo Tokenized)", "SLVX": "eToro Silver", "SLX": "SLIMEX", "SMA": "Soma Network", @@ -14831,6 +15083,7 @@ "SMARTLOX": "SmartLOX", "SMARTM": "SmartMesh", "SMARTMEME": "SmartMEME", + "SMARTMFG": "Smart MFG", "SMARTNFT": "SmartNFT", "SMARTO": "smARTOFGIVING", "SMARTSHARE": "Smartshare", @@ -14840,6 +15093,7 @@ "SMBR": "Sombra", "SMBSWAP": "SimbCoin Swap", "SMC": "SmartCoin", + "SMCION": "Super Micro Computer (Ondo Tokenized)", "SMCW": "Space Misfits", "SMD": "SMD Coin", "SMETA": "StarkMeta", @@ -14942,7 +15196,7 @@ "SNPT": "SNPIT TOKEN", "SNRG": "Synergy", "SNRK": "Snark Launch", - "SNS": "Synesis One", + "SNS": "Solana Name Service", "SNST": "Smooth Network Solutions Token", "SNSY": "Sensay", "SNT": "Status Network Token", @@ -14975,11 +15229,13 @@ "SOETH": "Wrapped Ethereum (Sollet)", "SOFAC": "SofaCat", "SOFI": "RAI Finance", + "SOFION": "SoFi Technologies (Ondo Tokenized)", "SOFTCO": "SOFT COQ INU", "SOFTT": "Wrapped FTT (Sollet)", "SOGNI": "Sogni AI", "SOGUR": "Sogur Currency", "SOH": "Stohn Coin", + "SOHMV1": "Staked Olympus v1", "SOHOT": "SOHOTRN", "SOIL": "Soil", "SOILCOIN": "SoilCoin", @@ -15031,6 +15287,7 @@ "SOLIDSEX": "SOLIDsex: Tokenized veSOLID", "SOLINK": "Wrapped Chainlink (Sollet)", "SOLITO": "SOLITO", + "SOLKABOSU": "Kabosu", "SOLKIT": "Solana Kit", "SOLLY": "Solly", "SOLM": "SolMix", @@ -15040,6 +15297,7 @@ "SOLNAV": "SOLNAV AI", "SOLNIC": "Solnic", "SOLO": "Sologenic", + "SOLOM": "Solomon", "SOLOR": "Solordi", "SOLP": "SolPets", "SOLPAD": "Solpad Finance", @@ -15207,6 +15465,7 @@ "SPO": "Spores Network", "SPOK": "Spock", "SPOL": "Starterpool", + "SPON": "Spheron Network", "SPONG": "Spongebob", "SPONGE": "Sponge", "SPONGEBOB": "Spongebob Squarepants", @@ -15215,6 +15474,7 @@ "SPOOL": "Spool DAO Token", "SPORE": "Spore", "SPORT": "SportsCoin", + "SPORTFUN": "Sport.fun", "SPORTS": "ZenSports", "SPORTSFIX": "SportsFix", "SPORTSP": "SportsPie", @@ -15243,6 +15503,7 @@ "SPX6969": "SPX 6969", "SPXC": "SpaceXCoin", "SPY": "Smarty Pay", + "SPYON": "SPDR S&P 500 ETF (Ondo Tokenized)", "SPYRO": "SPYRO", "SPYX": "SP500 xStock", "SQ3": "Squad3", @@ -15251,6 +15512,7 @@ "SQG": "Squid Token", "SQGROW": "SquidGrow", "SQL": "Squall Coin", + "SQQQON": "ProShares UltraPro Short QQQ (Ondo Tokenized)", "SQR": "Magic Square", "SQRL": "Squirrel Swap", "SQT": "SubQuery Network", @@ -15268,6 +15530,8 @@ "SQUIDGROWV1": "SquidGrow v1", "SQUIDV1": "Squid Game v1", "SQUIDW": "Squidward Coin", + "SQUIG": "Squiggle DAO Token", + "SQUIGDAO": "SquiggleDAO ERC20", "SQUIRT": "SQUIRTLE", "SQUOGE": "DogeSquatch", "SR30": "SatsRush", @@ -15332,21 +15596,24 @@ "STACS": "STACS Token", "STAFIRETH": "StaFi Staked ETH", "STAGE": "Stage", + "STAI": "StereoAI", "STAK": "Jigstack", "STAKE": "xDai Chain", "STAKEDETH": "StakeHound Staked Ether", + "STAKERDAOWXTZ": "Wrapped Tezos", "STALIN": "StalinCoin", "STAMP": "SafePost", "STAN": "Stank Memes", "STANDARD": "Stakeborg DAO", "STAPT": "Ditto Staked Aptos", - "STAR": "StarHeroes", + "STAR": "Starpower Network Token", "STAR10": "Ronaldinho Coin", "STARAMBA": "Staramba", "STARBASE": "Starbase", "STARC": "StarChain", "STARDOGE": "StarDOGE", "STARGATEAI": "Stargate AI Agent", + "STARHEROES": "StarHeroes", "STARL": "StarLink", "STARLAUNCH": "StarLaunch", "STARLY": "Starly", @@ -15422,6 +15689,7 @@ "STIMA": "STIMA", "STING": "Sting", "STINJ": "Stride Staked INJ", + "STIPS": "Stips", "STITCH": "Stitch", "STIX": "STIX", "STJUNO": "Stride Staked JUNO", @@ -15597,6 +15865,7 @@ "SUPERBONK": "SUPER BONK", "SUPERC": "SuperCoin", "SUPERCAT": "SUPERCAT", + "SUPERCYCLE": "Crypto SuperCycle", "SUPERDAPP": "SuperDapp", "SUPERF": "SUPER FLOKI", "SUPERGROK": "SuperGrok", @@ -15732,6 +16001,7 @@ "SYNCO": "Synco", "SYND": "Syndicate", "SYNDOG": "Synthesizer Dog", + "SYNESIS": "Synesis One", "SYNK": "Synk", "SYNLEV": "SynLev", "SYNO": "Synonym Finance", @@ -15832,6 +16102,7 @@ "TATSU": "Taτsu", "TAU": "Lamden Tau", "TAUC": "Taurus Coin", + "TAUD": "TrueAUD", "TAUM": "Orbitau Taureum", "TAUR": "Marnotaur", "TAVA": "ALTAVA", @@ -15855,6 +16126,7 @@ "TBILL": "OpenEden T-Bills", "TBILLV1": "OpenEden T-Bills v1", "TBIS": "TBIS token", + "TBK": "TBK Token", "TBL": "Tombola", "TBLLX": "TBLL xStock", "TBR": "Tuebor", @@ -15902,7 +16174,8 @@ "TDROP": "ThetaDrop", "TDS": "TokenDesk", "TDX": "Tidex Token", - "TEA": "TeaDAO", + "TEA": "TeaFi Token", + "TEADAO": "TeaDAO", "TEAM": "TeamUP", "TEARS": "Liberals Tears", "TEC": "TeCoin", @@ -15933,7 +16206,7 @@ "TEMM": "TEM MARKET", "TEMP": "Tempus", "TEMPLE": "TempleDAO", - "TEN": "Tokenomy", + "TEN": "TEN", "TEND": "Tendies", "TENDIE": "TendieSwap", "TENET": "TENET", @@ -15947,8 +16220,8 @@ "TEQ": "Teq Network", "TER": "TerraNovaCoin", "TERA": "TERA", + "TERA2": "Terareum", "TERADYNE": "Teradyne", - "TERAR": "Terareum", "TERAV1": "Terareum v1", "TERAWATT": "Terawatt", "TERM": "Terminal of Simpson", @@ -15975,6 +16248,7 @@ "TETSUO": "Tetsuo Coin", "TETU": "TETU", "TEVA": "Tevaera", + "TEVI": "TEVI Coin", "TEW": "Trump in a memes world", "TEX": "Terrax", "TF47": "Trump Force 47", @@ -15988,7 +16262,7 @@ "TFT": "The Famous Token", "TFUEL": "Theta Fuel", "TGAME": "TrueGame", - "TGC": "TigerCoin", + "TGC": "TG.Casino", "TGCC": "TheGCCcoin", "TGPT": "Trading GPT", "TGRAM": "TG20 TGram", @@ -16026,7 +16300,9 @@ "THEOS": "Theos", "THEP": "The Protocol", "THEPLAY": "PLAY", + "THEREALCHAIN": "REAL", "THERESAMAY": "Theresa May Coin", + "THEROS": "THEROS", "THES": "The Standard Protocol (USDS)", "THESTANDARD": "Standard Token", "THETA": "Theta Network", @@ -16051,6 +16327,7 @@ "THOR": "THORSwap", "THOREUM": "Thoreum V3", "THP": "TurboHigh Performance", + "THQ": "Theoriq Token", "THR": "Thorecoin", "THREE": "Three Protocol Token ", "THRT": "ThriveToken", @@ -16078,6 +16355,7 @@ "TIG": "Tigereum", "TIGER": "TIGER", "TIGERC": "TigerCash", + "TIGERCOIN": "TigerCoin", "TIGERCV1": "TigerCash v1", "TIGERMOON": "TigerMoon", "TIGERSHARK": "Tiger Shark", @@ -16109,9 +16387,10 @@ "TIPS": "FedoraCoin", "TIPSX": "WisdomTree TIPS Digital Fund", "TIPSY": "TipsyCoin", - "TIT": "TittieCoin", + "TIT": "TITANIUM", "TITA": "Titan Hunters", "TITAN": "SATOSHI•RUNE•TITAN (Runes)", + "TITANCOIN": "Titan Coin", "TITANO": "Titano", "TITANSWAP": "TitanSwap", "TITANX": "TitanX", @@ -16120,6 +16399,7 @@ "TITI": "TiTi Protocol", "TITN": "Titan", "TITS": "We Love Tits", + "TITTIECOIN": "TittieCoin", "TITTY": "TamaKitty", "TIUSD": "TiUSD", "TIX": "Blocktix", @@ -16134,6 +16414,7 @@ "TKMK": "TOKAMAK", "TKMN": "Tokemon", "TKN": "Token Name Service", + "TKNT": "TKN Token", "TKO": "Tokocrypto", "TKP": "TOKPIE", "TKR": "CryptoInsight", @@ -16147,6 +16428,7 @@ "TLN": "Trustlines Network", "TLOS": "Telos", "TLP": "TulipCoin", + "TLTON": "iShares 20+ Year Treasury Bond ETF (Ondo Tokenized)", "TLW": "TILWIKI", "TMAGA": "THE MAGA MOVEMENT", "TMAI": "Token Metrics AI", @@ -16154,6 +16436,7 @@ "TME": "Timereum", "TMED": "MDsquare", "TMFT": "Turkish Motorcycle Federation", + "TMG": "T-mac DAO", "TMN": "TranslateMe", "TMNG": "TMN Global", "TMNT": "TMNT", @@ -16193,6 +16476,7 @@ "TOKC": "Tokyo Coin", "TOKE": "Tokemak", "TOKEN": "TokenFi", + "TOKENOMY": "Tokenomy", "TOKENPLACE": "Tokenplace", "TOKENSTARS": "TokenStars", "TOKERO": "TOKERO LevelUP Token", @@ -16299,6 +16583,7 @@ "TPV": "TravGoPV", "TPY": "Thrupenny", "TQ": "TonQuestion", + "TQQQON": "ProShares UltraPro QQQ (Ondo Tokenized)", "TQQQX": "TQQQ xStock", "TQRT": "TokoQrt", "TR3": "Tr3zor", @@ -16312,6 +16597,7 @@ "TRADE": "Polytrade", "TRADEBOT": "TradeBot", "TRADECHAIN": "Trade Chain", + "TRADETIDE": "Trade Tide Token", "TRADEX": "TradeX AI", "TRADOOR": "Tradoor", "TRAI": "Trackgood AI", @@ -16357,10 +16643,11 @@ "TRGI": "The Real Golden Inu", "TRHUB": "Tradehub", "TRI": "Triangles Coin", - "TRIA": "Triaconta", + "TRIA": "TRIA", "TRIAS": "Trias", "TRIBE": "Tribe", "TRIBETOKEN": "TribeToken", + "TRIBEX": "Tribe Token", "TRIBL": "Tribal Token", "TRICK": "TrickyCoin", "TRICKLE": "Trickle", @@ -16391,6 +16678,7 @@ "TROLLMODE": "TROLL MODE", "TROLLRUN": "TROLL", "TROLLS": "trolls in a memes world", + "TRONBETLIVE": "TRONbetLive", "TRONDOG": "TronDog", "TRONI": "Tron Inu", "TRONP": "Donald Tronp", @@ -16398,7 +16686,7 @@ "TROP": "Interop", "TROPPY": "TROPPY", "TROSS": "Trossard", - "TROVE": "Arbitrove Governance Token", + "TROVE": "TROVE", "TROY": "Troy", "TRP": "Tronipay", "TRR": "Terran Coin", @@ -16499,6 +16787,7 @@ "TSHARE": "Tomb Shares", "TSHP": "12Ships", "TSL": "Energo", + "TSLAON": "Tesla (Ondo Tokenized)", "TSLAX": "Tesla xStock", "TSLT": "Tamkin", "TSN": "Tsunami Exchange Token", @@ -16520,7 +16809,7 @@ "TTF": "TurboTrix Finance", "TTK": "The Three Kingdoms", "TTM": "Tradetomato", - "TTN": "Titan Coin", + "TTN": "TTN", "TTNT": "TITA Project", "TTT": "TRUMPETTOKEN", "TTTU": "T-Project", @@ -16537,7 +16826,8 @@ "TUKI": "Tuki", "TUKIV1": "Tuki v1", "TULIP": "Tulip Protocol", - "TUNA": "TUNACOIN", + "TUNA": "DefiTuna", + "TUNACOIN": "TUNACOIN", "TUNE": "Bitune", "TUNETRADEX": "TuneTrade", "TUP": "Tenup", @@ -16614,7 +16904,7 @@ "TZKI": "Tsuzuki Inu", "TZPEPE": "Tezos Pepe", "TZU": "Sun Tzu", - "U": "Union", + "U": "United Stables", "U2U": "U2U Network", "U8D": "Universal Dollar", "UA1": "UA1", @@ -16641,6 +16931,7 @@ "UBXT": "UpBots", "UC": "YouLive Coin", "UCA": "UCA Coin", + "UCANFIX": "Ucan fix life in1day", "UCAP": "Unicap.finance", "UCASH": "U.CASH", "UCCOIN": "UC Coin", @@ -16762,6 +17053,7 @@ "UNIL": "UniLayer", "UNIM": "Unicorn Milk", "UNIO": "Unio Coin", + "UNION": "Union", "UNIPOWER": "UniPower", "UNIPT": "Universal Protocol Token", "UNIQ": "Uniqredit", @@ -16838,7 +17130,9 @@ "US": "Talus Token", "USA": "Based USA", "USACOIN": "American Coin", - "USAT": "USAT", + "USAGIBNB": "U", + "USAT": "Tether America USD", + "USATINC": "USAT", "USBT": "Universal Blockchain", "USC": "Ultimate Secure Cash", "USCC": "USC", @@ -16877,13 +17171,15 @@ "USDGLOBI": "Globiance USD Stablecoin", "USDGV1": "USDG v1", "USDGV2": "USDG", - "USDH": "USDH Hubble Stablecoin", + "USDH": "USDH", + "USDHHUBBLE": "USDH Hubble Stablecoin", "USDHL": "Hyper USD", "USDI": "Interest Protocol USDi", "USDJ": "USDJ", "USDK": "USDK", + "USDKG": "USDKG", "USDL": "Lift Dollar", - "USDM": "Mountain Protocol", + "USDM": "USDM", "USDMA": "USD mars", "USDN": "Neutral AI", "USDO": "USD Open Dollar", @@ -16924,6 +17220,7 @@ "USN": "USN", "USNBT": "NuBits", "USNOTA": "NOTA", + "USOR": "U.S Oil", "USP": "USP Token", "USPEPE": "American pepe", "USPLUS": "Fluent Finance", @@ -16941,11 +17238,13 @@ "USUALX": "USUALx", "USUD": "USUD", "USV": "Universal Store of Value", - "USX": "USX Quantum", + "USX": "USX", + "USXQ": "USX Quantum", "USYC": "Hashnote USYC", "UT": "Ulord", "UTBAI": "UTB.ai", "UTC": "UltraCoin", + "UTED": "United", "UTG": "UltronGlow", "UTH": "Uther", "UTHR": "Utherverse Xaeon", @@ -16968,8 +17267,9 @@ "UUU": "U Network", "UVT": "UvToken", "UW3S": "Utility Web3Shot", - "UWU": "UwU Lend", + "UWU": "Unlimited Wealth Utility", "UWUCOIN": "uwu", + "UWULEND": "UwU Lend", "UX": "Umee", "UXLINK": "UXLINK", "UXLINKV1": "UXLINK v1", @@ -16998,6 +17298,7 @@ "VALU": "Value", "VALUE": "Value Liquidity", "VALYR": "Valyr", + "VAM": "Vitalum", "VAMPIRE": "Vampire Inu", "VAN": "Vanspor Token", "VANA": "Vana", @@ -17094,6 +17395,7 @@ "VEO": "Amoveo", "VER": "VersalNFT", "VERA": "Vera", + "VEREM": "Verified Emeralds", "VERI": "Veritaseum", "VERIC": "VeriCoin", "VERIFY": "Verify", @@ -17206,6 +17508,7 @@ "VIZ": "VIZ Token", "VIZION": "ViZion Protocol", "VIZSLASWAP": "VizslaSwap", + "VK": "VK Token", "VKNF": "VKENAF", "VLC": "Volcano Uni", "VLDY": "Validity", @@ -17263,6 +17566,7 @@ "VON": "Vameon", "VONE": "Vone", "VONSPEED": "Andrea Von Speed", + "VOOI": "VOOI", "VOOT": "VootCoin", "VOOZ": "Vooz Coin", "VOPO": "VOPO", @@ -17290,6 +17594,7 @@ "VRC": "Virtual Coin", "VRFY": "VERIFY", "VRGW": "Virtual Reality Game World", + "VRGX": "VROOMGO", "VRH": "Versailles Heroes", "VRL": "Virtual X", "VRM": "Verium", @@ -17323,6 +17628,7 @@ "VSYS": "V Systems", "VT": "Virtual Tourist", "VTC": "Vertcoin", + "VTCN": "Versatize Coin", "VTG": "Victory Gem", "VTHO": "VeChainThor", "VTIX": "Vanguard xStock", @@ -17355,6 +17661,7 @@ "VVS": "VVS Finance", "VVV": "Venice Token", "VX": "Visa xStock", + "VXC": "VINX COIN", "VXL": "Voxel X Network", "VXR": "Vox Royale", "VXRP": "Venus XRP", @@ -17367,6 +17674,7 @@ "VYPER": "VYPER.WIN", "VYVO": "Vyvo AI", "VZ": "Vault Zero", + "VZON": "Verizon (Ondo Tokenized)", "VZT": "Vezt", "W": "Wormhole", "W1": "W1", @@ -17424,7 +17732,7 @@ "WANNA": "Wanna Bot", "WANUSDT": "wanUSDT", "WAP": "Wet Ass Pussy", - "WAR": "WeStarter", + "WAR": "WAR", "WARP": "WarpCoin", "WARPED": "Warped Games", "WARPIE": "Warpie", @@ -17443,6 +17751,7 @@ "WATCH": "Yieldwatch", "WATER": "Waterfall", "WATERCOIN": "WATER", + "WATLAS": "Wrapped Star Atlas (Portal Bridge)", "WATT": "WATTTON", "WAVAX": "Wrapped AVAX", "WAVES": "Waves", @@ -17492,6 +17801,7 @@ "WCFGV1": "Wrapped Centrifuge", "WCFX": "Wrapped Conflux", "WCG": "World Crypto Gold", + "WCHZ": "Wrapped Chiliz", "WCKB": "Wrapped Nervos Network", "WCOIN": "WCoin", "WCORE": "Wrapped Core", @@ -17524,6 +17834,7 @@ "WEBSIM": "The Css God by Virtuals", "WEBSS": "Websser", "WEC": "Whole Earth Coin", + "WECAN": "Wecan Group", "WECO": "WECOIN", "WED": "Wednesday Inu", "WEEBS": "Weebs", @@ -17561,8 +17872,10 @@ "WEPC": "World Earn & Play Community", "WEPE": "Wall Street Pepe", "WERK": "Werk Family", + "WESHOWTOKEN": "WeShow Token", "WEST": "Waves Enterprise", - "WET": "WeShow Token", + "WESTARTER": "WeStarter", + "WET": "HumidiFi Token", "WETH": "WETH", "WETHV1": "WETH v1", "WETHW": "Wrapped EthereumPoW", @@ -17581,6 +17894,7 @@ "WFIL": "Wrapped Filecoin", "WFLAMA": "WIFLAMA", "WFLOW": "Wrapped Flow", + "WFLR": "Wrapped Flare", "WFO": "WoofOracle", "WFRAGSOL": "Wrapped fragSOL", "WFT": "Windfall Token", @@ -17605,6 +17919,7 @@ "WHATSONPIC": "WhatsOnPic", "WHBAR": "Wrapped HBAR", "WHC": "Whales Club", + "WHCHZ": "Chiliz (Portal Bridge)", "WHEAT": "Wheat Token", "WHEE": "WHEE (Ordinals)", "WHEEL": "Wheelers", @@ -17617,6 +17932,8 @@ "WHISKEY": "WHISKEY", "WHITE": "WhiteRock", "WHITEHEART": "Whiteheart", + "WHITEPEPE": "The White Pepe", + "WHITEWHALE": "The White Whale", "WHL": "WhaleCoin", "WHO": "Truwho", "WHOLE": "Whole Network", @@ -17733,6 +18050,7 @@ "WMNT": "Wrapped Mantle", "WMOXY": "Moxy", "WMT": "World Mobile Token v1", + "WMTON": "Walmart (Ondo Tokenized)", "WMTX": "World Mobile Token", "WMW": "WoopMoney", "WMX": "Wombex Finance", @@ -17827,6 +18145,7 @@ "WPP": "Green Energy Token", "WPR": "WePower", "WQT": "Work Quest", + "WR": "White Rat", "WRC": "Worldcore", "WREACT": "Wrapped REACT", "WRK": "BlockWRK", @@ -17889,6 +18208,7 @@ "WUF": "WUFFI", "WUK": "WUKONG", "WUKONG": "Sun Wukong", + "WULFON": "Terawulf (Ondo Tokenized)", "WULFY": "Wulfy", "WUM": "Unicorn Meat", "WUSD": "Worldwide USD", @@ -17914,7 +18234,6 @@ "WXPL": "Wrapped XPL", "WXRP": "Wrapped XRP", "WXT": "WXT", - "WXTZ": "Wrapped Tezos", "WYAC": "Woman Yelling At Cat", "WYN": "Wynn", "WYNN": "Anita Max Wynn", @@ -17957,6 +18276,7 @@ "XAS": "Asch", "XAT": "ShareAt", "XAUC": "XauCoin", + "XAUH": "Herculis Gold Coin", "XAUM": "Matrixdock Gold", "XAUR": "Xaurum", "XAUT": "Tether Gold", @@ -18005,6 +18325,7 @@ "XCHF": "CryptoFranc", "XCHNG": "Chainge Finance", "XCI": "Cannabis Industry Coin", + "XCL": "Xcellar", "XCLR": "ClearCoin", "XCM": "CoinMetro", "XCN": "Onyxcoin", @@ -18043,7 +18364,8 @@ "XEC": "eCash", "XED": "Exeedme", "XEDO": "XedoAI", - "XEL": "Xel", + "XEL": "XELIS", + "XELCOIN": "Xel", "XELS": "XELS Coin", "XEM": "NEM", "XEN": "XEN Crypto", @@ -18053,6 +18375,7 @@ "XENO": "Xeno", "XENOVERSE": "Xenoverse", "XEP": "Electra Protocol", + "XERA": "XERA", "XERS": "X Project", "XES": "Proxeus", "XET": "Xfinite Entertainment Token", @@ -18232,6 +18555,7 @@ "XRPCV1": "XRP Classic v1", "XRPEPE": "XRPEPE", "XRPH": "XRP Healthcare", + "XRPHEDGE": "1X Short XRP Token", "XRS": "Xrius", "XRT": "Robonomics Network", "XRUN": "XRun", @@ -18361,13 +18685,15 @@ "YEAI": "YE AI Agent", "YEARN": "YearnTogether", "YEC": "Ycash", - "YEE": "Yeeco", + "YEE": "Yee Token", + "YEECO": "Yeeco", "YEED": "Yggdrash", "YEEHAW": "YEEHAW", "YEET": "Yeet", "YEETI": "YEETI 液体", "YEFI": "YeFi", "YEL": "Yel.Finance", + "YELLOWWHALE": "The Yellow Whale", "YELP": "Yelpro", "YEON": "Yeon", "YEPE": "Yellow Pepe", @@ -18497,6 +18823,7 @@ "ZAIF": "Zaif Token", "ZAIFIN": "Zero Collateral Dai", "ZAM": "Zamio", + "ZAMA": "Zama", "ZAMZAM": "ZAMZAM", "ZANO": "Zano", "ZAO": "zkTAO", @@ -18569,6 +18896,7 @@ "ZENPROTOCOL": "Zen Protocol", "ZENQ": "Zenqira", "ZENT": "Zentry", + "ZENV1": "Horizen v1", "ZEON": "Zeon Network", "ZEP": "Zeppelin Dao", "ZEPH": "Zephyr Protocol", @@ -18586,12 +18914,14 @@ "ZET2": "Zeta2Coin", "ZETA": "ZetaChain", "ZETH": "Zethan", + "ZETO": "ZeTo", "ZETRIX": "Zetrix", "ZEUM": "Colizeum", "ZEUS": "Zeus Network", "ZEUSPEPES": "Zeus", "ZEX": "Zeta", "ZEXI": "ZEXICON", + "ZEXX": "ZEXXCOIN", "ZEXY": "ZEXY", "ZF": "zkSwap Finance ", "ZFI": "Zyfi", @@ -18638,6 +18968,7 @@ "ZKEVM": "zkEVMChain (BSC)", "ZKEX": "zkExchange", "ZKF": "ZKFair", + "ZKFG": "ZKFG", "ZKGPT": "ZKGPT", "ZKGROK": "ZKGROK", "ZKGUN": "zkGUN", @@ -18649,7 +18980,7 @@ "ZKLAB": "zkSync Labs", "ZKLK": "ZkLock", "ZKML": "zKML", - "ZKP": "Panther Protocol", + "ZKP": "zkPass", "ZKPAD": "zkLaunchpad", "ZKPEPE": "ZKPEPEs", "ZKS": "ZKSpace", @@ -18693,6 +19024,7 @@ "ZOOM": "ZoomCoin", "ZOOMER": "Zoomer Coin", "ZOON": "CryptoZoon", + "ZOOSTORY": "ZOO", "ZOOT": "Zoo Token", "ZOOTOPIA": "Zootopia", "ZORA": "Zora", @@ -18720,8 +19052,9 @@ "ZSD": "Zephyr Protocol Stable Dollar", "ZSE": "ZSEcoin", "ZSH": "Ziesha", + "ZSWAP": "ZygoSwap", "ZT": "ZBG Token", - "ZTC": "ZeTo", + "ZTC": "Zenchain", "ZTG": "Zeitgeist", "ZTK": "Zefi", "ZTX": "ZTX", @@ -18769,5 +19102,13 @@ "vXDEFI": "vXDEFI", "wsOHM": "Wrapped Staked Olympus", "修仙": "修仙", - "币安人生": "币安人生" + "分红狗头": "分红狗头", + "哭哭马": "哭哭马", + "安": "安", + "币安人生": "币安人生", + "恶俗企鹅": "恶俗企鹅", + "我踏马来了": "我踏马来了", + "老子": "老子", + "雪球": "雪球", + "黑马": "黑马" } diff --git a/apps/api/src/helper/object.helper.spec.ts b/apps/api/src/helper/object.helper.spec.ts index 433490325..ed821390f 100644 --- a/apps/api/src/helper/object.helper.spec.ts +++ b/apps/api/src/helper/object.helper.spec.ts @@ -1,47 +1,61 @@ -import { redactAttributes } from './object.helper'; +import { DEFAULT_REDACTED_PATHS } from '@ghostfolio/common/config'; + +import { query, redactPaths } from './object.helper'; + +describe('query', () => { + it('should get market price from stock API response', () => { + const object = { + currency: 'USD', + market: { + previousClose: 273.04, + price: 271.86 + }, + symbol: 'AAPL' + }; + + const result = query({ + object, + pathExpression: '$.market.price' + })[0]; + + expect(result).toBe(271.86); + }); +}); describe('redactAttributes', () => { it('should redact provided attributes', () => { - expect(redactAttributes({ object: {}, options: [] })).toStrictEqual({}); + expect(redactPaths({ object: {}, paths: [] })).toStrictEqual({}); - expect( - redactAttributes({ object: { value: 1000 }, options: [] }) - ).toStrictEqual({ value: 1000 }); + expect(redactPaths({ object: { value: 1000 }, paths: [] })).toStrictEqual({ + value: 1000 + }); expect( - redactAttributes({ + redactPaths({ object: { value: 1000 }, - options: [{ attribute: 'value', valueMap: { '*': null } }] + paths: ['value'] }) ).toStrictEqual({ value: null }); expect( - redactAttributes({ + redactPaths({ object: { value: 'abc' }, - options: [{ attribute: 'value', valueMap: { abc: 'xyz' } }] + paths: ['value'], + valueMap: { abc: 'xyz' } }) ).toStrictEqual({ value: 'xyz' }); expect( - redactAttributes({ + redactPaths({ object: { data: [{ value: 'a' }, { value: 'b' }] }, - options: [{ attribute: 'value', valueMap: { a: 1, b: 2 } }] + paths: ['data[*].value'], + valueMap: { a: 1, b: 2 } }) ).toStrictEqual({ data: [{ value: 1 }, { value: 2 }] }); - expect( - redactAttributes({ - object: { value1: 'a', value2: 'b' }, - options: [ - { attribute: 'value1', valueMap: { a: 'x' } }, - { attribute: 'value2', valueMap: { '*': 'y' } } - ] - }) - ).toStrictEqual({ value1: 'x', value2: 'y' }); - console.time('redactAttributes execution time'); expect( - redactAttributes({ + redactPaths({ object: { accounts: { '2e937c05-657c-4de9-8fb3-0813a2245f26': { @@ -97,6 +111,7 @@ describe('redactAttributes', () => { hasError: false, holdings: { 'AAPL.US': { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -116,7 +131,6 @@ describe('redactAttributes', () => { marketPrice: 220.79, symbol: 'AAPL.US', tags: [], - transactionCount: 1, allocationInPercentage: 0.044900865255793135, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -149,6 +163,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.0694356974830054 }, 'ALV.DE': { + activitiesCount: 2, currency: 'EUR', markets: { UNKNOWN: 0, @@ -168,7 +183,6 @@ describe('redactAttributes', () => { marketPrice: 296.5, symbol: 'ALV.DE', tags: [], - transactionCount: 2, allocationInPercentage: 0.026912563036519527, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -196,6 +210,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.04161818652826481 }, AMZN: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -215,7 +230,6 @@ describe('redactAttributes', () => { marketPrice: 187.99, symbol: 'AMZN', tags: [], - transactionCount: 1, allocationInPercentage: 0.07646101417126275, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -248,6 +262,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.11824101426541227 }, bitcoin: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 36985.0332704, @@ -273,7 +288,6 @@ describe('redactAttributes', () => { userId: null } ], - transactionCount: 1, allocationInPercentage: 0.15042891393226654, assetClass: 'LIQUIDITY', assetSubClass: 'CRYPTOCURRENCY', @@ -299,6 +313,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.232626620912395 }, BONDORA_GO_AND_GROW: { + activitiesCount: 5, currency: 'EUR', markets: { UNKNOWN: 2231.644722160232, @@ -324,7 +339,6 @@ describe('redactAttributes', () => { userId: null } ], - transactionCount: 5, allocationInPercentage: 0.009076749759365777, assetClass: 'FIXED_INCOME', assetSubClass: 'BOND', @@ -350,6 +364,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.014036487867880205 }, FRANKLY95P: { + activitiesCount: 6, currency: 'CHF', markets: { UNKNOWN: 0, @@ -375,7 +390,6 @@ describe('redactAttributes', () => { userId: null } ], - transactionCount: 6, allocationInPercentage: 0.09095764645669335, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -474,6 +488,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.14065892911313693 }, MSFT: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -493,7 +508,6 @@ describe('redactAttributes', () => { marketPrice: 428.02, symbol: 'MSFT', tags: [], - transactionCount: 1, allocationInPercentage: 0.05222646409742627, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -526,6 +540,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.08076416659271518 }, TSLA: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -545,7 +560,6 @@ describe('redactAttributes', () => { marketPrice: 260.46, symbol: 'TSLA', tags: [], - transactionCount: 1, allocationInPercentage: 0.1589050142378352, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -578,6 +592,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.2457342510950259 }, VTI: { + activitiesCount: 5, currency: 'USD', markets: { UNKNOWN: 0, @@ -597,7 +612,6 @@ describe('redactAttributes', () => { marketPrice: 282.05, symbol: 'VTI', tags: [], - transactionCount: 5, allocationInPercentage: 0.057358979326040366, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -750,6 +764,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.08870120238725339 }, 'VWRL.SW': { + activitiesCount: 5, currency: 'CHF', markets: { UNKNOWN: 0, @@ -769,7 +784,6 @@ describe('redactAttributes', () => { marketPrice: 117.62, symbol: 'VWRL.SW', tags: [], - transactionCount: 5, allocationInPercentage: 0.09386983901959013, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -1158,6 +1172,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.145162408515095 }, 'XDWD.DE': { + activitiesCount: 1, currency: 'EUR', markets: { UNKNOWN: 0, @@ -1177,7 +1192,6 @@ describe('redactAttributes', () => { marketPrice: 105.72, symbol: 'XDWD.DE', tags: [], - transactionCount: 1, allocationInPercentage: 0.03598477442100562, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -1436,6 +1450,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.055647656152211074 }, USD: { + activitiesCount: 0, currency: 'USD', allocationInPercentage: 0.20291717628620132, assetClass: 'LIQUIDITY', @@ -1458,7 +1473,6 @@ describe('redactAttributes', () => { sectors: [], symbol: 'USD', tags: [], - transactionCount: 0, valueInBaseCurrency: 49890, valueInPercentage: 0.3137956381563603 } @@ -1544,34 +1558,7 @@ describe('redactAttributes', () => { currentNetWorth: null } }, - options: [ - 'balance', - 'balanceInBaseCurrency', - 'comment', - 'convertedBalance', - 'dividendInBaseCurrency', - 'fee', - 'feeInBaseCurrency', - 'grossPerformance', - 'grossPerformanceWithCurrencyEffect', - 'investment', - 'netPerformance', - 'netPerformanceWithCurrencyEffect', - 'quantity', - 'symbolMapping', - 'totalBalanceInBaseCurrency', - 'totalValueInBaseCurrency', - 'unitPrice', - 'value', - 'valueInBaseCurrency' - ].map((attribute) => { - return { - attribute, - valueMap: { - '*': null - } - }; - }) + paths: DEFAULT_REDACTED_PATHS }) ).toStrictEqual({ accounts: { @@ -1628,6 +1615,7 @@ describe('redactAttributes', () => { hasError: false, holdings: { 'AAPL.US': { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -1647,7 +1635,6 @@ describe('redactAttributes', () => { marketPrice: 220.79, symbol: 'AAPL.US', tags: [], - transactionCount: 1, allocationInPercentage: 0.044900865255793135, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -1661,7 +1648,7 @@ describe('redactAttributes', () => { ], dataSource: 'EOD_HISTORICAL_DATA', dateOfFirstActivity: '2021-11-30T23:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.3183066634822068, grossPerformancePercentWithCurrencyEffect: 0.3183066634822068, @@ -1680,6 +1667,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.0694356974830054 }, 'ALV.DE': { + activitiesCount: 2, currency: 'EUR', markets: { UNKNOWN: 0, @@ -1699,7 +1687,6 @@ describe('redactAttributes', () => { marketPrice: 296.5, symbol: 'ALV.DE', tags: [], - transactionCount: 2, allocationInPercentage: 0.026912563036519527, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -1708,7 +1695,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2021-04-22T22:00:00.000Z', - dividend: 192, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.3719230057375532, grossPerformancePercentWithCurrencyEffect: 0.2650716044872953, @@ -1727,6 +1714,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.04161818652826481 }, AMZN: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -1746,7 +1734,6 @@ describe('redactAttributes', () => { marketPrice: 187.99, symbol: 'AMZN', tags: [], - transactionCount: 1, allocationInPercentage: 0.07646101417126275, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -1760,7 +1747,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2018-09-30T22:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.8594552890963852, grossPerformancePercentWithCurrencyEffect: 0.8594552890963852, @@ -1779,6 +1766,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.11824101426541227 }, bitcoin: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 36985.0332704, @@ -1804,14 +1792,13 @@ describe('redactAttributes', () => { userId: null } ], - transactionCount: 1, allocationInPercentage: 0.15042891393226654, assetClass: 'LIQUIDITY', assetSubClass: 'CRYPTOCURRENCY', countries: [], dataSource: 'COINGECKO', dateOfFirstActivity: '2017-08-15T22:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 17.4925166352, grossPerformancePercentWithCurrencyEffect: 17.4925166352, @@ -1830,6 +1817,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.232626620912395 }, BONDORA_GO_AND_GROW: { + activitiesCount: 5, currency: 'EUR', markets: { UNKNOWN: 2231.644722160232, @@ -1855,14 +1843,13 @@ describe('redactAttributes', () => { userId: null } ], - transactionCount: 5, allocationInPercentage: 0.009076749759365777, assetClass: 'FIXED_INCOME', assetSubClass: 'BOND', countries: [], dataSource: 'MANUAL', dateOfFirstActivity: '2021-01-31T23:00:00.000Z', - dividend: 11.45, + dividend: null, grossPerformance: null, grossPerformancePercent: 0, grossPerformancePercentWithCurrencyEffect: -0.06153834320225245, @@ -1881,6 +1868,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.014036487867880205 }, FRANKLY95P: { + activitiesCount: 6, currency: 'CHF', markets: { UNKNOWN: 0, @@ -1906,7 +1894,6 @@ describe('redactAttributes', () => { userId: null } ], - transactionCount: 6, allocationInPercentage: 0.09095764645669335, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -1966,7 +1953,7 @@ describe('redactAttributes', () => { ], dataSource: 'MANUAL', dateOfFirstActivity: '2021-03-31T22:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.27579517683678895, grossPerformancePercentWithCurrencyEffect: 0.458553421589667, @@ -1985,6 +1972,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.14065892911313693 }, MSFT: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -2004,7 +1992,6 @@ describe('redactAttributes', () => { marketPrice: 428.02, symbol: 'MSFT', tags: [], - transactionCount: 1, allocationInPercentage: 0.05222646409742627, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -2018,7 +2005,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2023-01-02T23:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.7865431171216295, grossPerformancePercentWithCurrencyEffect: 0.7865431171216295, @@ -2037,6 +2024,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.08076416659271518 }, TSLA: { + activitiesCount: 1, currency: 'USD', markets: { UNKNOWN: 0, @@ -2056,7 +2044,6 @@ describe('redactAttributes', () => { marketPrice: 260.46, symbol: 'TSLA', tags: [], - transactionCount: 1, allocationInPercentage: 0.1589050142378352, assetClass: 'EQUITY', assetSubClass: 'STOCK', @@ -2070,7 +2057,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2017-01-02T23:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 17.184314638161936, grossPerformancePercentWithCurrencyEffect: 17.184314638161936, @@ -2089,6 +2076,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.2457342510950259 }, VTI: { + activitiesCount: 5, currency: 'USD', markets: { UNKNOWN: 0, @@ -2108,7 +2096,6 @@ describe('redactAttributes', () => { marketPrice: 282.05, symbol: 'VTI', tags: [], - transactionCount: 5, allocationInPercentage: 0.057358979326040366, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -2152,7 +2139,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2019-02-28T23:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.8832083851170418, grossPerformancePercentWithCurrencyEffect: 0.8832083851170418, @@ -2261,6 +2248,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.08870120238725339 }, 'VWRL.SW': { + activitiesCount: 5, currency: 'CHF', markets: { UNKNOWN: 0, @@ -2280,7 +2268,6 @@ describe('redactAttributes', () => { marketPrice: 117.62, symbol: 'VWRL.SW', tags: [], - transactionCount: 5, allocationInPercentage: 0.09386983901959013, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -2547,7 +2534,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2018-02-28T23:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.3683200415015591, grossPerformancePercentWithCurrencyEffect: 0.5806366182968891, @@ -2661,6 +2648,7 @@ describe('redactAttributes', () => { valueInPercentage: 0.145162408515095 }, 'XDWD.DE': { + activitiesCount: 1, currency: 'EUR', markets: { UNKNOWN: 0, @@ -2680,7 +2668,6 @@ describe('redactAttributes', () => { marketPrice: 105.72, symbol: 'XDWD.DE', tags: [], - transactionCount: 1, allocationInPercentage: 0.03598477442100562, assetClass: 'EQUITY', assetSubClass: 'ETF', @@ -2826,7 +2813,7 @@ describe('redactAttributes', () => { ], dataSource: 'YAHOO', dateOfFirstActivity: '2021-08-18T22:00:00.000Z', - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0.3474381850624522, grossPerformancePercentWithCurrencyEffect: 0.28744846894552306, @@ -2939,12 +2926,13 @@ describe('redactAttributes', () => { valueInPercentage: 0.055647656152211074 }, USD: { + activitiesCount: 0, currency: 'USD', allocationInPercentage: 0.20291717628620132, assetClass: 'LIQUIDITY', assetSubClass: 'CASH', countries: [], - dividend: 0, + dividend: null, grossPerformance: null, grossPerformancePercent: 0, grossPerformancePercentWithCurrencyEffect: 0, @@ -2961,7 +2949,6 @@ describe('redactAttributes', () => { sectors: [], symbol: 'USD', tags: [], - transactionCount: 0, valueInBaseCurrency: null, valueInPercentage: 0.3137956381563603 } diff --git a/apps/api/src/helper/object.helper.ts b/apps/api/src/helper/object.helper.ts index a5854e9d9..350d5fe04 100644 --- a/apps/api/src/helper/object.helper.ts +++ b/apps/api/src/helper/object.helper.ts @@ -1,5 +1,6 @@ -import { Big } from 'big.js'; -import { cloneDeep, isArray, isObject } from 'lodash'; +import fastRedact from 'fast-redact'; +import jsonpath from 'jsonpath'; +import { cloneDeep, isObject } from 'lodash'; export function hasNotDefinedValuesInObject(aObject: Object): boolean { for (const key in aObject) { @@ -31,60 +32,39 @@ export function nullifyValuesInObjects(aObjects: T[], keys: string[]): T[] { }); } -export function redactAttributes({ - isFirstRun = true, +export function query({ object, - options + pathExpression +}: { + object: object; + pathExpression: string; +}) { + return jsonpath.query(object, pathExpression); +} + +export function redactPaths({ + object, + paths, + valueMap }: { - isFirstRun?: boolean; object: any; - options: { attribute: string; valueMap: { [key: string]: any } }[]; + paths: fastRedact.RedactOptions['paths']; + valueMap?: { [key: string]: any }; }): any { - if (!object || !options?.length) { - return object; - } - - // Create deep clone - const redactedObject = isFirstRun - ? JSON.parse(JSON.stringify(object)) - : object; - - for (const option of options) { - if (redactedObject.hasOwnProperty(option.attribute)) { - if (option.valueMap['*'] || option.valueMap['*'] === null) { - redactedObject[option.attribute] = option.valueMap['*']; - } else if (option.valueMap[redactedObject[option.attribute]]) { - redactedObject[option.attribute] = - option.valueMap[redactedObject[option.attribute]]; - } - } else { - // If the attribute is not present on the current object, - // check if it exists on any nested objects - for (const property in redactedObject) { - if (isArray(redactedObject[property])) { - redactedObject[property] = redactedObject[property].map( - (currentObject) => { - return redactAttributes({ - options, - isFirstRun: false, - object: currentObject - }); - } - ); - } else if ( - isObject(redactedObject[property]) && - !(redactedObject[property] instanceof Big) - ) { - // Recursively call the function on the nested object - redactedObject[property] = redactAttributes({ - options, - isFirstRun: false, - object: redactedObject[property] - }); + const redact = fastRedact({ + paths, + censor: (value) => { + if (valueMap) { + if (valueMap[value]) { + return valueMap[value]; + } else { + return value; } + } else { + return null; } } - } + }); - return redactedObject; + return JSON.parse(redact(object)); } diff --git a/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts b/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts index 5ecf7c48d..60b994cac 100644 --- a/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts +++ b/apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts @@ -1,5 +1,8 @@ -import { redactAttributes } from '@ghostfolio/api/helper/object.helper'; -import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; +import { redactPaths } from '@ghostfolio/api/helper/object.helper'; +import { + DEFAULT_REDACTED_PATHS, + HEADER_KEY_IMPERSONATION +} from '@ghostfolio/common/config'; import { hasReadRestrictedAccessPermission, isRestrictedView @@ -39,40 +42,9 @@ export class RedactValuesInResponseInterceptor implements NestInterceptor< }) || isRestrictedView(user) ) { - data = redactAttributes({ + data = redactPaths({ object: data, - options: [ - 'balance', - 'balanceInBaseCurrency', - 'comment', - 'convertedBalance', - 'dividendInBaseCurrency', - 'fee', - 'feeInBaseCurrency', - 'grossPerformance', - 'grossPerformanceWithCurrencyEffect', - 'interestInBaseCurrency', - 'investment', - 'netPerformance', - 'netPerformanceWithCurrencyEffect', - 'quantity', - 'symbolMapping', - 'totalBalanceInBaseCurrency', - 'totalDividendInBaseCurrency', - 'totalInterestInBaseCurrency', - 'totalValueInBaseCurrency', - 'unitPrice', - 'unitPriceInAssetProfileCurrency', - 'value', - 'valueInBaseCurrency' - ].map((attribute) => { - return { - attribute, - valueMap: { - '*': null - } - }; - }) + paths: DEFAULT_REDACTED_PATHS }); } diff --git a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts index 9af256671..eaa6dd08c 100644 --- a/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts +++ b/apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts @@ -1,4 +1,4 @@ -import { redactAttributes } from '@ghostfolio/api/helper/object.helper'; +import { redactPaths } from '@ghostfolio/api/helper/object.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { encodeDataSource } from '@ghostfolio/common/helper'; @@ -58,13 +58,18 @@ export class TransformDataSourceInResponseInterceptor< } } - data = redactAttributes({ + data = redactPaths({ + valueMap, object: data, - options: [ - { - valueMap, - attribute: 'dataSource' - } + paths: [ + 'activities[*].SymbolProfile.dataSource', + 'benchmarks[*].dataSource', + 'fearAndGreedIndex.CRYPTOCURRENCIES.dataSource', + 'fearAndGreedIndex.STOCKS.dataSource', + 'holdings[*].dataSource', + 'items[*].dataSource', + 'SymbolProfile.dataSource', + 'watchlist[*].dataSource' ] }); } diff --git a/apps/api/src/services/configuration/configuration.service.ts b/apps/api/src/services/configuration/configuration.service.ts index a91aa6e69..5f9d1055d 100644 --- a/apps/api/src/services/configuration/configuration.service.ts +++ b/apps/api/src/services/configuration/configuration.service.ts @@ -102,7 +102,6 @@ export class ConfigurationService { ROOT_URL: url({ default: environment.rootUrl }), - STRIPE_PUBLIC_KEY: str({ default: '' }), STRIPE_SECRET_KEY: str({ default: '' }), TWITTER_ACCESS_TOKEN: str({ default: 'dummyAccessToken' }), TWITTER_ACCESS_TOKEN_SECRET: str({ default: 'dummyAccessTokenSecret' }), diff --git a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts index 3cf935b1e..6030e62d4 100644 --- a/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts +++ b/apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts @@ -18,7 +18,7 @@ import { import { Injectable } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; -import * as Alphavantage from 'alphavantage'; +import Alphavantage from 'alphavantage'; import { format, isAfter, isBefore, parse } from 'date-fns'; import { AlphaVantageHistoricalResponse } from './interfaces/interfaces'; diff --git a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts index 65bcd6c06..c83e35503 100644 --- a/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts +++ b/apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts @@ -135,10 +135,10 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { shortName, symbol }: { - longName: Price['longName']; - quoteType: Price['quoteType']; - shortName: Price['shortName']; - symbol: Price['symbol']; + longName?: Price['longName']; + quoteType?: Price['quoteType']; + shortName?: Price['shortName']; + symbol?: Price['symbol']; }) { let name = longName; @@ -206,17 +206,26 @@ export class YahooFinanceDataEnhancerService implements DataEnhancerInterface { ); if (['ETF', 'MUTUALFUND'].includes(assetSubClass)) { - response.sectors = []; - - for (const sectorWeighting of assetProfile.topHoldings - ?.sectorWeightings ?? []) { - for (const [sector, weight] of Object.entries(sectorWeighting)) { - response.sectors.push({ + response.holdings = + assetProfile.topHoldings?.holdings?.map( + ({ holdingName, holdingPercent }) => { + return { + name: this.formatName({ longName: holdingName }), + weight: holdingPercent + }; + } + ) ?? []; + + response.sectors = ( + assetProfile.topHoldings?.sectorWeightings ?? [] + ).flatMap((sectorWeighting) => { + return Object.entries(sectorWeighting).map(([sector, weight]) => { + return { name: this.parseSector(sector), weight: weight as number - }); - } - } + }; + }); + }); } else if ( assetSubClass === 'STOCK' && assetProfile.summaryProfile?.country diff --git a/apps/api/src/services/data-provider/manual/manual.service.ts b/apps/api/src/services/data-provider/manual/manual.service.ts index f18da49ab..7392f0914 100644 --- a/apps/api/src/services/data-provider/manual/manual.service.ts +++ b/apps/api/src/services/data-provider/manual/manual.service.ts @@ -1,3 +1,4 @@ +import { query } from '@ghostfolio/api/helper/object.helper'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { DataProviderInterface, @@ -26,7 +27,6 @@ import { Injectable, Logger } from '@nestjs/common'; import { DataSource, SymbolProfile } from '@prisma/client'; import * as cheerio from 'cheerio'; import { addDays, format, isBefore } from 'date-fns'; -import * as jsonpath from 'jsonpath'; @Injectable() export class ManualService implements DataProviderInterface { @@ -286,9 +286,14 @@ export class ManualService implements DataProviderInterface { let value: string; if (response.headers.get('content-type')?.includes('application/json')) { - const data = await response.json(); + const object = await response.json(); - value = String(jsonpath.query(data, scraperConfiguration.selector)[0]); + value = String( + query({ + object, + pathExpression: scraperConfiguration.selector + })[0] + ); } else { const $ = cheerio.load(await response.text()); diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts index 076375523..742be36b4 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.mock.ts @@ -1,5 +1,7 @@ -export const ExchangeRateDataServiceMock = { - getExchangeRatesByCurrency: ({ targetCurrency }): Promise => { +import { ExchangeRateDataService } from './exchange-rate-data.service'; + +export const ExchangeRateDataServiceMock: Partial = { + getExchangeRatesByCurrency: ({ targetCurrency }) => { if (targetCurrency === 'CHF') { return Promise.resolve({ CHFCHF: { @@ -14,7 +16,11 @@ export const ExchangeRateDataServiceMock = { '2017-12-31': 0.9787, '2018-01-01': 0.97373, '2023-01-03': 0.9238, - '2023-07-10': 0.8854 + '2023-07-10': 0.8854, + '2023-12-31': 0.85, + '2024-01-01': 0.86, + '2024-12-31': 0.9, + '2025-01-01': 0.91 } }); } else if (targetCurrency === 'EUR') { diff --git a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts index 8c1ba5b41..024bdf4e1 100644 --- a/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts +++ b/apps/api/src/services/exchange-rate-data/exchange-rate-data.service.ts @@ -26,6 +26,8 @@ import { import { isNumber } from 'lodash'; import ms from 'ms'; +import { ExchangeRatesByCurrency } from './interfaces/exchange-rate-data.interface'; + @Injectable() export class ExchangeRateDataService { private currencies: string[] = []; @@ -59,7 +61,7 @@ export class ExchangeRateDataService { endDate?: Date; startDate: Date; targetCurrency: string; - }) { + }): Promise { if (!startDate) { return {}; } diff --git a/apps/api/src/services/exchange-rate-data/interfaces/exchange-rate-data.interface.ts b/apps/api/src/services/exchange-rate-data/interfaces/exchange-rate-data.interface.ts new file mode 100644 index 000000000..8e0d2c0d4 --- /dev/null +++ b/apps/api/src/services/exchange-rate-data/interfaces/exchange-rate-data.interface.ts @@ -0,0 +1,5 @@ +export interface ExchangeRatesByCurrency { + [currency: string]: { + [dateString: string]: number; + }; +} diff --git a/apps/api/src/services/interfaces/environment.interface.ts b/apps/api/src/services/interfaces/environment.interface.ts index 3c03744f1..57c58898e 100644 --- a/apps/api/src/services/interfaces/environment.interface.ts +++ b/apps/api/src/services/interfaces/environment.interface.ts @@ -52,7 +52,6 @@ export interface Environment extends CleanedEnvAccessors { REDIS_PORT: number; REQUEST_TIMEOUT: number; ROOT_URL: string; - STRIPE_PUBLIC_KEY: string; STRIPE_SECRET_KEY: string; TWITTER_ACCESS_TOKEN: string; TWITTER_ACCESS_TOKEN_SECRET: string; diff --git a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts index 75a3a8631..58a0a8f8a 100644 --- a/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts +++ b/apps/api/src/services/queues/portfolio-snapshot/portfolio-snapshot.processor.ts @@ -50,7 +50,8 @@ export class PortfolioSnapshotProcessor { await this.orderService.getOrdersForPortfolioCalculator({ filters: job.data.filters, userCurrency: job.data.userCurrency, - userId: job.data.userId + userId: job.data.userId, + withCash: true }); const accountBalanceItems = diff --git a/apps/api/src/services/tag/tag.service.ts b/apps/api/src/services/tag/tag.service.ts index eb2d7bfef..f4cbd4cb1 100644 --- a/apps/api/src/services/tag/tag.service.ts +++ b/apps/api/src/services/tag/tag.service.ts @@ -75,12 +75,16 @@ export class TagService { } }); - return tags.map(({ _count, id, name, userId }) => ({ - id, - name, - userId, - isUsed: _count.activities > 0 - })); + return tags + .map(({ _count, id, name, userId }) => ({ + id, + name, + userId, + isUsed: _count.activities > 0 + })) + .sort((a, b) => { + return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); + }); } public async getTagsWithActivityCount() { diff --git a/apps/api/tsconfig.app.json b/apps/api/tsconfig.app.json index 655120714..d38ef826f 100644 --- a/apps/api/tsconfig.app.json +++ b/apps/api/tsconfig.app.json @@ -4,6 +4,7 @@ "outDir": "../../dist/out-tsc", "types": ["node"], "emitDecoratorMetadata": true, + "moduleResolution": "node10", "target": "es2021", "module": "commonjs" }, diff --git a/apps/api/tsconfig.spec.json b/apps/api/tsconfig.spec.json index 148da8555..934e28503 100644 --- a/apps/api/tsconfig.spec.json +++ b/apps/api/tsconfig.spec.json @@ -3,6 +3,7 @@ "compilerOptions": { "outDir": "../../dist/out-tsc", "module": "commonjs", + "moduleResolution": "node10", "types": ["jest", "node"] }, "include": ["**/*.spec.ts", "**/*.test.ts", "**/*.d.ts", "jest.config.ts"] diff --git a/apps/client/project.json b/apps/client/project.json index 0d3571cdf..38887ca8a 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -26,6 +26,10 @@ "baseHref": "/it/", "translation": "apps/client/src/locales/messages.it.xlf" }, + "ko": { + "baseHref": "/ko/", + "translation": "apps/client/src/locales/messages.ko.xlf" + }, "nl": { "baseHref": "/nl/", "translation": "apps/client/src/locales/messages.nl.xlf" @@ -75,7 +79,6 @@ "ngswConfigPath": "apps/client/ngsw-config.json", "optimization": false, "polyfills": "apps/client/src/polyfills.ts", - "scripts": ["node_modules/marked/marked.min.js"], "serviceWorker": true, "sourceMap": true, "styles": [ @@ -111,6 +114,10 @@ "baseHref": "/it/", "localize": ["it"] }, + "development-ko": { + "baseHref": "/ko/", + "localize": ["ko"] + }, "development-nl": { "baseHref": "/nl/", "localize": ["nl"] @@ -214,6 +221,9 @@ "sslKey": "apps/client/localhost.pem" }, "configurations": { + "development-ca": { + "buildTarget": "client:build:development-ca" + }, "development-de": { "buildTarget": "client:build:development-de" }, @@ -229,6 +239,9 @@ "development-it": { "buildTarget": "client:build:development-it" }, + "development-ko": { + "buildTarget": "client:build:development-ko" + }, "development-nl": { "buildTarget": "client:build:development-nl" }, @@ -265,6 +278,7 @@ "messages.es.xlf", "messages.fr.xlf", "messages.it.xlf", + "messages.ko.xlf", "messages.nl.xlf", "messages.pl.xlf", "messages.pt.xlf", diff --git a/apps/client/src/app/app.component.ts b/apps/client/src/app/app.component.ts index 12a7b0de9..a4af01124 100644 --- a/apps/client/src/app/app.component.ts +++ b/apps/client/src/app/app.component.ts @@ -4,6 +4,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { ColorScheme } from '@ghostfolio/common/types'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, @@ -36,7 +37,6 @@ import { GfFooterComponent } from './components/footer/footer.component'; import { GfHeaderComponent } from './components/header/header.component'; import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component'; import { HoldingDetailDialogParams } from './components/holding-detail-dialog/interfaces/interfaces'; -import { DataService } from './services/data.service'; import { ImpersonationStorageService } from './services/impersonation-storage.service'; import { TokenStorageService } from './services/token-storage.service'; import { UserService } from './services/user/user.service'; diff --git a/apps/client/src/app/components/access-table/access-table.component.ts b/apps/client/src/app/components/access-table/access-table.component.ts index fe2c81199..76548c45d 100644 --- a/apps/client/src/app/components/access-table/access-table.component.ts +++ b/apps/client/src/app/components/access-table/access-table.component.ts @@ -4,7 +4,6 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { Clipboard, ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -36,7 +35,6 @@ import ms from 'ms'; changeDetection: ChangeDetectionStrategy.OnPush, imports: [ ClipboardModule, - CommonModule, IonIcon, MatButtonModule, MatMenuModule, diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts index d8f08ecc2..380fb69cb 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts @@ -1,5 +1,4 @@ import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; @@ -19,6 +18,7 @@ import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; +import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; @@ -80,6 +80,7 @@ import { AccountDetailDialogParams } from './interfaces/interfaces'; export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { public accountBalances: AccountBalancesResponse['balances']; public activities: OrderWithAccount[]; + public activitiesCount: number; public balance: number; public balancePrecision = 2; public currency: string; @@ -100,7 +101,6 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { public sortColumn = 'date'; public sortDirection: SortDirection = 'desc'; public totalItems: number; - public transactionCount: number; public user: User; public valueInBaseCurrency: number; @@ -215,16 +215,17 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { .pipe(takeUntil(this.unsubscribeSubject)) .subscribe( ({ + activitiesCount, balance, currency, dividendInBaseCurrency, interestInBaseCurrency, name, platform, - transactionCount, value, valueInBaseCurrency }) => { + this.activitiesCount = activitiesCount; this.balance = balance; if ( @@ -270,7 +271,6 @@ export class GfAccountDetailDialogComponent implements OnDestroy, OnInit { this.name = name; this.platformName = platform?.name ?? '-'; - this.transactionCount = transactionCount; this.valueInBaseCurrency = valueInBaseCurrency; this.changeDetectorRef.markForCheck(); diff --git a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html index 07ea17038..15dd8f13a 100644 --- a/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html +++ b/apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html @@ -82,7 +82,7 @@ >
- Activities
diff --git a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts index 66bac76f5..de70a7b6e 100644 --- a/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts +++ b/apps/client/src/app/components/admin-jobs/admin-jobs.component.ts @@ -1,4 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DATA_GATHERING_QUEUE_PRIORITY_HIGH, @@ -9,6 +8,7 @@ import { import { getDateWithTimeFormatString } from '@ghostfolio/common/helper'; import { AdminJobs, User } from '@ghostfolio/common/interfaces'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { AdminService } from '@ghostfolio/ui/services'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts index 4f1b60981..8f956b782 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.component.ts @@ -1,5 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { DEFAULT_PAGE_SIZE, @@ -18,6 +16,7 @@ import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { translate } from '@ghostfolio/ui/i18n'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { SelectionModel } from '@angular/cdk/collections'; @@ -64,7 +63,7 @@ import { import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; -import { distinctUntilChanged, switchMap, takeUntil } from 'rxjs/operators'; +import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; import { AdminMarketDataService } from './admin-market-data.service'; import { GfAssetProfileDialogComponent } from './asset-profile-dialog/asset-profile-dialog.component'; @@ -483,32 +482,27 @@ export class GfAdminMarketDataComponent dialogRef .afterClosed() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ dataSource, symbol } = {}) => { - if (dataSource && symbol) { + .subscribe((result) => { + if (!result) { + this.router.navigate(['.'], { relativeTo: this.route }); + + return; + } + + const { addAssetProfile, dataSource, symbol } = result; + + if (addAssetProfile && dataSource && symbol) { this.adminService .addAssetProfile({ dataSource, symbol }) - .pipe( - switchMap(() => { - this.isLoading = true; - this.changeDetectorRef.markForCheck(); - - return this.adminService.fetchAdminMarketData({ - filters: this.activeFilters, - take: this.pageSize - }); - }), - takeUntil(this.unsubscribeSubject) - ) - .subscribe(({ marketData }) => { - this.dataSource = new MatTableDataSource(marketData); - this.dataSource.sort = this.sort; - this.isLoading = false; - - this.changeDetectorRef.markForCheck(); + .pipe(takeUntil(this.unsubscribeSubject)) + .subscribe(() => { + this.loadData(); }); + } else { + this.loadData(); } - this.router.navigate(['.'], { relativeTo: this.route }); + this.onOpenAssetProfileDialog({ dataSource, symbol }); }); }); } diff --git a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts index eaad32c0e..9528687a8 100644 --- a/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts +++ b/apps/client/src/app/components/admin-market-data/admin-market-data.service.ts @@ -1,4 +1,3 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { @@ -11,6 +10,7 @@ import { AdminMarketDataItem } from '@ghostfolio/common/interfaces'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { AdminService } from '@ghostfolio/ui/services'; import { Injectable } from '@angular/core'; import { EMPTY, catchError, finalize, forkJoin } from 'rxjs'; diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss index 5e469970e..73c0c0d74 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.scss @@ -13,21 +13,5 @@ right: 1rem; top: 0; } - - .mat-expansion-panel { - --mat-expansion-container-background-color: transparent; - - ::ng-deep { - .mat-expansion-panel-body { - padding: 0; - } - } - - .mat-expansion-panel-header { - &:hover { - --mat-expansion-header-hover-state-layer-color: transparent; - } - } - } } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts index b82719995..48b2eacd7 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts @@ -1,6 +1,4 @@ import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ASSET_CLASS_MAPPING, @@ -28,11 +26,11 @@ import { translate } from '@ghostfolio/ui/i18n'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { TextFieldModule } from '@angular/cdk/text-field'; -import { CommonModule } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { ChangeDetectionStrategy, @@ -42,8 +40,7 @@ import { Inject, OnDestroy, OnInit, - ViewChild, - signal + ViewChild } from '@angular/core'; import { AbstractControl, @@ -64,7 +61,6 @@ import { MatDialogModule, MatDialogRef } from '@angular/material/dialog'; -import { MatExpansionModule } from '@angular/material/expansion'; import { MatInputModule } from '@angular/material/input'; import { MatMenuModule } from '@angular/material/menu'; import { MatSelectModule } from '@angular/material/select'; @@ -83,6 +79,7 @@ import { format } from 'date-fns'; import { StatusCodes } from 'http-status-codes'; import { addIcons } from 'ionicons'; import { + codeSlashOutline, createOutline, ellipsisVertical, readerOutline, @@ -98,7 +95,6 @@ import { AssetProfileDialogParams } from './interfaces/interfaces'; changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'd-flex flex-column h-100' }, imports: [ - CommonModule, FormsModule, GfCurrencySelectorComponent, GfEntityLogoComponent, @@ -111,7 +107,6 @@ import { AssetProfileDialogParams } from './interfaces/interfaces'; MatButtonModule, MatCheckboxModule, MatDialogModule, - MatExpansionModule, MatInputModule, MatMenuModule, MatSelectModule, @@ -238,8 +233,6 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { } ]; - public scraperConfiguationIsExpanded = signal(false); - public sectors: { [name: string]: { name: string; value: number }; }; @@ -260,7 +253,13 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { private snackBar: MatSnackBar, private userService: UserService ) { - addIcons({ createOutline, ellipsisVertical, readerOutline, serverOutline }); + addIcons({ + codeSlashOutline, + createOutline, + ellipsisVertical, + readerOutline, + serverOutline + }); } public get canSaveAssetProfileIdentifier() { @@ -509,7 +508,19 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { if (!scraperConfiguration.selector || !scraperConfiguration.url) { scraperConfiguration = undefined; } - } catch {} + } catch (error) { + console.error($localize`Could not parse scraper configuration`, error); + + this.snackBar.open( + '😞 ' + $localize`Could not parse scraper configuration`, + undefined, + { + duration: ms('3 seconds') + } + ); + + return; + } try { sectors = JSON.parse(this.assetProfileForm.get('sectors').value); @@ -543,7 +554,16 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { object: assetProfile }); } catch (error) { - console.error(error); + console.error($localize`Could not validate form`, error); + + this.snackBar.open( + '😞 ' + $localize`Could not validate form`, + undefined, + { + duration: ms('3 seconds') + } + ); + return; } @@ -555,8 +575,29 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { }, assetProfile ) - .subscribe(() => { - this.initialize(); + .subscribe({ + next: () => { + this.snackBar.open( + '✅ ' + $localize`Asset profile has been saved`, + undefined, + { + duration: ms('3 seconds') + } + ); + + this.initialize(); + }, + error: (error) => { + console.error($localize`Could not save asset profile`, error); + + this.snackBar.open( + '😞 ' + $localize`Could not save asset profile`, + undefined, + { + duration: ms('3 seconds') + } + ); + } }); } @@ -707,8 +748,8 @@ export class GfAssetProfileDialogComponent implements OnDestroy, OnInit { } public onTriggerSubmitAssetProfileForm() { - if (this.assetProfileForm) { - this.assetProfileFormElement.nativeElement.requestSubmit(); + if (this.assetProfileForm.valid) { + this.onSubmitAssetProfileForm(); } } diff --git a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html index f298ed527..9d2a22c0d 100644 --- a/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html +++ b/apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html @@ -586,6 +586,115 @@ + @if (assetProfile?.dataSource === 'MANUAL') { + + + +
Scraper Configuration
+
+
+
+
+
+ + Default Market Price + + +
+
+ + HTTP Request Headers + + +
+
+ + Locale + + +
+
+ + Mode + + @for (modeValue of modeValues; track modeValue) { + {{ + modeValue.viewValue + }} + } + + +
+
+ + + Selector* + + + +
+
+ + + Url* + + + +
+
+ +
+
+
+
+
+ } diff --git a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts index 32e1e3309..fbf8afa03 100644 --- a/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts +++ b/apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts @@ -1,10 +1,9 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { DEFAULT_CURRENCY, ghostfolioPrefix, PROPERTY_CURRENCIES } from '@ghostfolio/common/config'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { @@ -102,6 +101,7 @@ export class GfCreateAssetProfileDialogComponent implements OnDestroy, OnInit { public onSubmit() { if (this.mode === 'auto') { this.dialogRef.close({ + addAssetProfile: true, dataSource: this.createAssetProfileForm.get('searchSymbol').value.dataSource, symbol: this.createAssetProfileForm.get('searchSymbol').value.symbol @@ -128,10 +128,15 @@ export class GfCreateAssetProfileDialogComponent implements OnDestroy, OnInit { takeUntil(this.unsubscribeSubject) ) .subscribe(() => { - this.dialogRef.close(); + this.dialogRef.close({ + addAssetProfile: false, + dataSource: this.dataSourceForExchangeRates, + symbol: `${DEFAULT_CURRENCY}${currency}` + }); }); } else if (this.mode === 'manual') { this.dialogRef.close({ + addAssetProfile: true, dataSource: 'MANUAL', symbol: `${this.ghostfolioPrefix}${this.createAssetProfileForm.get('addSymbol').value}` }); diff --git a/apps/client/src/app/components/admin-overview/admin-overview.component.ts b/apps/client/src/app/components/admin-overview/admin-overview.component.ts index e4be7b062..c0ccb0f64 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.component.ts +++ b/apps/client/src/app/components/admin-overview/admin-overview.component.ts @@ -1,6 +1,4 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { CacheService } from '@ghostfolio/client/services/cache.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { PROPERTY_COUPONS, @@ -20,6 +18,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; @@ -74,6 +73,7 @@ import { takeUntil } from 'rxjs/operators'; templateUrl: './admin-overview.html' }) export class GfAdminOverviewComponent implements OnDestroy, OnInit { + public activitiesCount: number; public couponDuration: StringValue = '14 days'; public coupons: Coupon[]; public hasPermissionForSubscription: boolean; @@ -84,7 +84,6 @@ export class GfAdminOverviewComponent implements OnDestroy, OnInit { public isDataGatheringEnabled: boolean; public permissions = permissions; public systemMessage: SystemMessage; - public transactionCount: number; public userCount: number; public user: User; public version: string; @@ -290,12 +289,12 @@ export class GfAdminOverviewComponent implements OnDestroy, OnInit { this.adminService .fetchAdminData() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(({ settings, transactionCount, userCount, version }) => { + .subscribe(({ activitiesCount, settings, userCount, version }) => { + this.activitiesCount = activitiesCount; this.coupons = (settings[PROPERTY_COUPONS] as Coupon[]) ?? []; this.isDataGatheringEnabled = settings[PROPERTY_IS_DATA_GATHERING_ENABLED] === false ? false : true; this.systemMessage = settings[PROPERTY_SYSTEM_MESSAGE] as SystemMessage; - this.transactionCount = transactionCount; this.userCount = userCount; this.version = version; diff --git a/apps/client/src/app/components/admin-overview/admin-overview.html b/apps/client/src/app/components/admin-overview/admin-overview.html index c47387f37..f0a6ea1d5 100644 --- a/apps/client/src/app/components/admin-overview/admin-overview.html +++ b/apps/client/src/app/components/admin-overview/admin-overview.html @@ -20,11 +20,11 @@
- @if (transactionCount && userCount) { + @if (activitiesCount && userCount) {
- {{ transactionCount / userCount | number: '1.2-2' }} + {{ activitiesCount / userCount | number: '1.2-2' }} per User
} diff --git a/apps/client/src/app/components/admin-platform/admin-platform.component.ts b/apps/client/src/app/components/admin-platform/admin-platform.component.ts index 832a70503..02a2eed64 100644 --- a/apps/client/src/app/components/admin-platform/admin-platform.component.ts +++ b/apps/client/src/app/components/admin-platform/admin-platform.component.ts @@ -1,10 +1,9 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/admin-settings/admin-settings.component.ts b/apps/client/src/app/components/admin-settings/admin-settings.component.ts index cabf4e589..446221058 100644 --- a/apps/client/src/app/components/admin-settings/admin-settings.component.ts +++ b/apps/client/src/app/components/admin-settings/admin-settings.component.ts @@ -1,8 +1,6 @@ import { GfAdminPlatformComponent } from '@ghostfolio/client/components/admin-platform/admin-platform.component'; import { GfAdminTagComponent } from '@ghostfolio/client/components/admin-tag/admin-tag.component'; import { GfDataProviderStatusComponent } from '@ghostfolio/client/components/data-provider-status/data-provider-status.component'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; @@ -16,6 +14,7 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; diff --git a/apps/client/src/app/components/admin-tag/admin-tag.component.ts b/apps/client/src/app/components/admin-tag/admin-tag.component.ts index 305eb4628..ca7950291 100644 --- a/apps/client/src/app/components/admin-tag/admin-tag.component.ts +++ b/apps/client/src/app/components/admin-tag/admin-tag.component.ts @@ -1,8 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/admin-users/admin-users.component.ts b/apps/client/src/app/components/admin-users/admin-users.component.ts index 1722b498f..d479f2037 100644 --- a/apps/client/src/app/components/admin-users/admin-users.component.ts +++ b/apps/client/src/app/components/admin-users/admin-users.component.ts @@ -1,7 +1,5 @@ import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces'; import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component'; -import { AdminService } from '@ghostfolio/client/services/admin.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -21,6 +19,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { AdminService, DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { CommonModule } from '@angular/common'; @@ -58,7 +57,7 @@ import { import { DeviceDetectorService } from 'ngx-device-detector'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; +import { switchMap, takeUntil, tap } from 'rxjs/operators'; @Component({ imports: [ @@ -140,8 +139,25 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { ]; } - this.route.paramMap - .pipe(takeUntil(this.unsubscribeSubject)) + this.userService.stateChanged + .pipe( + takeUntil(this.unsubscribeSubject), + tap((state) => { + if (state?.user) { + this.user = state.user; + + this.defaultDateFormat = getDateFormatString( + this.user.settings.locale + ); + + this.hasPermissionToImpersonateAllUsers = hasPermission( + this.user.permissions, + permissions.impersonateAllUsers + ); + } + }), + switchMap(() => this.route.paramMap) + ) .subscribe((params) => { const userId = params.get('userId'); @@ -150,23 +166,6 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { } }); - this.userService.stateChanged - .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe((state) => { - if (state?.user) { - this.user = state.user; - - this.defaultDateFormat = getDateFormatString( - this.user.settings.locale - ); - - this.hasPermissionToImpersonateAllUsers = hasPermission( - this.user.permissions, - permissions.impersonateAllUsers - ); - } - }); - addIcons({ contractOutline, ellipsisHorizontal, @@ -209,10 +208,13 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { .deleteUser(aId) .pipe(takeUntil(this.unsubscribeSubject)) .subscribe(() => { - this.fetchUsers(); + this.router.navigate(['..'], { relativeTo: this.route }); }); }, confirmType: ConfirmationDialogType.Warn, + discardFn: () => { + this.router.navigate(['..'], { relativeTo: this.route }); + }, title: $localize`Do you really want to delete this user?` }); } @@ -294,6 +296,7 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { >(GfUserDetailDialogComponent, { autoFocus: false, data: { + currentUserId: this.user?.id, deviceType: this.deviceType, hasPermissionForSubscription: this.hasPermissionForSubscription, locale: this.user?.settings?.locale, @@ -306,10 +309,14 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit { dialogRef .afterClosed() .pipe(takeUntil(this.unsubscribeSubject)) - .subscribe(() => { - this.router.navigate( - internalRoutes.adminControl.subRoutes.users.routerLink - ); + .subscribe((data) => { + if (data?.action === 'delete' && data?.userId) { + this.onDeleteUser(data.userId); + } else { + this.router.navigate( + internalRoutes.adminControl.subRoutes.users.routerLink + ); + } }); } } diff --git a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts index 7f03ea57f..2ecefc311 100644 --- a/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts +++ b/apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1,6 +1,5 @@ import { getTooltipOptions, - getTooltipPositionerMapTop, getVerticalHoverLinePlugin } from '@ghostfolio/common/chart-helper'; import { primaryColorRgb, secondaryColorRgb } from '@ghostfolio/common/config'; @@ -15,12 +14,14 @@ import { LineChartItem, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { ColorScheme } from '@ghostfolio/common/types'; +import { registerChartConfiguration } from '@ghostfolio/ui/chart'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, + type ElementRef, EventEmitter, Input, OnChanges, @@ -42,7 +43,7 @@ import { PointElement, TimeScale, Tooltip, - TooltipPosition + type TooltipOptions } from 'chart.js'; import 'chartjs-adapter-date-fns'; import annotationPlugin from 'chartjs-plugin-annotation'; @@ -78,7 +79,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { @Output() benchmarkChanged = new EventEmitter(); - @ViewChild('chartCanvas') chartCanvas; + @ViewChild('chartCanvas') chartCanvas: ElementRef; public chart: Chart<'line'>; public hasPermissionToAccessAdminControl: boolean; @@ -96,8 +97,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { Tooltip ); - Tooltip.positioners['top'] = (_elements, position: TooltipPosition) => - getTooltipPositionerMapTop(this.chart, position); + registerChartConfiguration(); addIcons({ arrowForwardOutline }); } @@ -157,8 +157,10 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { if (this.chartCanvas) { if (this.chart) { this.chart.data = data; + this.chart.options.plugins ??= {}; this.chart.options.plugins.tooltip = - this.getTooltipPluginConfiguration() as unknown; + this.getTooltipPluginConfiguration(); + this.chart.update(); } else { this.chart = new Chart(this.chartCanvas.nativeElement, { @@ -196,7 +198,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { verticalHoverLine: { color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` } - } as unknown, + }, responsive: true, scales: { x: { @@ -253,7 +255,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { } } - private getTooltipPluginConfiguration() { + private getTooltipPluginConfiguration(): Partial> { return { ...getTooltipOptions({ colorScheme: this.colorScheme, @@ -261,7 +263,7 @@ export class GfBenchmarkComparatorComponent implements OnChanges, OnDestroy { unit: '%' }), mode: 'index', - position: 'top' as unknown, + position: 'top', xAlign: 'center', yAlign: 'bottom' }; diff --git a/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts b/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts index 0f638961c..e44e81be9 100644 --- a/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts +++ b/apps/client/src/app/components/data-provider-status/data-provider-status.component.ts @@ -1,4 +1,4 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; +import { DataService } from '@ghostfolio/ui/services'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts b/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts index 51a984660..32e2cc29a 100644 --- a/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts +++ b/apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.ts @@ -1,7 +1,6 @@ import { resolveFearAndGreedIndex } from '@ghostfolio/common/helper'; import { translate } from '@ghostfolio/ui/i18n'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -12,7 +11,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, NgxSkeletonLoaderModule], + imports: [NgxSkeletonLoaderModule], selector: 'gf-fear-and-greed-index', styleUrls: ['./fear-and-greed-index.component.scss'], templateUrl: './fear-and-greed-index.component.html' diff --git a/apps/client/src/app/components/footer/footer.component.html b/apps/client/src/app/components/footer/footer.component.html index 155f27f68..45626620e 100644 --- a/apps/client/src/app/components/footer/footer.component.html +++ b/apps/client/src/app/components/footer/footer.component.html @@ -122,7 +122,9 @@ -->
  • - Chinese + Chinese (简体中文)
  • Deutsch @@ -139,6 +141,13 @@
  • Italiano
  • +
  • Nederlands
  • @@ -153,7 +162,9 @@ diff --git a/apps/client/src/app/components/footer/footer.component.ts b/apps/client/src/app/components/footer/footer.component.ts index a5820832e..48f010565 100644 --- a/apps/client/src/app/components/footer/footer.component.ts +++ b/apps/client/src/app/components/footer/footer.component.ts @@ -3,7 +3,6 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfLogoComponent } from '@ghostfolio/ui/logo'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -18,7 +17,7 @@ import { openOutline } from 'ionicons/icons'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, - imports: [CommonModule, GfLogoComponent, IonIcon, RouterModule], + imports: [GfLogoComponent, IonIcon, RouterModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-footer', styleUrls: ['./footer.component.scss'], diff --git a/apps/client/src/app/components/header/header.component.ts b/apps/client/src/app/components/header/header.component.ts index b7bf4cb98..9b003a590 100644 --- a/apps/client/src/app/components/header/header.component.ts +++ b/apps/client/src/app/components/header/header.component.ts @@ -1,7 +1,6 @@ import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces'; import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component'; import { LayoutService } from '@ghostfolio/client/core/layout.service'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { KEY_STAY_SIGNED_IN, @@ -18,6 +17,7 @@ import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.compone import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { DataService } from '@ghostfolio/ui/services'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 6a7129fec..427386796 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -1,4 +1,3 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { NUMERICAL_PRECISION_THRESHOLD_3_FIGURES, @@ -26,6 +25,7 @@ import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical import { translate } from '@ghostfolio/ui/i18n'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; +import { DataService } from '@ghostfolio/ui/services'; import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -116,11 +116,11 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { }; public dataProviderInfo: DataProviderInfo; public dataSource: MatTableDataSource; + public dateOfFirstActivity: string; public dividendInBaseCurrency: number; public dividendInBaseCurrencyPrecision = 2; public dividendYieldPercentWithCurrencyEffect: number; public feeInBaseCurrency: number; - public firstBuyDate: string; public hasPermissionToCreateOwnTag: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public historicalDataItems: LineChartItem[]; @@ -267,10 +267,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { activitiesCount, averagePrice, dataProviderInfo, + dateOfFirstActivity, dividendInBaseCurrency, dividendYieldPercentWithCurrencyEffect, feeInBaseCurrency, - firstBuyDate, historicalData, investmentInBaseCurrencyWithCurrencyEffect, marketPrice, @@ -298,6 +298,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { this.benchmarkDataItems = []; this.countries = {}; this.dataProviderInfo = dataProviderInfo; + this.dateOfFirstActivity = dateOfFirstActivity; this.dividendInBaseCurrency = dividendInBaseCurrency; if ( @@ -312,7 +313,6 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { dividendYieldPercentWithCurrencyEffect; this.feeInBaseCurrency = feeInBaseCurrency; - this.firstBuyDate = firstBuyDate; this.hasPermissionToReadMarketDataOfOwnAssetProfile = hasPermission( @@ -461,16 +461,16 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } } - if (isToday(parseISO(this.firstBuyDate))) { + if (isToday(parseISO(this.dateOfFirstActivity))) { // Add average price this.historicalDataItems.push({ - date: this.firstBuyDate, + date: this.dateOfFirstActivity, value: this.averagePrice }); // Add benchmark 1 this.benchmarkDataItems.push({ - date: this.firstBuyDate, + date: this.dateOfFirstActivity, value: averagePrice }); @@ -501,7 +501,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { if ( this.benchmarkDataItems[0]?.value === undefined && - isSameMonth(parseISO(this.firstBuyDate), new Date()) + isSameMonth(parseISO(this.dateOfFirstActivity), new Date()) ) { this.benchmarkDataItems[0].value = this.averagePrice; } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index f52286160..86f4676f3 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -215,7 +215,7 @@ [deviceType]="data.deviceType" [isDate]="true" [locale]="data.locale" - [value]="firstBuyDate" + [value]="dateOfFirstActivity" >First Activity
    @@ -377,13 +377,12 @@ @@ -400,7 +399,7 @@ ; public chart: Chart<'bar' | 'line'>; private investments: InvestmentItem[]; @@ -81,8 +85,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { Tooltip ); - Tooltip.positioners['top'] = (_elements, position: TooltipPosition) => - getTooltipPositionerMapTop(this.chart, position); + registerChartConfiguration(); } public ngOnChanges() { @@ -121,12 +124,12 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { }), label: this.benchmarkDataLabel, segment: { - borderColor: (context: unknown) => + borderColor: (context) => this.isInFuture( context, `rgba(${secondaryColorRgb.r}, ${secondaryColorRgb.g}, ${secondaryColorRgb.b}, 0.67)` ), - borderDash: (context: unknown) => this.isInFuture(context, [2, 2]) + borderDash: (context) => this.isInFuture(context, [2, 2]) }, stepped: true }, @@ -143,12 +146,12 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { label: $localize`Total Amount`, pointRadius: 0, segment: { - borderColor: (context: unknown) => + borderColor: (context) => this.isInFuture( context, `rgba(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b}, 0.67)` ), - borderDash: (context: unknown) => this.isInFuture(context, [2, 2]) + borderDash: (context) => this.isInFuture(context, [2, 2]) } } ] @@ -157,17 +160,14 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { if (this.chartCanvas) { if (this.chart) { this.chart.data = chartData; + this.chart.options.plugins ??= {}; this.chart.options.plugins.tooltip = - this.getTooltipPluginConfiguration() as unknown; + this.getTooltipPluginConfiguration(); - if ( - this.savingsRate && - // @ts-ignore - this.chart.options.plugins.annotation.annotations.savingsRate - ) { - // @ts-ignore - this.chart.options.plugins.annotation.annotations.savingsRate.value = - this.savingsRate; + const annotations = this.chart.options.plugins.annotation + .annotations as Record>; + if (this.savingsRate && annotations.savingsRate) { + annotations.savingsRate.value = this.savingsRate; } this.chart.update(); @@ -201,7 +201,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { color: 'white', content: $localize`Savings Rate`, display: true, - font: { size: '10px', weight: 'normal' }, + font: { size: 10, weight: 'normal' }, padding: { x: 4, y: 2 @@ -229,7 +229,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { verticalHoverLine: { color: `rgba(${getTextColor(this.colorScheme)}, 0.1)` } - } as unknown, + }, responsive: true, scales: { x: { @@ -286,7 +286,9 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { } } - private getTooltipPluginConfiguration() { + private getTooltipPluginConfiguration(): Partial< + TooltipOptions<'bar' | 'line'> + > { return { ...getTooltipOptions({ colorScheme: this.colorScheme, @@ -296,13 +298,13 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy { unit: this.isInPercent ? '%' : undefined }), mode: 'index', - position: 'top' as unknown, + position: 'top', xAlign: 'center', yAlign: 'bottom' }; } - private isInFuture(aContext: any, aValue: T) { + private isInFuture(aContext: ScriptableLineSegmentContext, aValue: T) { return isAfter(new Date(aContext?.p1?.parsed?.x), new Date()) ? aValue : undefined; diff --git a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts index 0e297bc29..d79c7a675 100644 --- a/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts +++ b/apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.component.ts @@ -4,7 +4,6 @@ import { } from '@ghostfolio/client/services/settings-storage.service'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms'; import { MatButtonModule } from '@angular/material/button'; @@ -28,7 +27,6 @@ import { LoginWithAccessTokenDialogParams } from './interfaces/interfaces'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - CommonModule, GfDialogHeaderComponent, IonIcon, MatButtonModule, diff --git a/apps/client/src/app/components/markets/markets.component.ts b/apps/client/src/app/components/markets/markets.component.ts index a7f83216f..4b83e897f 100644 --- a/apps/client/src/app/components/markets/markets.component.ts +++ b/apps/client/src/app/components/markets/markets.component.ts @@ -1,5 +1,4 @@ import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { resetHours } from '@ghostfolio/common/helper'; import { @@ -12,6 +11,7 @@ import { import { FearAndGreedIndexMode } from '@ghostfolio/common/types'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; +import { DataService } from '@ghostfolio/ui/services'; import { GfToggleComponent } from '@ghostfolio/ui/toggle'; import { diff --git a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts index 7a17ec32d..0d616b92e 100644 --- a/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts +++ b/apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.component.ts @@ -2,7 +2,6 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -31,7 +30,6 @@ import { SubscriptionInterstitialDialogParams } from './interfaces/interfaces'; changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'd-flex flex-column flex-grow-1 h-100' }, imports: [ - CommonModule, GfMembershipCardComponent, GfPremiumIndicatorComponent, IonIcon, diff --git a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts index 05c047dc6..5c87b2f63 100644 --- a/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts +++ b/apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts @@ -1,7 +1,7 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos'; import { validateObjectForForm } from '@ghostfolio/common/utils'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/user-account-access/user-account-access.component.ts b/apps/client/src/app/components/user-account-access/user-account-access.component.ts index 11960b8aa..ef78cccff 100644 --- a/apps/client/src/app/components/user-account-access/user-account-access.component.ts +++ b/apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -1,5 +1,4 @@ import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { CreateAccessDto } from '@ghostfolio/common/dtos'; @@ -8,6 +7,7 @@ import { Access, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectionStrategy, diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index 069ea4b0e..92fd0d590 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -1,4 +1,3 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { getDateFormatString } from '@ghostfolio/common/helper'; @@ -8,6 +7,7 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card'; import { NotificationService } from '@ghostfolio/ui/notifications'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { DataService } from '@ghostfolio/ui/services'; import { CommonModule } from '@angular/common'; import { @@ -21,9 +21,8 @@ import { MatCardModule } from '@angular/material/card'; import { MatSnackBar } from '@angular/material/snack-bar'; import { RouterModule } from '@angular/router'; import ms, { StringValue } from 'ms'; -import { StripeService } from 'ngx-stripe'; import { EMPTY, Subject } from 'rxjs'; -import { catchError, switchMap, takeUntil } from 'rxjs/operators'; +import { catchError, takeUntil } from 'rxjs/operators'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -62,7 +61,6 @@ export class GfUserAccountMembershipComponent implements OnDestroy { private dataService: DataService, private notificationService: NotificationService, private snackBar: MatSnackBar, - private stripeService: StripeService, private userService: UserService ) { const { baseCurrency, globalPermissions } = this.dataService.fetchInfo(); @@ -113,23 +111,17 @@ export class GfUserAccountMembershipComponent implements OnDestroy { priceId: this.priceId }) .pipe( - catchError((error) => { + catchError((error: Error) => { this.notificationService.alert({ title: error.message }); - throw error; + return EMPTY; }), - switchMap(({ sessionId }) => { - return this.stripeService.redirectToCheckout({ sessionId }); - }) + takeUntil(this.unsubscribeSubject) ) - .subscribe((result) => { - if (result.error) { - this.notificationService.alert({ - title: result.error.message - }); - } + .subscribe(({ sessionUrl }) => { + window.location.href = sessionUrl; }); } diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts index e0028bb5c..44be30b9a 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.component.ts @@ -1,4 +1,3 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { KEY_STAY_SIGNED_IN, KEY_TOKEN, @@ -13,6 +12,7 @@ import { User } from '@ghostfolio/common/interfaces'; 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 { ChangeDetectionStrategy, @@ -89,6 +89,7 @@ export class GfUserAccountSettingsComponent implements OnDestroy, OnInit { 'es', 'fr', 'it', + 'ko', 'nl', 'pl', 'pt', diff --git a/apps/client/src/app/components/user-account-settings/user-account-settings.html b/apps/client/src/app/components/user-account-settings/user-account-settings.html index e6ab544c8..93ed614cc 100644 --- a/apps/client/src/app/components/user-account-settings/user-account-settings.html +++ b/apps/client/src/app/components/user-account-settings/user-account-settings.html @@ -87,7 +87,8 @@ > } Chinese (CommunityChinese / 简体中文 (Community) Italiano (Community) + @if (user?.settings?.isExperimentalFeatures) { + Korean / 한국어 (Community) + } Nederlands (Community) @if (user?.settings?.isExperimentalFeatures) { Українська (CommunityUkrainian / Українська (Community) } diff --git a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts index b922e7a54..ed46e8a02 100644 --- a/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts +++ b/apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts @@ -1,4 +1,5 @@ export interface UserDetailDialogParams { + currentUserId: string; deviceType: string; hasPermissionForSubscription: boolean; locale: string; diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts index 57ccf0f18..6f7f4ead6 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts @@ -1,10 +1,7 @@ -import { AdminService } from '@ghostfolio/client/services/admin.service'; import { AdminUserResponse } from '@ghostfolio/common/interfaces'; -import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; -import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; +import { AdminService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -17,6 +14,10 @@ import { import { MatButtonModule } from '@angular/material/button'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog'; +import { MatMenuModule } from '@angular/material/menu'; +import { IonIcon } from '@ionic/angular/standalone'; +import { addIcons } from 'ionicons'; +import { ellipsisVertical } from 'ionicons/icons'; import { EMPTY, Subject } from 'rxjs'; import { catchError, takeUntil } from 'rxjs/operators'; @@ -26,12 +27,11 @@ import { UserDetailDialogParams } from './interfaces/interfaces'; changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'd-flex flex-column h-100' }, imports: [ - CommonModule, - GfDialogFooterComponent, - GfDialogHeaderComponent, GfValueComponent, + IonIcon, MatButtonModule, - MatDialogModule + MatDialogModule, + MatMenuModule ], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-user-detail-dialog', @@ -48,7 +48,11 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit { private changeDetectorRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, public dialogRef: MatDialogRef - ) {} + ) { + addIcons({ + ellipsisVertical + }); + } public ngOnInit() { this.adminService @@ -68,6 +72,13 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit { }); } + public deleteUser() { + this.dialogRef.close({ + action: 'delete', + userId: this.data.userId + }); + } + public onClose() { this.dialogRef.close(); } diff --git a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html index 60f6a2585..570dcf4d6 100644 --- a/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html +++ b/apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1,9 +1,28 @@ - - +
    + + + + +
    @@ -103,7 +122,8 @@
    - +
    + +
    diff --git a/apps/client/src/app/core/auth.guard.ts b/apps/client/src/app/core/auth.guard.ts index c26419031..123a6169a 100644 --- a/apps/client/src/app/core/auth.guard.ts +++ b/apps/client/src/app/core/auth.guard.ts @@ -1,7 +1,7 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { Injectable } from '@angular/core'; import { diff --git a/apps/client/src/app/core/http-response.interceptor.ts b/apps/client/src/app/core/http-response.interceptor.ts index c2eef4175..ab99b440f 100644 --- a/apps/client/src/app/core/http-response.interceptor.ts +++ b/apps/client/src/app/core/http-response.interceptor.ts @@ -1,8 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { HTTP_INTERCEPTORS, diff --git a/apps/client/src/app/pages/about/about-page.component.ts b/apps/client/src/app/pages/about/about-page.component.ts index 4fe6a57e3..5ddb6b2e0 100644 --- a/apps/client/src/app/pages/about/about-page.component.ts +++ b/apps/client/src/app/pages/about/about-page.component.ts @@ -1,8 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectorRef, diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts index d315f2cbd..bea19a1b9 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.component.ts +++ b/apps/client/src/app/pages/about/overview/about-overview-page.component.ts @@ -1,8 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { CommonModule } from '@angular/common'; import { diff --git a/apps/client/src/app/pages/about/overview/about-overview-page.html b/apps/client/src/app/pages/about/overview/about-overview-page.html index 185becba7..cab1caa23 100644 --- a/apps/client/src/app/pages/about/overview/about-overview-page.html +++ b/apps/client/src/app/pages/about/overview/about-overview-page.html @@ -207,18 +207,20 @@

    Sponsors

    - Browser testing via -
    +
    Browser testing via
    LambdaTest Logo
    diff --git a/apps/client/src/app/pages/accounts/accounts-page.component.ts b/apps/client/src/app/pages/accounts/accounts-page.component.ts index 2b496e4fb..f7e6541b5 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.component.ts +++ b/apps/client/src/app/pages/accounts/accounts-page.component.ts @@ -1,6 +1,5 @@ import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { @@ -12,6 +11,7 @@ import { User } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; @@ -38,6 +38,7 @@ import { GfTransferBalanceDialogComponent } from './transfer-balance/transfer-ba }) export class GfAccountsPageComponent implements OnDestroy, OnInit { public accounts: AccountModel[]; + public activitiesCount = 0; public deviceType: string; public hasImpersonationId: boolean; public hasPermissionToCreateAccount: boolean; @@ -45,7 +46,6 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { public routeQueryParams: Subscription; public totalBalanceInBaseCurrency = 0; public totalValueInBaseCurrency = 0; - public transactionCount = 0; public user: User; private unsubscribeSubject = new Subject(); @@ -128,14 +128,14 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { .subscribe( ({ accounts, + activitiesCount, totalBalanceInBaseCurrency, - totalValueInBaseCurrency, - transactionCount + totalValueInBaseCurrency }) => { this.accounts = accounts; + this.activitiesCount = activitiesCount; this.totalBalanceInBaseCurrency = totalBalanceInBaseCurrency; this.totalValueInBaseCurrency = totalValueInBaseCurrency; - this.transactionCount = transactionCount; if (this.accounts?.length <= 0) { this.router.navigate([], { queryParams: { createDialog: true } }); @@ -358,8 +358,8 @@ export class GfAccountsPageComponent implements OnDestroy, OnInit { private reset() { this.accounts = undefined; + this.activitiesCount = 0; this.totalBalanceInBaseCurrency = 0; this.totalValueInBaseCurrency = 0; - this.transactionCount = 0; } } diff --git a/apps/client/src/app/pages/accounts/accounts-page.html b/apps/client/src/app/pages/accounts/accounts-page.html index 6f29a4f7c..3d9d7ee5c 100644 --- a/apps/client/src/app/pages/accounts/accounts-page.html +++ b/apps/client/src/app/pages/accounts/accounts-page.html @@ -4,8 +4,8 @@

    Accounts

    ; - public platforms: Platform[]; + public platforms: Platform[] = []; private unsubscribeSubject = new Subject(); @@ -71,10 +71,8 @@ export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy { ) {} public ngOnInit() { - const { currencies, platforms } = this.dataService.fetchInfo(); - + const { currencies } = this.dataService.fetchInfo(); this.currencies = currencies; - this.platforms = platforms; this.accountForm = this.formBuilder.group({ accountId: [{ disabled: true, value: this.data.account.id }], @@ -83,23 +81,33 @@ export class GfCreateOrUpdateAccountDialogComponent implements OnDestroy { currency: [this.data.account.currency, Validators.required], isExcluded: [this.data.account.isExcluded], name: [this.data.account.name, Validators.required], - platformId: [ - this.platforms.find(({ id }) => { - return id === this.data.account.platformId; - }), - this.autocompleteObjectValidator() - ] + platformId: [null, this.autocompleteObjectValidator()] }); - this.filteredPlatforms = this.accountForm - .get('platformId') - .valueChanges.pipe( - startWith(''), - map((value) => { - const name = typeof value === 'string' ? value : value?.name; - return name ? this.filter(name as string) : this.platforms.slice(); - }) + this.dataService.fetchPlatforms().subscribe(({ platforms }) => { + this.platforms = platforms; + + const selectedPlatform = this.platforms.find(({ id }) => { + return id === this.data.account.platformId; + }); + + this.accountForm.patchValue( + { + platformId: selectedPlatform + }, + { emitEvent: false } ); + + this.filteredPlatforms = this.accountForm + .get('platformId') + .valueChanges.pipe( + startWith(''), + map((value) => { + const name = typeof value === 'string' ? value : value?.name; + return name ? this.filter(name as string) : this.platforms.slice(); + }) + ); + }); } public autoCompleteCheck() { diff --git a/apps/client/src/app/pages/blog/blog-page.component.ts b/apps/client/src/app/pages/blog/blog-page.component.ts index 7599a3358..8a379a7e4 100644 --- a/apps/client/src/app/pages/blog/blog-page.component.ts +++ b/apps/client/src/app/pages/blog/blog-page.component.ts @@ -1,7 +1,6 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; +import { DataService } from '@ghostfolio/ui/services'; -import { CommonModule } from '@angular/common'; import { Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy } from '@angular/core'; import { MatCardModule } from '@angular/material/card'; import { RouterModule } from '@angular/router'; @@ -12,7 +11,7 @@ import { Subject } from 'rxjs'; @Component({ host: { class: 'page' }, - imports: [CommonModule, IonIcon, MatCardModule, RouterModule], + imports: [IonIcon, MatCardModule, RouterModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-blog-page', styleUrls: ['./blog-page.scss'], diff --git a/apps/client/src/app/pages/demo/demo-page.component.ts b/apps/client/src/app/pages/demo/demo-page.component.ts index 9eba64788..5b94fd541 100644 --- a/apps/client/src/app/pages/demo/demo-page.component.ts +++ b/apps/client/src/app/pages/demo/demo-page.component.ts @@ -1,7 +1,7 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; import { NotificationService } from '@ghostfolio/ui/notifications'; +import { DataService } from '@ghostfolio/ui/services'; import { Component, OnDestroy } from '@angular/core'; import { Router } from '@angular/router'; diff --git a/apps/client/src/app/pages/faq/faq-page.component.ts b/apps/client/src/app/pages/faq/faq-page.component.ts index cba9e19f1..caf4217ca 100644 --- a/apps/client/src/app/pages/faq/faq-page.component.ts +++ b/apps/client/src/app/pages/faq/faq-page.component.ts @@ -1,7 +1,7 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { CUSTOM_ELEMENTS_SCHEMA, diff --git a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html index f44759124..42e810eb0 100644 --- a/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html +++ b/apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html @@ -135,9 +135,17 @@ Which data providers are supported? COINGECKO, MANUAL and - YAHOO are officially supported while all other data - providers are considered experimental.COINGECKO, GHOSTFOLIO (available with + Ghostfolio Premium), MANUAL, and YAHOO are officially + supported while all other data providers are considered + experimental. @@ -147,7 +155,8 @@ > Yes, access to a professional data provider is included with a + >Yes, access to a professional data provider (GHOSTFOLIO) + is included with a Use Ghostfolio in multiple languages: English, - Chinese, Dutch, French, German, Italian, Polish, Portuguese, - Spanish and Turkish + Chinese, Dutch, French, German, Italian, + + Polish, Portuguese, Spanish and Turkish are currently supported.

    diff --git a/apps/client/src/app/pages/landing/landing-page.component.ts b/apps/client/src/app/pages/landing/landing-page.component.ts index 55f07a798..25fb2d6e7 100644 --- a/apps/client/src/app/pages/landing/landing-page.component.ts +++ b/apps/client/src/app/pages/landing/landing-page.component.ts @@ -1,10 +1,10 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { Statistics } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { GfCarouselComponent } from '@ghostfolio/ui/carousel'; import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { GfLogoCarouselComponent } from '@ghostfolio/ui/logo-carousel'; +import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart'; diff --git a/apps/client/src/app/pages/markets/markets-page.component.ts b/apps/client/src/app/pages/markets/markets-page.component.ts index 11d4ebbde..1ab97c3e0 100644 --- a/apps/client/src/app/pages/markets/markets-page.component.ts +++ b/apps/client/src/app/pages/markets/markets-page.component.ts @@ -1,12 +1,11 @@ import { GfHomeMarketComponent } from '@ghostfolio/client/components/home-market/home-market.component'; -import { CommonModule } from '@angular/common'; import { Component, OnDestroy } from '@angular/core'; import { Subject } from 'rxjs'; @Component({ host: { class: 'page' }, - imports: [CommonModule, GfHomeMarketComponent], + imports: [GfHomeMarketComponent], selector: 'gf-markets-page', styleUrls: ['./markets-page.scss'], templateUrl: './markets-page.html' diff --git a/apps/client/src/app/pages/open/open-page.component.ts b/apps/client/src/app/pages/open/open-page.component.ts index 6521951da..6284c41f4 100644 --- a/apps/client/src/app/pages/open/open-page.component.ts +++ b/apps/client/src/app/pages/open/open-page.component.ts @@ -1,9 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { Statistics, User } from '@ghostfolio/common/interfaces'; +import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; -import { CommonModule } from '@angular/common'; import { ChangeDetectorRef, Component, @@ -16,7 +15,7 @@ import { Subject, takeUntil } from 'rxjs'; @Component({ host: { class: 'page' }, - imports: [CommonModule, GfValueComponent, MatCardModule], + imports: [GfValueComponent, MatCardModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], selector: 'gf-open-page', styleUrls: ['./open-page.scss'], diff --git a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts index 5b5273b65..cf7a41215 100644 --- a/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/activities-page.component.ts @@ -1,4 +1,3 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { IcsService } from '@ghostfolio/client/services/ics/ics.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; @@ -12,6 +11,7 @@ import { } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; +import { DataService } from '@ghostfolio/ui/services'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; diff --git a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts index 01b389789..8695f04ed 100644 --- a/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts @@ -10,6 +10,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { validateObjectForForm } from '@ghostfolio/common/utils'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { translate } from '@ghostfolio/ui/i18n'; +import { DataService } from '@ghostfolio/ui/services'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -48,7 +49,6 @@ import { calendarClearOutline, refreshOutline } from 'ionicons/icons'; import { EMPTY, Subject } from 'rxjs'; import { catchError, delay, takeUntil } from 'rxjs/operators'; -import { DataService } from '../../../../services/data.service'; import { CreateOrUpdateActivityDialogParams } from './interfaces/interfaces'; import { ActivityType } from './types/activity-type.type'; @@ -96,7 +96,6 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy { public isLoading = false; public isToday = isToday; public mode: 'create' | 'update'; - public platforms: { id: string; name: string }[]; public tagsAvailable: Tag[] = []; public total = 0; public typesTranslationMap = new Map(); @@ -127,11 +126,10 @@ export class GfCreateOrUpdateActivityDialogComponent implements OnDestroy { this.dateAdapter.setLocale(this.locale); - const { currencies, platforms } = this.dataService.fetchInfo(); + const { currencies } = this.dataService.fetchInfo(); this.currencies = currencies; this.defaultDateFormat = getDateFormatString(this.locale); - this.platforms = platforms; this.dataService .fetchPortfolioHoldings() diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 582ab8e25..1a84e9f31 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -1,5 +1,4 @@ import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; import { CreateAccountWithBalancesDto, @@ -11,6 +10,7 @@ import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; +import { DataService } from '@ghostfolio/ui/services'; import { StepperOrientation, diff --git a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts index b4de51701..70fa09eb1 100644 --- a/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts +++ b/apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts @@ -1,6 +1,5 @@ import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; @@ -17,6 +16,7 @@ import { Market, 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'; +import { DataService } from '@ghostfolio/ui/services'; import { GfTopHoldingsComponent } from '@ghostfolio/ui/top-holdings'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart'; diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index 63ed3569c..5cd24777c 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -1,8 +1,8 @@ import { GfBenchmarkComparatorComponent } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; -import { DataService } from '@ghostfolio/client/services/data.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { HistoricalDataItem, InvestmentItem, @@ -16,6 +16,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import type { AiPromptMode, GroupBy } from '@ghostfolio/common/types'; import { translate } from '@ghostfolio/ui/i18n'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; +import { DataService } from '@ghostfolio/ui/services'; import { GfToggleComponent } from '@ghostfolio/ui/toggle'; import { GfValueComponent } from '@ghostfolio/ui/value'; @@ -94,6 +95,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit { public performanceDataItems: HistoricalDataItem[]; public performanceDataItemsInPercentage: HistoricalDataItem[]; public portfolioEvolutionDataLabel = $localize`Investment`; + public precision = 2; public streaks: PortfolioInvestmentsResponse['streaks']; public top3: PortfolioPosition[]; public unitCurrentStreak: string; @@ -317,12 +319,21 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit { : valueInPercentage }); } + this.performanceDataItemsInPercentage.push({ date, value: netPerformanceInPercentageWithCurrencyEffect }); } + if ( + this.deviceType === 'mobile' && + this.performance.currentValueInBaseCurrency >= + NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + ) { + this.precision = 0; + } + this.isLoadingInvestmentChart = false; this.updateBenchmarkDataItems(); diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index 150caa7d8..517ad7101 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -74,6 +74,72 @@
    } + + @if (user?.settings?.isExperimentalFeatures) { +
    +
    + + + Total amount + + +
    +
    + + + Change with currency effect + + +
    +
    + + + Performance with currency effect + + +
    +
    + } +
    { - return this.stripeService.redirectToCheckout({ sessionId }); - }), - catchError((error) => { + catchError((error: Error) => { this.notificationService.alert({ title: error.message }); - throw error; - }) + return EMPTY; + }), + takeUntil(this.unsubscribeSubject) ) - .subscribe((result) => { - if (result.error) { - this.notificationService.alert({ - title: result.error.message - }); - } + .subscribe(({ sessionUrl }) => { + window.location.href = sessionUrl; }); } diff --git a/apps/client/src/app/pages/pricing/pricing-page.html b/apps/client/src/app/pages/pricing/pricing-page.html index 3cc0e460a..d755cd303 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.html +++ b/apps/client/src/app/pages/pricing/pricing-page.html @@ -195,12 +195,9 @@

    • - Everything in -   - Basic, - plus: + Everything in Basic, plus:
    • diff --git a/apps/client/src/app/pages/public/public-page.component.ts b/apps/client/src/app/pages/public/public-page.component.ts index 55e2a122a..fe4b295db 100644 --- a/apps/client/src/app/pages/public/public-page.component.ts +++ b/apps/client/src/app/pages/public/public-page.component.ts @@ -1,4 +1,3 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { prettifySymbol } from '@ghostfolio/common/helper'; import { @@ -11,6 +10,7 @@ import { Market } from '@ghostfolio/common/types'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table/activities-table.component'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table/holdings-table.component'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.component'; +import { DataService } from '@ghostfolio/ui/services'; import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart'; diff --git a/apps/client/src/app/pages/register/register-page.component.ts b/apps/client/src/app/pages/register/register-page.component.ts index d37a91f8e..21b26944e 100644 --- a/apps/client/src/app/pages/register/register-page.component.ts +++ b/apps/client/src/app/pages/register/register-page.component.ts @@ -1,8 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { GfLogoComponent } from '@ghostfolio/ui/logo'; +import { DataService } from '@ghostfolio/ui/services'; import { Component, diff --git a/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts b/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts index dfa8145dc..a7707ad3b 100644 --- a/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts +++ b/apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts @@ -1,9 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { ClipboardModule } from '@angular/cdk/clipboard'; import { TextFieldModule } from '@angular/cdk/text-field'; -import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, @@ -36,7 +35,6 @@ import { UserAccountRegistrationDialogParams } from './interfaces/interfaces'; changeDetection: ChangeDetectionStrategy.OnPush, imports: [ ClipboardModule, - CommonModule, FormsModule, IonIcon, MatButtonModule, diff --git a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts index 96958dd70..112619239 100644 --- a/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts +++ b/apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts @@ -1,7 +1,7 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { InfoItem } from '@ghostfolio/common/interfaces'; import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { publicRoutes } from '@ghostfolio/common/routes/routes'; +import { DataService } from '@ghostfolio/ui/services'; import { Component, OnInit } from '@angular/core'; import { RouterModule } from '@angular/router'; diff --git a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts index 511cf672d..14f9554d5 100644 --- a/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts +++ b/apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -1,8 +1,8 @@ -import { DataService } from '@ghostfolio/client/services/data.service'; import { Product } from '@ghostfolio/common/interfaces'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; 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 { MatButtonModule } from '@angular/material/button'; @@ -43,15 +43,16 @@ export class GfProductPageComponent implements OnInit { isOpenSource: true, key: 'ghostfolio', languages: [ + 'Chinese (简体中文)', 'Deutsch', 'English', 'Español', 'Français', 'Italiano', + 'Korean (한국어)', 'Nederlands', 'Português', - 'Türkçe', - '简体中文' + 'Türkçe' ], name: 'Ghostfolio', origin: $localize`Switzerland`, diff --git a/apps/client/src/app/pages/zen/zen-page.component.ts b/apps/client/src/app/pages/zen/zen-page.component.ts index 5ed9fe09c..280f33c25 100644 --- a/apps/client/src/app/pages/zen/zen-page.component.ts +++ b/apps/client/src/app/pages/zen/zen-page.component.ts @@ -2,7 +2,6 @@ import { UserService } from '@ghostfolio/client/services/user/user.service'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { internalRoutes } from '@ghostfolio/common/routes/routes'; -import { CommonModule } from '@angular/common'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { MatTabsModule } from '@angular/material/tabs'; import { RouterModule } from '@angular/router'; @@ -15,7 +14,7 @@ import { takeUntil } from 'rxjs/operators'; @Component({ host: { class: 'page has-tabs' }, - imports: [CommonModule, IonIcon, MatTabsModule, RouterModule], + imports: [IonIcon, MatTabsModule, RouterModule], selector: 'gf-zen-page', styleUrls: ['./zen-page.scss'], templateUrl: './zen-page.html' diff --git a/apps/client/src/assets/images/sponsors/logo-lambdatest.png b/apps/client/src/assets/images/sponsors/logo-lambdatest.png deleted file mode 100644 index 9e05b1cde..000000000 Binary files a/apps/client/src/assets/images/sponsors/logo-lambdatest.png and /dev/null differ diff --git a/apps/client/src/assets/images/sponsors/logo-testmu-dark.svg b/apps/client/src/assets/images/sponsors/logo-testmu-dark.svg new file mode 100644 index 000000000..90fbbdd6d --- /dev/null +++ b/apps/client/src/assets/images/sponsors/logo-testmu-dark.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/client/src/assets/images/sponsors/logo-testmu-light.svg b/apps/client/src/assets/images/sponsors/logo-testmu-light.svg new file mode 100644 index 000000000..e925efd5e --- /dev/null +++ b/apps/client/src/assets/images/sponsors/logo-testmu-light.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/client/src/environments/environment.prod.ts b/apps/client/src/environments/environment.prod.ts index 6f1d6b92d..f3ded619e 100644 --- a/apps/client/src/environments/environment.prod.ts +++ b/apps/client/src/environments/environment.prod.ts @@ -1,5 +1,6 @@ -export const environment = { +import type { GfEnvironment } from '@ghostfolio/ui/environment'; + +export const environment: GfEnvironment = { lastPublish: '{BUILD_TIMESTAMP}', - production: true, - stripePublicKey: '' + production: true }; diff --git a/apps/client/src/environments/environment.ts b/apps/client/src/environments/environment.ts index 0a4d51d98..1b9efe2be 100644 --- a/apps/client/src/environments/environment.ts +++ b/apps/client/src/environments/environment.ts @@ -1,11 +1,12 @@ +import type { GfEnvironment } from '@ghostfolio/ui/environment'; + // This file can be replaced during build by using the `fileReplacements` array. // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. // The list of file replacements can be found in `angular.json`. -export const environment = { +export const environment: GfEnvironment = { lastPublish: null, - production: false, - stripePublicKey: '' + production: false }; /* diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index 1340b5da7..a6bec7df3 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -102,7 +102,7 @@ El risc d’assumir pèrdues en les inversions és substancial. No és recomanable invertir diners que pugui necessitar a curt termini. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -295,7 +295,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -358,20 +358,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Realment vol revocar aquest accés? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -387,7 +379,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -403,7 +395,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -435,7 +427,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -467,7 +459,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -479,7 +471,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -495,7 +487,7 @@ Total libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -503,11 +495,11 @@ Divisa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -523,7 +515,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -555,11 +547,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -571,7 +563,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -603,7 +595,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -619,7 +611,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -639,7 +631,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -695,7 +687,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -711,7 +703,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -863,7 +855,7 @@ Punts de referència apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -871,27 +863,19 @@ Divises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html 96 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETFs sense País apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -899,7 +883,7 @@ ETFs sense Sector apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -907,7 +891,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -919,7 +903,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -927,7 +911,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -1015,7 +999,7 @@ Oooh! No s’han pogut recopilar les dades históriques. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -1023,7 +1007,7 @@ El preu de mercat actual és apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -1055,7 +1039,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1067,7 +1051,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -1087,11 +1071,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1107,11 +1091,11 @@ Països apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1123,7 +1107,7 @@ Mapatge de Símbols apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -1139,7 +1123,7 @@ Configuració del Proveïdor de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -1147,7 +1131,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -1155,11 +1139,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1170,12 +1154,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Note Notes apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1215,7 +1207,7 @@ Nom, símbol o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1235,7 +1227,7 @@ Està segur qeu vol eliminar aquest cupó? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -1243,7 +1235,7 @@ Està segur que vol eliminar aquest missatge del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -1251,7 +1243,7 @@ Està segur que vol depurar el cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -1259,7 +1251,7 @@ Si us plau, afegeixi el seu missatge del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -1323,7 +1315,7 @@ Recollida de Dades apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1395,7 +1387,7 @@ Està segur que vol eliminar aquesta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -1419,7 +1411,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -1491,7 +1483,7 @@ Està segur que vol eliminar aquest usuari? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -1554,6 +1546,18 @@ 254 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Comparar amb... @@ -1587,7 +1591,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -1599,7 +1603,7 @@ Punt de Referència apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1639,7 +1643,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -1655,7 +1659,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -1683,7 +1687,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1719,7 +1723,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1935,7 +1939,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1983,7 +1987,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2027,7 +2031,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -2103,7 +2107,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -2115,7 +2119,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -2183,7 +2187,7 @@ Definiu l’import del vostre fons d’emergència. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -2215,7 +2219,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -2235,7 +2239,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -2251,7 +2255,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -2267,7 +2271,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -2279,7 +2283,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -2295,7 +2299,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -2335,7 +2339,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -2343,11 +2347,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -2355,11 +2359,11 @@ 1 any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -2367,11 +2371,19 @@ 5 anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -2379,11 +2391,11 @@ Màx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -2435,7 +2447,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2455,7 +2467,7 @@ Introduïu el vostre codi de cupó. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -2463,7 +2475,7 @@ No s’ha pogut bescanviar el codi de cupó apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -2471,7 +2483,7 @@ El codi del cupó s’ha bescanviat apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -2479,7 +2491,7 @@ Torna a carregar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -2499,7 +2511,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -2523,11 +2535,11 @@ Automàtic apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2535,7 +2547,7 @@ De debò vols tancar el teu compte de Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -2543,7 +2555,7 @@ De debò vols eliminar aquest mètode d’inici de sessió? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -2551,7 +2563,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -2559,7 +2571,7 @@ Ups! Hi ha hagut un error en configurar l’autenticació biomètrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -2567,7 +2579,7 @@ Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -2575,7 +2587,7 @@ Protecció per a informació sensible com ara rendiments absoluts i valors de quantitat apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -2607,11 +2619,11 @@ Localització apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -2619,7 +2631,7 @@ Format de data i número apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -2627,7 +2639,7 @@ Aparença apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2635,7 +2647,7 @@ Llum apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2643,7 +2655,7 @@ Fosc apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2651,7 +2663,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -2663,7 +2675,7 @@ Experiència sense distraccions per a temps turbulents apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -2679,7 +2691,7 @@ Autenticació biomètrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -2687,7 +2699,7 @@ Inicieu la sessió amb l’empremta digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -2695,7 +2707,7 @@ Característiques experimentals apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2703,7 +2715,7 @@ Doneu un cop d’ull a les properes funcionalitats apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -2711,7 +2723,7 @@ Exporta dades apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -2719,7 +2731,7 @@ Zona de perill apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -2727,7 +2739,7 @@ Tanca el compte apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -2779,7 +2791,7 @@ D’acord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -3063,7 +3075,7 @@ Visió general apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -3202,6 +3214,18 @@ 225 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Descobriu les últimes actualitzacions i perspectives de Ghostfolio sobre finances personals @@ -3384,7 +3408,7 @@ Programari de codi obert apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -3396,7 +3420,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -3408,7 +3432,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -3464,7 +3488,7 @@ Mercats apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -3880,7 +3904,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -3976,7 +4000,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -4008,7 +4032,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -4440,7 +4464,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -4468,7 +4492,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4488,15 +4512,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -4504,7 +4528,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -4512,7 +4536,7 @@ Mensualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4520,7 +4544,7 @@ Anualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4536,7 +4560,7 @@ Rendiment absolut dels actius apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -4544,7 +4568,7 @@ Rendiment de l’actiu apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -4552,7 +4576,7 @@ Rendiment absolut de la moneda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -4560,7 +4584,7 @@ Rendiment de la moneda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -4568,7 +4592,7 @@ A dalt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -4576,7 +4600,7 @@ A baix apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -4584,7 +4608,7 @@ Evolució de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -4592,7 +4616,7 @@ Cronologia de la inversió apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -4600,7 +4624,7 @@ Ratxa actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -4608,7 +4632,7 @@ Ratxa més llarga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4616,7 +4640,7 @@ Cronologia de dividends apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -4792,7 +4816,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -4808,7 +4832,7 @@ Suport per correu electrònic i xat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -4816,7 +4840,19 @@ Pagament únic, sense renovació automàtica. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -4824,7 +4860,7 @@ És gratuït. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -4957,7 +4993,7 @@ Suïssa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -4969,7 +5005,7 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5253,7 +5289,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5385,7 +5421,7 @@ Setmana fins avui libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5393,11 +5429,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5405,7 +5441,7 @@ Mes fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5413,11 +5449,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5425,7 +5461,7 @@ Any fins a la data libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5433,7 +5469,7 @@ any apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5445,7 +5481,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5453,11 +5489,11 @@ anys apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5541,7 +5577,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -5641,11 +5677,11 @@ Assignació libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5661,7 +5697,7 @@ Mostra-ho tot libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -5701,11 +5737,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5733,11 +5769,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5892,6 +5928,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satèl·lit @@ -5913,7 +5957,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5957,7 +6001,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -6293,7 +6337,7 @@ Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6301,7 +6345,7 @@ Aplicació apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6309,7 +6353,7 @@ Pressupost apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6325,47 +6369,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6373,7 +6421,7 @@ Oficina familiar apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6381,7 +6429,7 @@ Investor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6393,7 +6441,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6405,7 +6453,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6413,7 +6461,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6421,7 +6469,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6429,7 +6477,7 @@ Tool apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6437,7 +6485,7 @@ User Experience apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6445,7 +6493,7 @@ Wealth apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6453,7 +6501,7 @@ Wealth Management apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6613,7 +6661,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6661,11 +6709,11 @@ Cancel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6717,7 +6765,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6801,7 +6849,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6913,7 +6961,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7147,7 +7195,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7175,7 +7223,7 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7183,7 +7231,7 @@ Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7191,7 +7239,7 @@ Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7199,7 +7247,7 @@ Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7239,7 +7287,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,7 +7307,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7315,7 +7363,15 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7323,7 +7379,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7331,7 +7387,7 @@ Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7339,7 +7395,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenia @@ -7543,7 +7607,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ with API access for apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index 4b405ce30..44ee607c3 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -26,7 +26,7 @@ Das Ausfallrisiko beim Börsenhandel kann erheblich sein. Es ist nicht ratsam, Geld zu investieren, welches du kurzfristig benötigst. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -42,7 +42,7 @@ bitte apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -89,20 +89,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Möchtest du diese Zugangsberechtigung wirklich widerrufen? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -114,7 +106,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -146,7 +138,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -158,7 +150,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -174,7 +166,7 @@ Gesamt libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -202,11 +194,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -218,7 +210,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -250,7 +242,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -266,7 +258,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -286,7 +278,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -326,7 +318,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -402,7 +394,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -482,7 +474,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -490,7 +482,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -518,7 +510,7 @@ Möchtest du diesen Gutscheincode wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -526,7 +518,7 @@ Möchtest du den Cache wirklich leeren? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -534,7 +526,7 @@ Bitte gebe deine Systemmeldung ein: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -654,7 +646,7 @@ Möchtest du diesen Benutzer wirklich löschen? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -730,7 +722,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -742,7 +734,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -790,7 +782,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -830,7 +822,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -874,7 +866,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -926,7 +918,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -938,7 +930,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -978,7 +970,7 @@ Bitte setze den Betrag deines Notfallfonds. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -986,11 +978,11 @@ Sektoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1006,11 +998,11 @@ Länder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1046,11 +1038,11 @@ Allokation libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1066,7 +1058,7 @@ Alle anzeigen libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -1078,7 +1070,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1086,11 +1078,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1098,11 +1090,11 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1110,11 +1102,19 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance mit Währungseffekt + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -1122,11 +1122,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -1134,7 +1134,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -1202,7 +1202,7 @@ Bitte gebe deinen Gutscheincode ein. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -1210,7 +1210,7 @@ Gutscheincode konnte nicht eingelöst werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -1218,7 +1218,7 @@ Gutscheincode wurde eingelöst apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -1226,7 +1226,7 @@ Neu laden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -1234,7 +1234,7 @@ Möchtest du diese Anmeldemethode wirklich löschen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -1254,7 +1254,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -1278,7 +1278,7 @@ Präsentationsansicht apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -1294,11 +1294,11 @@ Lokalität apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -1306,7 +1306,7 @@ Datums- und Zahlenformat apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -1314,7 +1314,7 @@ Zen Modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -1326,7 +1326,7 @@ Einloggen mit Fingerabdruck apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -1338,7 +1338,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1430,11 +1430,11 @@ Währung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1450,7 +1450,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1470,7 +1470,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -1486,7 +1486,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -1674,7 +1674,7 @@ Übersicht apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -1710,7 +1710,7 @@ Märkte apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -1854,7 +1854,7 @@ Zeitstrahl der Investitionen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -1862,7 +1862,7 @@ Gewinner apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -1870,7 +1870,7 @@ Verlierer apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -1930,7 +1930,7 @@ Aktuelle Woche apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1962,7 +1962,7 @@ Name, Symbol oder ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1994,7 +1994,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -2014,7 +2014,7 @@ Kommentar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2038,7 +2038,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -2070,7 +2070,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -2146,7 +2146,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -2338,7 +2338,7 @@ kontaktiere uns apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -2430,7 +2430,7 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2442,7 +2442,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -2526,7 +2526,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2626,7 +2626,7 @@ Filtern nach... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -2654,7 +2654,19 @@ Experimentelle Funktionen apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 + + + + Could not validate form + Das Formular konnte nicht validiert werden + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 @@ -2670,7 +2682,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -2698,11 +2710,11 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2710,7 +2722,7 @@ Aussehen apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2718,7 +2730,7 @@ Hell apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2726,7 +2738,7 @@ Dunkel apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2742,7 +2754,7 @@ Portfolio Wertentwicklung apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -2782,11 +2794,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2818,7 +2830,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3110,7 +3122,7 @@ Symbol Zuordnung apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -3118,7 +3130,7 @@ Zeitstrahl der Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3126,7 +3138,7 @@ Suchst du nach einem Studentenrabatt? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3154,7 +3166,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3170,11 +3182,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3278,7 +3290,7 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3349,6 +3361,14 @@ 28 + + Everything in Basic, plus + Alles von Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satellit @@ -3362,7 +3382,7 @@ Ausblenden von sensiblen Informationen wie absoluter Performance und Stückzahl apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -3370,7 +3390,7 @@ Unbeschwertes Erlebnis für turbulente Zeiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -3378,7 +3398,7 @@ Vorschau auf kommende Funktionalität apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -3402,7 +3422,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -3418,7 +3438,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -3434,7 +3454,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -3450,7 +3470,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -3498,7 +3518,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -3582,7 +3602,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3598,7 +3618,19 @@ Einmalige Zahlung, keine automatische Erneuerung. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Das Anlageprofil konnte nicht gespeichert werden + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3606,7 +3638,7 @@ Es ist kostenlos. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -3638,7 +3670,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -3682,7 +3714,7 @@ E-Mail und Chat Support apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3734,7 +3766,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -3758,7 +3790,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3822,7 +3854,7 @@ Aktuelles Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -3838,11 +3870,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3853,12 +3885,20 @@ 25 + + Asset profile has been saved + Das Anlageprofil wurde gespeichert + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Möchtest du diese Plattform wirklich löschen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -3994,7 +4034,7 @@ Aktueller Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -4002,7 +4042,7 @@ Längster Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4046,7 +4086,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -4186,7 +4226,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -4210,7 +4250,7 @@ Scraper Konfiguration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -4449,20 +4489,12 @@ 43 - - Everything in - Alles von - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETFs ohne Länder apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -4470,7 +4502,7 @@ ETFs ohne Sektoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -4606,7 +4638,7 @@ Biometrische Authentifizierung apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4698,7 +4730,7 @@ Daten exportieren apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4706,7 +4738,7 @@ Währungen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html @@ -4753,6 +4785,18 @@ 7 + + Could not parse scraper configuration + Die Scraper Konfiguration konnte nicht geparsed werden + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Entdecke die neuesten Ghostfolio Updates und Beiträge zu persönlichen Finanzen @@ -5304,7 +5348,7 @@ Schweiz apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5316,7 +5360,7 @@ Weltweit apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5344,7 +5388,7 @@ mit deiner Universitäts-E-Mail-Adresse apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5528,7 +5572,7 @@ Fordere ihn an apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5668,7 +5712,7 @@ Ups! Die historischen Daten konnten nicht geparsed werden. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5676,7 +5720,7 @@ Möchtest du diese Systemmeldung wirklich löschen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5736,7 +5780,7 @@ Der aktuelle Marktpreis ist apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5744,7 +5788,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5832,15 +5876,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5848,7 +5892,7 @@ hier apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5864,7 +5908,7 @@ Absolute Anlage Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5872,7 +5916,7 @@ Anlage Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5880,7 +5924,7 @@ Absolute Währungsperformance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5888,7 +5932,7 @@ Währungsperformance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5896,7 +5940,7 @@ Seit Wochenbeginn libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5904,11 +5948,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5916,7 +5960,7 @@ Seit Monatsbeginn libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5924,11 +5968,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5936,7 +5980,7 @@ Seit Jahresbeginn libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5972,7 +6016,7 @@ Jahr apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5984,7 +6028,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5992,11 +6036,11 @@ Jahre apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -6012,7 +6056,7 @@ Finanzmarktdaten synchronisieren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6189,7 +6233,7 @@ Möchtest du dieses Ghostfolio Konto wirklich schliessen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6197,7 +6241,7 @@ Gefahrenzone apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6205,7 +6249,7 @@ Konto schliessen apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6237,7 +6281,7 @@ Berücksichtigen in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6245,7 +6289,7 @@ Ups! Beim Einrichten der biometrischen Authentifizierung ist ein Fehler aufgetreten. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6261,7 +6305,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6317,7 +6361,7 @@ Alternative apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6325,7 +6369,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6333,7 +6377,7 @@ Budgetierung apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6349,47 +6393,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6397,7 +6445,7 @@ Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6405,7 +6453,7 @@ Investor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6417,7 +6465,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6429,7 +6477,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6437,7 +6485,7 @@ Datenschutz apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6445,7 +6493,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6453,7 +6501,7 @@ Tool apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6461,7 +6509,7 @@ User Experience apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6469,7 +6517,7 @@ Vermögen apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6477,7 +6525,7 @@ Vermögensverwaltung apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6637,7 +6685,7 @@ Fehler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6685,11 +6733,11 @@ Abbrechen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6741,7 +6789,7 @@ Schliessen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6825,7 +6873,7 @@ Wenn du die Eröffnung eines Kontos planst bei apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6937,7 +6985,7 @@ um unseren Empfehlungslink zu verwenden und eine Ghostfolio Premium-Mitgliedschaft für ein Jahr zu erhalten apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7171,7 +7219,7 @@ Möchtest du den API-Schlüssel wirklich löschen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7199,7 +7247,7 @@ API-Schlüssel konnte nicht erstellt werden apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7207,7 +7255,7 @@ Setze diesen API-Schlüssel in deiner selbst gehosteten Umgebung: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7215,7 +7263,7 @@ API-Schlüssel für den Ghostfolio Premium Datenanbieter apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7223,7 +7271,7 @@ Möchtest du wirklich einen neuen API-Schlüssel erstellen? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7263,7 +7311,7 @@ Speichern apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7283,7 +7331,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7339,7 +7387,15 @@ Bitte gebe deinen Ghostfolio API-Schlüssel ein. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Änderung mit Währungseffekt + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7347,7 +7403,7 @@ KI-Anweisung wurde in die Zwischenablage kopiert apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7355,7 +7411,7 @@ Link wurde in die Zwischenablage kopiert apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7363,7 +7419,7 @@ Verzögert apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7371,7 +7427,7 @@ Sofort apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7379,7 +7435,7 @@ Standardmarktpreis apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7387,7 +7443,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7395,7 +7451,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7403,7 +7459,7 @@ HTTP Request-Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7411,7 +7467,7 @@ Tagesende apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7419,7 +7475,7 @@ in Echtzeit apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7427,7 +7483,7 @@ Öffne Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7443,7 +7499,7 @@ Änderung libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7463,7 +7519,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7498,6 +7554,14 @@ 67 + + Total amount + Gesamtbetrag + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenien @@ -7567,7 +7631,7 @@ Sicherheits-Token apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7579,7 +7643,7 @@ Möchtest du für diesen Benutzer wirklich ein neues Sicherheits-Token generieren? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7587,7 +7651,7 @@ Konto, Position oder Seite finden... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7652,7 +7716,7 @@ () wird bereits verwendet. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7660,7 +7724,7 @@ Bei der Änderung zu () ist ein Fehler aufgetreten. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7668,7 +7732,7 @@ Übernehmen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7676,7 +7740,7 @@ inklusive API-Zugriff für apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Möchtest du diesen Eintrag wirklich löschen? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Demo Benutzerkonto wurde synchronisiert. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Aktueller Monat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 6e5bf1dba..7564e4d80 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -27,7 +27,7 @@ El riesgo de pérdida en trading puede ser sustancial. No es aconsejable invertir dinero que puedas necesitar a corto plazo. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -40,10 +40,10 @@ please - please + por favor apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -84,26 +84,18 @@ with - with + con apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? ¿Quieres revocar el acceso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -115,7 +107,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -147,7 +139,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -159,7 +151,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -175,7 +167,7 @@ Total libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -203,11 +195,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -219,7 +211,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -251,7 +243,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -267,7 +259,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -287,7 +279,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -327,7 +319,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -376,7 +368,7 @@ and is driven by the efforts of its contributors - and is driven by the efforts of its contributors + y es impulsado por los esfuerzos de sus contribuidores apps/client/src/app/pages/about/overview/about-overview-page.html 49 @@ -403,7 +395,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -483,7 +475,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -491,7 +483,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -519,7 +511,7 @@ ¿Estás seguro de eliminar este cupón? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -527,7 +519,7 @@ ¿Estás seguro de limpiar la caché? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -535,7 +527,7 @@ Por favor, establece tu mensaje del sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -639,7 +631,7 @@ ¿Estás seguro de eliminar este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -660,7 +652,7 @@ No auto-renewal on membership. - No auto-renewal on membership. + No se renueva automáticamente la membresía. apps/client/src/app/components/user-account-membership/user-account-membership.html 74 @@ -715,7 +707,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -727,7 +719,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -775,7 +767,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -815,7 +807,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -859,7 +851,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -911,7 +903,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -923,7 +915,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -963,7 +955,7 @@ Por favor, ingresa la cantidad de tu fondo de emergencia: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -971,11 +963,11 @@ Sectores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -991,11 +983,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1031,11 +1023,11 @@ Distribución libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1051,7 +1043,7 @@ Mostrar todos libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -1063,7 +1055,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1071,11 +1063,11 @@ Desde principio de año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1083,11 +1075,11 @@ 1 año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1095,11 +1087,19 @@ 5 años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Rendimiento con el efecto del tipo de cambio de divisa + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -1107,11 +1107,11 @@ Máximo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -1119,7 +1119,7 @@ De acuerdo apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -1187,7 +1187,7 @@ Por favor, ingresa tu código de cupón: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -1195,7 +1195,7 @@ No se puede canjear este código de cupón apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -1203,7 +1203,7 @@ El codigo de cupón ha sido canjeado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -1211,7 +1211,7 @@ Refrescar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -1219,7 +1219,7 @@ ¿Estás seguro de eliminar este método de acceso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -1239,7 +1239,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -1263,7 +1263,7 @@ Vista del presentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -1279,11 +1279,11 @@ Ubicación apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -1291,7 +1291,7 @@ Formato de fecha y número apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -1299,7 +1299,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -1311,7 +1311,7 @@ Iniciar sesión con huella digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -1323,7 +1323,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1415,11 +1415,11 @@ Divisa base apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1435,7 +1435,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1455,7 +1455,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -1471,7 +1471,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -1659,7 +1659,7 @@ Visión general apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -1695,7 +1695,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -1839,7 +1839,7 @@ Cronología de la inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -1847,7 +1847,7 @@ Lo mejor apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -1855,7 +1855,7 @@ Lo peor apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -1912,10 +1912,10 @@ Current week - Current week + Semana actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1947,7 +1947,7 @@ Nombre, símbolo o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1979,7 +1979,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1999,7 +1999,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2023,7 +2023,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -2055,7 +2055,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -2076,7 +2076,7 @@ or start a discussion at - or start a discussion at + o iniciar una discusión en apps/client/src/app/pages/about/overview/about-overview-page.html 94 @@ -2131,7 +2131,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -2148,7 +2148,7 @@ Sustainable retirement income - Sustainable retirement income + Ingreso sostenible de retiro apps/client/src/app/pages/portfolio/fire/fire-page.html 41 @@ -2320,10 +2320,10 @@ contact us - contact us + contactarnos apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -2420,7 +2420,7 @@ Latest activities - Latest activities + Últimas actividades apps/client/src/app/pages/public/public-page.html 211 @@ -2463,7 +2463,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2475,7 +2475,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -2536,7 +2536,7 @@ annual interest rate - annual interest rate + tasa de interés anual apps/client/src/app/pages/portfolio/fire/fire-page.html 185 @@ -2555,7 +2555,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2611,7 +2611,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -2639,7 +2639,7 @@ Funcionalidades experimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2647,13 +2647,25 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 152 + + Could not validate form + No se pudo validar el formulario + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Comparar con... @@ -2683,11 +2695,11 @@ Automático apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2695,7 +2707,7 @@ Apariencia apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2703,7 +2715,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2711,7 +2723,7 @@ Oscuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2727,7 +2739,7 @@ Evolución cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -2767,11 +2779,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2803,7 +2815,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2880,7 +2892,7 @@ Authentication - Authentication + Autenticación apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 35 @@ -3032,7 +3044,7 @@ If you retire today, you would be able to withdraw - If you retire today, you would be able to withdraw + Si te retirases hoy, podrías sacar apps/client/src/app/pages/portfolio/fire/fire-page.html 68 @@ -3095,15 +3107,15 @@ Mapeo de símbolos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 Looking for a student discount? - Looking for a student discount? + ¿Buscando un descuento para estudiantes? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3131,7 +3143,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3143,7 +3155,7 @@ Calendario de dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3155,11 +3167,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3263,7 +3275,7 @@ Anual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3334,6 +3346,14 @@ 28 + + Everything in Basic, plus + Todo en Básico, más + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satélite @@ -3347,7 +3367,7 @@ Protección de información confidencial como rendimientos absolutos y valores cuantitativos apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -3355,7 +3375,7 @@ Experiencia sin distracciones para tiempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -3363,7 +3383,7 @@ Un adelanto de las próximas funciones apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -3387,7 +3407,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -3403,7 +3423,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -3419,7 +3439,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -3435,7 +3455,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -3483,7 +3503,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -3567,7 +3587,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3583,7 +3603,19 @@ Pago único, sin renovación automática. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + No se pudo guardar el perfil del activo + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3591,7 +3623,7 @@ Es gratis. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -3623,7 +3655,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -3667,7 +3699,7 @@ Soporte a Traves de Email y Chat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3711,7 +3743,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -3735,7 +3767,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3780,7 +3812,7 @@ By - By + Por apps/client/src/app/pages/portfolio/fire/fire-page.html 139 @@ -3796,10 +3828,10 @@ Current year - Current year + Año actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -3815,11 +3847,11 @@ ¿La URL? apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3830,12 +3862,20 @@ 25 + + Asset profile has been saved + El perfil del activo ha sido guardado + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? ¿Realmente deseas eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -3971,7 +4011,7 @@ Racha actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -3979,7 +4019,7 @@ Racha más larga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4016,14 +4056,14 @@ View Details - View Details + Ver detalles apps/client/src/app/components/admin-users/admin-users.html 225 libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -4152,7 +4192,7 @@ per week - per week + por semana apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 130 @@ -4163,7 +4203,7 @@ Software de código abierto apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -4176,7 +4216,7 @@ and we share aggregated key metrics of the platform’s performance - and we share aggregated key metrics of the platform’s performance + y compartimos agregados métricas clave del rendimiento de la plataforma apps/client/src/app/pages/about/overview/about-overview-page.html 32 @@ -4187,7 +4227,7 @@ Configuración del scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -4220,7 +4260,7 @@ Website of Thomas Kaul - Website of Thomas Kaul + Sitio web de Thomas Kaul apps/client/src/app/pages/about/overview/about-overview-page.html 44 @@ -4400,7 +4440,7 @@ Sign in with OpenID Connect - Sign in with OpenID Connect + Iniciar sesión con OpenID Connect apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 55 @@ -4426,20 +4466,12 @@ 43 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETFs sin países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -4447,7 +4479,7 @@ ETFs sin sectores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -4500,7 +4532,7 @@ The source code is fully available as open source software (OSS) under the AGPL-3.0 license - The source code is fully available as open source software (OSS) under the AGPL-3.0 license + El código fuente está disponible completamente en software de código abierto (OSS) bajo la licencia AGPL-3.0 apps/client/src/app/pages/about/overview/about-overview-page.html 16 @@ -4572,7 +4604,7 @@ this is projected to increase to - this is projected to increase to + esto se proyecta a aumentar a apps/client/src/app/pages/portfolio/fire/fire-page.html 147 @@ -4583,7 +4615,7 @@ Autenticación biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4624,7 +4656,7 @@ Job ID - Job ID + ID de trabajo apps/client/src/app/components/admin-jobs/admin-jobs.html 34 @@ -4675,7 +4707,7 @@ Exportar datos apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4683,7 +4715,7 @@ Monedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html @@ -4708,7 +4740,7 @@ for - for + para apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 128 @@ -4730,6 +4762,18 @@ 7 + + Could not parse scraper configuration + No se pudo analizar la configuración del scraper + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Conoce las últimas actualizaciones de Ghostfolio y obtén información sobre finanzas personales @@ -4764,7 +4808,7 @@ Edit access - Edit access + Editar acceso apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html 11 @@ -4836,7 +4880,7 @@ Get access to 80’000+ tickers from over 50 exchanges - Get access to 80’000+ tickers from over 50 exchanges + Obtén acceso a más de 80,000 tickers de más de 50 exchanges apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 84 @@ -5020,7 +5064,7 @@ less than - less than + menos que apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html 129 @@ -5281,7 +5325,7 @@ Suiza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5293,7 +5337,7 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5310,7 +5354,7 @@ Ghostfolio Status - Ghostfolio Status + Estado de Ghostfolio apps/client/src/app/pages/about/overview/about-overview-page.html 62 @@ -5318,10 +5362,10 @@ with your university e-mail address - with your university e-mail address + con tu dirección de correo electrónico de la universidad apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5338,7 +5382,7 @@ and a safe withdrawal rate (SWR) of - and a safe withdrawal rate (SWR) of + y una tasa de retiro segura (SWR) de apps/client/src/app/pages/portfolio/fire/fire-page.html 108 @@ -5502,10 +5546,10 @@ Request it - Request it + Solicitar apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5558,7 +5602,7 @@ , - , + , apps/client/src/app/pages/portfolio/fire/fire-page.html 145 @@ -5574,7 +5618,7 @@ per month - per month + por mes apps/client/src/app/pages/portfolio/fire/fire-page.html 94 @@ -5645,7 +5689,7 @@ ¡Ups! No se pudieron analizar los datos históricos. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5653,7 +5697,7 @@ ¿Realmente deseas eliminar este mensaje del sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5713,7 +5757,7 @@ El precio actual de mercado es apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5721,7 +5765,7 @@ Prueba apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5809,28 +5853,28 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 here - here + aquí apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 Close Holding - Close Holding + Cerrar posición apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 442 @@ -5841,7 +5885,7 @@ Rendimiento absoluto de los activos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5849,7 +5893,7 @@ Rendimiento de activos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5857,7 +5901,7 @@ Rendimiento absoluto de divisas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5865,7 +5909,7 @@ Rendimiento de la moneda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5873,7 +5917,7 @@ Semana hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5881,11 +5925,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5893,7 +5937,7 @@ Mes hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5901,11 +5945,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5913,7 +5957,7 @@ El año hasta la fecha libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5949,7 +5993,7 @@ año apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5961,7 +6005,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5969,11 +6013,11 @@ años apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5989,7 +6033,7 @@ Recopilación de datos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6131,7 +6175,7 @@ {VAR_PLURAL, plural, =1 {activity} other {activities}} - {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, plural, =1 {actividad} other {actividades}} apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html 14 @@ -6166,7 +6210,7 @@ ¿Estás seguro de querer borrar tu cuenta de Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6174,7 +6218,7 @@ Zona peligrosa apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6182,7 +6226,7 @@ Eliminar cuenta apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6211,10 +6255,10 @@ Include in - Include in + Incluir en apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6222,7 +6266,7 @@ ¡Ups! Hubo un error al configurar la autenticación biométrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6238,7 +6282,7 @@ Puntos de referencia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6294,7 +6338,7 @@ Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6302,7 +6346,7 @@ Aplicación apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6310,7 +6354,7 @@ Presupuestación apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6326,47 +6370,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6374,7 +6422,7 @@ Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6382,7 +6430,7 @@ Inversor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6394,7 +6442,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6406,7 +6454,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6414,7 +6462,7 @@ Privacidad apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6422,7 +6470,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6430,7 +6478,7 @@ Herramienta apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6438,7 +6486,7 @@ Experiencia del usuario apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6446,7 +6494,7 @@ Riqueza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6454,7 +6502,7 @@ Gestión de patrimonios apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6491,7 +6539,7 @@ View Holding - View Holding + Ver fondos libs/ui/src/lib/activities-table/activities-table.component.html 450 @@ -6614,7 +6662,7 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6635,7 +6683,7 @@ Oops! Could not update access. - Oops! Could not update access. + Oops! No se pudo actualizar el acceso. apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts 178 @@ -6643,7 +6691,7 @@ , based on your total assets of - , based on your total assets of + , basado en tus activos totales de apps/client/src/app/pages/portfolio/fire/fire-page.html 96 @@ -6662,11 +6710,11 @@ Cancelar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6715,10 +6763,10 @@ Close - Cerca + Cerrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6759,7 +6807,7 @@ Role - Role + Rol apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 14 @@ -6791,7 +6839,7 @@ Change with currency effect Change - Change with currency effect Change + Cambiar con efecto de cambio dedivisa Cambiar apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 63 @@ -6799,15 +6847,15 @@ If you plan to open an account at - If you plan to open an account at + Si planeas abrir una cuenta en apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 Performance with currency effect Performance - Performance with currency effect Performance + Rendimiento con cambio de divisa Rendimiento apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html 83 @@ -6831,7 +6879,7 @@ send an e-mail to - send an e-mail to + enviar un correo electrónico a apps/client/src/app/pages/about/overview/about-overview-page.html 87 @@ -6903,7 +6951,7 @@ , assuming a - , assuming a + , asumiendo un apps/client/src/app/pages/portfolio/fire/fire-page.html 174 @@ -6911,10 +6959,10 @@ to use our referral link and get a Ghostfolio Premium membership for one year - to use our referral link and get a Ghostfolio Premium membership for one year + para usar nuestro enlace de referido y obtener una membresía Ghostfolio Premium por un año apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -6991,7 +7039,7 @@ Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. - Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. + Ghostfolio es una aplicación de gestión de patrimonio para aquellos individuos que desean realizar un seguimiento de acciones, ETFs o criptomonedas y tomar decisiones de inversión sólidas y basadas en datos. apps/client/src/app/pages/about/overview/about-overview-page.html 10 @@ -7148,7 +7196,7 @@ ¿Realmente deseas eliminar la clave API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7176,7 +7224,7 @@ No se pudo generar una clave API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7184,7 +7232,7 @@ Configure esta clave API en su entorno autohospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7192,7 +7240,7 @@ Clave API del proveedor de datos premium de Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7200,7 +7248,7 @@ ¿Realmente desea generar una nueva clave API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7240,7 +7288,7 @@ Ahorrar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7260,7 +7308,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7305,7 +7353,7 @@ Check the system status at - Check the system status at + Verificar el estado del sistema en apps/client/src/app/pages/about/overview/about-overview-page.html 57 @@ -7316,7 +7364,15 @@ Por favor, ingresa tu clave API de Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Cambiar con el efecto del tipo de cambio de divisa + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7324,7 +7380,7 @@ El aviso de IA ha sido copiado al portapapeles apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7332,7 +7388,7 @@ El enlace ha sido copiado al portapapeles apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7340,7 +7396,7 @@ Perezoso apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7348,7 +7404,7 @@ Instantáneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7356,7 +7412,7 @@ Precio de mercado por defecto apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7364,7 +7420,7 @@ Modo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7372,7 +7428,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7380,7 +7436,7 @@ Encabezados de solicitud HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7388,7 +7444,7 @@ final del día apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7396,7 +7452,7 @@ en tiempo real apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7404,7 +7460,7 @@ Abrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7420,7 +7476,7 @@ Cambiar libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7440,7 +7496,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7453,7 +7509,7 @@ The project has been initiated by - The project has been initiated by + El proyecto ha sido iniciado por apps/client/src/app/pages/about/overview/about-overview-page.html 40 @@ -7475,6 +7531,14 @@ 67 + + Total amount + Cantidad total + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenia @@ -7544,7 +7608,7 @@ Token de seguridad apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7556,15 +7620,15 @@ ¿Realmente deseas generar un nuevo token de seguridad para este usuario? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 Find account, holding or page... - Find account, holding or page... + Buscar cuenta, posición o página... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7629,7 +7693,7 @@ () ya está en uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7637,7 +7701,7 @@ Ocurrió un error al actualizar a (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7645,7 +7709,7 @@ Aplicar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7653,7 +7717,7 @@ con acceso a la API para apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7733,7 +7797,7 @@ ¿Realmente deseas eliminar este elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7774,7 +7838,7 @@ La cuenta de usuario de demostración se ha sincronizado. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7952,7 +8016,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7964,7 +8028,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7985,10 +8049,10 @@ Current month - Current month + Mes actual apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 @@ -8170,7 +8234,7 @@ If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ - If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ + Si encuentras un error, deseas sugerir una mejora o una nueva característica, por favor únete a la comunidad Ghostfolio Slack, publica en @ghostfolio_ apps/client/src/app/pages/about/overview/about-overview-page.html 69 @@ -8202,7 +8266,7 @@ - + apps/client/src/app/components/admin-users/admin-users.html 39 @@ -8270,7 +8334,7 @@ Economic Market Cluster Risks - Economic Market Cluster Risks + Riesgos del clúster de mercados económicos apps/client/src/app/pages/i18n/i18n-page.html 106 @@ -8278,7 +8342,7 @@ Emergency Fund - Emergency Fund + Fondo de emergencia apps/client/src/app/pages/i18n/i18n-page.html 144 @@ -8286,7 +8350,7 @@ Fees - Fees + Comisiones apps/client/src/app/pages/i18n/i18n-page.html 161 @@ -8294,7 +8358,7 @@ Liquidity - Liquidity + Liquidez apps/client/src/app/pages/i18n/i18n-page.html 70 @@ -8302,7 +8366,7 @@ Buying Power - Buying Power + Poder de compra apps/client/src/app/pages/i18n/i18n-page.html 71 @@ -8310,7 +8374,7 @@ Your buying power is below ${thresholdMin} ${baseCurrency} - Your buying power is below ${thresholdMin} ${baseCurrency} + Tu poder de compra es inferior a ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 73 @@ -8318,7 +8382,7 @@ Your buying power is 0 ${baseCurrency} - Your buying power is 0 ${baseCurrency} + Tu poder de compra es 0 ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 77 @@ -8326,7 +8390,7 @@ Your buying power exceeds ${thresholdMin} ${baseCurrency} - Your buying power exceeds ${thresholdMin} ${baseCurrency} + Tu poder de compra excede ${thresholdMin} ${baseCurrency} apps/client/src/app/pages/i18n/i18n-page.html 80 @@ -8358,7 +8422,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% - The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% + La contribución a los mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) supera el ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 112 @@ -8366,7 +8430,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% - The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% + La contribución a los mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) es inferior al ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 117 @@ -8374,7 +8438,7 @@ The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + La contribución a los mercados desarrollados de tu inversión actual (${developedMarketsValueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 122 @@ -8390,7 +8454,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% - The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% + La contribución a los mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) supera el ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 130 @@ -8398,7 +8462,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% - The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% + La contribución a los mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) es inferior al ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 135 @@ -8406,7 +8470,7 @@ The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + La contribución a los mercados emergentes de tu inversión actual (${emergingMarketsValueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 140 @@ -8430,7 +8494,7 @@ Asia-Pacific - Asia-Pacific + Asia-Pacífico apps/client/src/app/pages/i18n/i18n-page.html 165 @@ -8438,7 +8502,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 167 @@ -8446,7 +8510,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 171 @@ -8454,7 +8518,7 @@ The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + La contribución al mercado de Asia-Pacífico de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 175 @@ -8462,7 +8526,7 @@ Emerging Markets - Emerging Markets + Mercados emergentes apps/client/src/app/pages/i18n/i18n-page.html 180 @@ -8470,7 +8534,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 183 @@ -8478,7 +8542,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 187 @@ -8486,7 +8550,7 @@ The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + La contribución a los mercados emergentes de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 191 @@ -8494,7 +8558,7 @@ Europe - Europe + Europa apps/client/src/app/pages/i18n/i18n-page.html 195 @@ -8502,7 +8566,7 @@ The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% - The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + La contribución al mercado europeo de tu inversión actual (${valueRatio}%) supera el ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 197 @@ -8510,7 +8574,7 @@ The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% - The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + La contribución al mercado europeo de tu inversión actual (${valueRatio}%) es inferior al ${thresholdMin}% apps/client/src/app/pages/i18n/i18n-page.html 201 @@ -8518,7 +8582,7 @@ The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% - The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + La contribución al mercado europeo de tu inversión actual (${valueRatio}%) está dentro del rango de ${thresholdMin}% y ${thresholdMax}% apps/client/src/app/pages/i18n/i18n-page.html 205 @@ -8630,7 +8694,7 @@ Registration Date - Registration Date + Fecha de registro apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 26 diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index 65c3e54f5..0da1c3f6a 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -6,7 +6,7 @@ Le risque de perte en investissant peut être important. Il est déconseillé d’investir de l’argent dont vous pourriez avoir besoin à court terme. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -34,7 +34,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -81,20 +81,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Voulez-vous vraiment révoquer cet accès ? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -110,7 +102,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -122,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -154,7 +146,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -166,7 +158,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -182,7 +174,7 @@ Total libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -190,11 +182,11 @@ Devise apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -210,7 +202,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -230,7 +222,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -258,11 +250,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -274,7 +266,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -306,7 +298,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -322,7 +314,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -342,7 +334,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -374,7 +366,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -458,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -534,7 +526,7 @@ Filtrer par... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -546,7 +538,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -554,7 +546,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -618,7 +610,7 @@ Secteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -630,7 +622,7 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -650,11 +642,11 @@ Secteurs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -670,11 +662,11 @@ Pays apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -686,7 +678,7 @@ Équivalence de Symboles apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -694,7 +686,7 @@ Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -710,7 +702,7 @@ Voulez-vous vraiment supprimer ce code promotionnel ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -718,7 +710,7 @@ Voulez-vous vraiment vider le cache ? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -726,7 +718,7 @@ Veuillez définir votre message système : apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -850,7 +842,7 @@ Voulez-vous vraiment supprimer cet·te utilisateur·rice ? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -897,6 +889,18 @@ 186 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Comparer avec... @@ -922,7 +926,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -934,7 +938,7 @@ Référence apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -998,7 +1002,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1086,7 +1090,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1130,7 +1134,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1182,7 +1186,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -1194,7 +1198,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -1242,7 +1246,7 @@ Veuillez entrer le montant de votre fonds d’urgence : apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -1278,7 +1282,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1298,7 +1302,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1306,11 +1310,11 @@ CDA apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1318,11 +1322,11 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1330,11 +1334,19 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -1342,11 +1354,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -1390,7 +1402,7 @@ D’accord apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -1458,11 +1470,11 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -1470,7 +1482,7 @@ Veuillez entrer votre code promotionnel. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -1478,7 +1490,7 @@ Le code promotionnel n’a pas pu être appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -1486,7 +1498,7 @@ Le code promotionnel a été appliqué apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -1494,7 +1506,7 @@ Rafraîchir apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -1502,7 +1514,7 @@ Voulez-vous vraiment supprimer cette méthode de connexion ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -1522,7 +1534,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -1546,7 +1558,7 @@ Vue de Présentation apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -1570,11 +1582,11 @@ Paramètres régionaux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -1582,7 +1594,7 @@ Format de date et d’heure apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -1590,7 +1602,7 @@ Apparence apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -1598,7 +1610,7 @@ Clair apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -1606,7 +1618,7 @@ Sombre apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -1614,7 +1626,7 @@ Mode Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -1626,7 +1638,7 @@ Se connecter avec empreinte apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -1634,7 +1646,7 @@ Fonctionnalités expérimentales apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -1646,7 +1658,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1978,7 +1990,7 @@ Marchés apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -2034,7 +2046,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -2066,7 +2078,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -2082,7 +2094,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -2114,7 +2126,7 @@ Nom, symbole, ou ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2374,7 +2386,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -2402,7 +2414,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -2430,7 +2442,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2438,7 +2450,7 @@ Haut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -2446,7 +2458,7 @@ Bas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -2454,7 +2466,7 @@ Évolution du Portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -2462,7 +2474,7 @@ Historique des Investissements apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -2470,7 +2482,7 @@ Historique des Dividendes apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -2562,7 +2574,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -2574,7 +2586,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -2686,7 +2698,7 @@ Aperçu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -2802,7 +2814,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -2862,11 +2874,11 @@ Part libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -2882,7 +2894,7 @@ Montrer tout libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -2914,11 +2926,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2946,11 +2958,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3006,7 +3018,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3262,7 +3274,7 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3333,6 +3345,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satellite @@ -3346,7 +3366,7 @@ Protection pour les informations sensibles telles que la performance absolue et les montants apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -3354,7 +3374,7 @@ Expérience sans distraction pour les périodes tumultueuses apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -3362,7 +3382,7 @@ Avant-première de fonctionnalités futures apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -3386,7 +3406,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -3402,7 +3422,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -3418,7 +3438,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -3434,7 +3454,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -3482,7 +3502,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -3566,7 +3586,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3582,7 +3602,19 @@ Paiement unique, sans auto-renouvellement. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3590,7 +3622,7 @@ C’est gratuit. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -3622,7 +3654,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -3666,7 +3698,7 @@ Support par E-mail et Tchat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3710,7 +3742,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -3734,7 +3766,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3798,7 +3830,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -3814,11 +3846,11 @@ Lien apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3829,12 +3861,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Voulez-vous vraiment supprimer cette plateforme ? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -3970,7 +4010,7 @@ Série en cours apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -3978,7 +4018,7 @@ Série la plus longue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4022,7 +4062,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -4162,7 +4202,7 @@ Logiciel Open Source apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -4186,7 +4226,7 @@ Configuration du Scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -4425,20 +4465,12 @@ 43 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETF sans Pays apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -4446,7 +4478,7 @@ ETF sans Secteurs apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -4582,7 +4614,7 @@ Authentication biométrique apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4674,7 +4706,7 @@ Exporter les Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4682,7 +4714,7 @@ Devises apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html @@ -4729,6 +4761,18 @@ 7 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Découvrez les dernières mises à jour et informations de Ghostfolio sur la gestion de patrimoine @@ -5280,7 +5324,7 @@ Suisse apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5292,7 +5336,7 @@ Mondial apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5320,7 +5364,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5504,7 +5548,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5644,7 +5688,7 @@ Oops! Echec du parsing des données historiques. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5652,7 +5696,7 @@ Confirmer la suppresion de ce message système? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5712,7 +5756,7 @@ Le prix actuel du marché est apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5720,7 +5764,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5808,15 +5852,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5824,7 +5868,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5840,7 +5884,7 @@ Performance des Actifs en valeur absolue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5848,7 +5892,7 @@ Performance des Actifs apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5856,7 +5900,7 @@ Performance des devises en valeur absolue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5864,7 +5908,7 @@ Performance des devises apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5872,7 +5916,7 @@ Week to date libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5880,11 +5924,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5892,7 +5936,7 @@ Month to date libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5900,11 +5944,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5912,7 +5956,7 @@ Year to date libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5948,7 +5992,7 @@ année apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5960,7 +6004,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5968,11 +6012,11 @@ années apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5988,7 +6032,7 @@ Collecter les données apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6165,7 +6209,7 @@ Confirmer la suppresion de votre compte Ghostfolio ? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6173,7 +6217,7 @@ Zone de danger apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6181,7 +6225,7 @@ Supprimer le compte apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6213,7 +6257,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6221,7 +6265,7 @@ Oops! Une erreur s’est produite lors de la configuration de l’authentification biométrique. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6237,7 +6281,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6293,7 +6337,7 @@ Alternative apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6301,7 +6345,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6309,7 +6353,7 @@ Budget apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6325,47 +6369,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6373,7 +6421,7 @@ Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6381,7 +6429,7 @@ Investisseur apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6393,7 +6441,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6405,7 +6453,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6413,7 +6461,7 @@ Confidentialité apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6421,7 +6469,7 @@ Logiciels apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6429,7 +6477,7 @@ Outils apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6437,7 +6485,7 @@ Expérience Utilisateur apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6445,7 +6493,7 @@ Patrimoine apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6453,7 +6501,7 @@ Gestion de Patrimoine apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6613,7 +6661,7 @@ Erreur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6661,11 +6709,11 @@ Annuler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6717,7 +6765,7 @@ Fermer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6801,7 +6849,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6913,7 +6961,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7147,7 +7195,7 @@ Voulez-vous vraiment supprimer la clé API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7175,7 +7223,7 @@ Impossible de générer une clé API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7183,7 +7231,7 @@ Définissez cette clé API dans votre environnement auto-hébergé : apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7191,7 +7239,7 @@ Clé API du fournisseur de données Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7199,7 +7247,7 @@ Voulez-vous vraiment générer une nouvelle clé API ? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7239,7 +7287,7 @@ Sauvegarder apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,7 +7307,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7315,7 +7363,15 @@ Veuillez saisir votre clé API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7323,7 +7379,7 @@ Le prompt IA a été copié dans le presse-papiers apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7331,7 +7387,7 @@ Le lien a été copié dans le presse-papiers apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7339,7 +7395,7 @@ Paresseux apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Instantané apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Prix du marché par défaut apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Selecteur apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ En-têtes de requête HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ fin de journée apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ temps réel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Ouvrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Variation libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Arménie @@ -7543,7 +7607,7 @@ Jeton de sécurité apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Voulez-vous vraiment générer un nouveau jeton de sécurité pour cet utilisateur ? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () est déjà utilisé. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ Une erreur s’est produite lors de la mise à jour vers (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Appliquer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ avec accès API pour apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Voulez-vous vraiment supprimer cet élément? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Le compte utilisateur de démonstration a été synchronisé. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index f92049f9c..746e1fbd1 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -27,7 +27,7 @@ Il rischio di perdita nel trading può essere notevole. Non è consigliabile investire denaro di cui potresti avere bisogno a breve termine. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -43,7 +43,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -90,20 +90,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Vuoi davvero revocare l’accesso concesso? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -115,7 +107,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -147,7 +139,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -159,7 +151,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -175,7 +167,7 @@ Totale libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -203,11 +195,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -219,7 +211,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -251,7 +243,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -267,7 +259,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -287,7 +279,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -327,7 +319,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -403,7 +395,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -483,7 +475,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -491,7 +483,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -519,7 +511,7 @@ Vuoi davvero eliminare questo buono? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -527,7 +519,7 @@ Vuoi davvero svuotare la cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -535,7 +527,7 @@ Imposta il messaggio di sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -639,7 +631,7 @@ Vuoi davvero eliminare questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -715,7 +707,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -727,7 +719,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -775,7 +767,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -815,7 +807,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -859,7 +851,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -911,7 +903,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -923,7 +915,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -963,7 +955,7 @@ Inserisci l’importo del tuo fondo di emergenza: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -971,11 +963,11 @@ Settori apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -991,11 +983,11 @@ Paesi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1031,11 +1023,11 @@ Allocazione libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1051,7 +1043,7 @@ Mostra tutti libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -1063,7 +1055,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1071,11 +1063,11 @@ anno corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1083,11 +1075,11 @@ 1 anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1095,11 +1087,19 @@ 5 anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -1107,11 +1107,11 @@ Massimo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -1119,7 +1119,7 @@ Bene apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -1187,7 +1187,7 @@ Inserisci il tuo codice del buono: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -1195,7 +1195,7 @@ Impossibile riscattare il codice del buono apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -1203,7 +1203,7 @@ Il codice del buono è stato riscattato apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -1211,7 +1211,7 @@ Ricarica apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -1219,7 +1219,7 @@ Vuoi davvero rimuovere questo metodo di accesso? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -1239,7 +1239,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -1263,7 +1263,7 @@ Vista presentatore apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -1279,11 +1279,11 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -1291,7 +1291,7 @@ Formato data e numero apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -1299,7 +1299,7 @@ Modalità Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -1311,7 +1311,7 @@ Accesso con impronta digitale apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -1323,7 +1323,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1415,11 +1415,11 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1435,7 +1435,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1455,7 +1455,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -1471,7 +1471,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -1659,7 +1659,7 @@ Panoramica apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -1695,7 +1695,7 @@ Mercati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -1839,7 +1839,7 @@ Cronologia degli investimenti apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -1847,7 +1847,7 @@ In alto apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -1855,7 +1855,7 @@ In basso apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -1915,7 +1915,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1947,7 +1947,7 @@ Nome, simbolo o ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1979,7 +1979,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1999,7 +1999,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2023,7 +2023,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -2055,7 +2055,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -2131,7 +2131,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -2323,7 +2323,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -2463,7 +2463,7 @@ Settore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2475,7 +2475,7 @@ Paese apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -2555,7 +2555,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2611,7 +2611,7 @@ Filtra per... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -2639,7 +2639,7 @@ Funzionalità sperimentali apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2647,13 +2647,25 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 152 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Confronta con... @@ -2683,11 +2695,11 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2695,7 +2707,7 @@ Aspetto apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2703,7 +2715,7 @@ Chiaro apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2711,7 +2723,7 @@ Scuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2727,7 +2739,7 @@ Evoluzione del portafoglio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -2767,11 +2779,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2803,7 +2815,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3095,7 +3107,7 @@ Mappatura dei simboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -3103,7 +3115,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3131,7 +3143,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3143,7 +3155,7 @@ Cronologia dei dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3155,11 +3167,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3263,7 +3275,7 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3334,6 +3346,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satellite @@ -3347,7 +3367,7 @@ Protezione delle informazioni sensibili come le prestazioni assolute e i valori quantitativi apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -3355,7 +3375,7 @@ Esperienza priva di distrazioni per i periodi più turbolenti apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -3363,7 +3383,7 @@ Un’anteprima delle funzionalità in arrivo apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -3387,7 +3407,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -3403,7 +3423,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -3419,7 +3439,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -3435,7 +3455,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -3483,7 +3503,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -3567,7 +3587,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3583,7 +3603,19 @@ Pagamento una tantum, senza rinnovo automatico. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3591,7 +3623,7 @@ È gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -3623,7 +3655,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -3667,7 +3699,7 @@ Supporto via email e chat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3711,7 +3743,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -3735,7 +3767,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3799,7 +3831,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -3815,11 +3847,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3830,12 +3862,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Vuoi davvero eliminare questa piattaforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -3971,7 +4011,7 @@ Serie attuale apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -3979,7 +4019,7 @@ Serie più lunga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4023,7 +4063,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -4163,7 +4203,7 @@ Software open source apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -4187,7 +4227,7 @@ Configurazione dello scraper apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -4426,20 +4466,12 @@ 43 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETF senza paesi apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -4447,7 +4479,7 @@ ETF senza settori apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -4583,7 +4615,7 @@ Autenticazione biometrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4675,7 +4707,7 @@ Esporta dati apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4683,7 +4715,7 @@ Valute apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html @@ -4730,6 +4762,18 @@ 7 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Scopri gli ultimi aggiornamenti e approfondimenti di Ghostfolio sulla finanza personale @@ -5281,7 +5325,7 @@ Svizzera apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5293,7 +5337,7 @@ Globale apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5321,7 +5365,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5505,7 +5549,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5645,7 +5689,7 @@ Ops! Impossibile elaborare i dati storici. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5653,7 +5697,7 @@ Confermi di voler cancellare questo messaggio di sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5713,7 +5757,7 @@ L’attuale prezzo di mercato è apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5721,7 +5765,7 @@ Prova apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5809,15 +5853,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5825,7 +5869,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5841,7 +5885,7 @@ Rendimento assoluto dell’Asset apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5849,7 +5893,7 @@ Rendimento dell’Asset apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5857,7 +5901,7 @@ Rendimento assoluto della Valuta apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5865,7 +5909,7 @@ Rendimento della Valuta apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5873,7 +5917,7 @@ Da inizio settimana libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5881,11 +5925,11 @@ Settimana corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5893,7 +5937,7 @@ Da inizio mese libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5901,11 +5945,11 @@ Mese corrente apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5913,7 +5957,7 @@ Da inizio anno libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5949,7 +5993,7 @@ anno apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5961,7 +6005,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5969,11 +6013,11 @@ anni apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5989,7 +6033,7 @@ Raccolta Dati apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6166,7 +6210,7 @@ Confermi di voler chiudere il tuo account Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6174,7 +6218,7 @@ Zona di Pericolo apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6182,7 +6226,7 @@ Chiudi l’account apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6214,7 +6258,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6222,7 +6266,7 @@ Ops! C’è stato un errore impostando l’autenticazione biometrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6238,7 +6282,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6294,7 +6338,7 @@ Alternativa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6302,7 +6346,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6310,7 +6354,7 @@ Budgeting apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6326,47 +6370,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6374,7 +6422,7 @@ Ufficio familiare apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6382,7 +6430,7 @@ Investitore apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6394,7 +6442,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6406,7 +6454,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6414,7 +6462,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6422,7 +6470,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6430,7 +6478,7 @@ Strumento apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6438,7 +6486,7 @@ Esperienza Utente apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6446,7 +6494,7 @@ Ricchezza apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6454,7 +6502,7 @@ Gestione Patrimoniale apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6614,7 +6662,7 @@ Errore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6662,11 +6710,11 @@ Annulla apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6718,7 +6766,7 @@ Chiudi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6802,7 +6850,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6914,7 +6962,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7148,7 +7196,7 @@ Vuoi davvero eliminare l’API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7176,7 +7224,7 @@ Non è stato possibile generare un API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7184,7 +7232,7 @@ Imposta questa API key nel tuo ambiente self-hosted: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7192,7 +7240,7 @@ API Key for Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7200,7 +7248,7 @@ Vuoi davvero generare una nuova API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7240,7 +7288,7 @@ Salva apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7260,7 +7308,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7316,7 +7364,15 @@ Inserisci la tua API key di Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7324,7 +7380,7 @@ L’AI prompt è stato copiato negli appunti apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7332,7 +7388,7 @@ Il link è stato copiato negli appunti apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7340,7 +7396,7 @@ Pigro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7348,7 +7404,7 @@ Istantaneo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7356,7 +7412,7 @@ Prezzo di mercato predefinito apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7364,7 +7420,7 @@ Modalità apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7372,7 +7428,7 @@ Selettore apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7380,7 +7436,7 @@ Intestazioni della richiesta HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7388,7 +7444,7 @@ fine giornata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7396,7 +7452,7 @@ in tempo reale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7404,7 +7460,7 @@ Apri Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7420,7 +7476,7 @@ Cambia libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7440,7 +7496,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7475,6 +7531,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenia @@ -7544,7 +7608,7 @@ Token di sicurezza apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7556,7 +7620,7 @@ Vuoi davvero generare un nuovo token di sicurezza per questo utente? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7564,7 +7628,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7629,7 +7693,7 @@ () e gia in uso. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7637,7 +7701,7 @@ Si è verificato un errore durante l’aggiornamento di (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7645,7 +7709,7 @@ Applica apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7653,7 +7717,7 @@ con accesso API per apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7733,7 +7797,7 @@ Vuoi davvero eliminare questo elemento? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7774,7 +7838,7 @@ L’account utente demo è stato sincronizzato. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7952,7 +8016,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7964,7 +8028,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7988,7 +8052,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf new file mode 100644 index 000000000..67443706b --- /dev/null +++ b/apps/client/src/locales/messages.ko.xlf @@ -0,0 +1,8729 @@ + + + + + + about + about + kebab-case + + libs/common/src/lib/routes/routes.ts + 176 + + + libs/common/src/lib/routes/routes.ts + 177 + + + libs/common/src/lib/routes/routes.ts + 182 + + + libs/common/src/lib/routes/routes.ts + 190 + + + libs/common/src/lib/routes/routes.ts + 198 + + + libs/common/src/lib/routes/routes.ts + 206 + + + libs/common/src/lib/routes/routes.ts + 214 + + + + faq + faq + kebab-case + + libs/common/src/lib/routes/routes.ts + 234 + + + libs/common/src/lib/routes/routes.ts + 235 + + + libs/common/src/lib/routes/routes.ts + 239 + + + libs/common/src/lib/routes/routes.ts + 245 + + + + features + features + kebab-case + + libs/common/src/lib/routes/routes.ts + 254 + + + libs/common/src/lib/routes/routes.ts + 255 + + + + license + license + kebab-case + + libs/common/src/lib/routes/routes.ts + 188 + + + libs/common/src/lib/routes/routes.ts + 191 + + + + markets + markets + kebab-case + + libs/common/src/lib/routes/routes.ts + 259 + + + libs/common/src/lib/routes/routes.ts + 260 + + + + pricing + pricing + kebab-case + + libs/common/src/lib/routes/routes.ts + 269 + + + libs/common/src/lib/routes/routes.ts + 270 + + + + privacy-policy + privacy-policy + kebab-case + + libs/common/src/lib/routes/routes.ts + 204 + + + libs/common/src/lib/routes/routes.ts + 207 + + + + register + register + kebab-case + + libs/common/src/lib/routes/routes.ts + 279 + + + libs/common/src/lib/routes/routes.ts + 280 + + + + resources + resources + kebab-case + + libs/common/src/lib/routes/routes.ts + 284 + + + libs/common/src/lib/routes/routes.ts + 285 + + + libs/common/src/lib/routes/routes.ts + 290 + + + libs/common/src/lib/routes/routes.ts + 298 + + + libs/common/src/lib/routes/routes.ts + 306 + + + libs/common/src/lib/routes/routes.ts + 314 + + + libs/common/src/lib/routes/routes.ts + 322 + + + + You are using the Live Demo. + 현재 라이브 데모를 사용 중입니다. + + apps/client/src/app/app.component.html + 12 + + + + Create Account + 계정 생성 + + apps/client/src/app/app.component.html + 13 + + + apps/client/src/app/pages/register/register-page.html + 28 + + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 2 + + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 101 + + + + Frequently Asked Questions (FAQ) + 자주 묻는 질문 + + apps/client/src/app/pages/faq/overview/faq-overview-page.html + 5 + + + apps/client/src/app/pages/faq/saas/saas-page.html + 5 + + + apps/client/src/app/pages/faq/self-hosting/self-hosting-page.html + 5 + + + + The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. + 거래에는 상당한 손실 위험이 따를 수 있습니다. 단기적으로 필요할 수 있는 자금의 투자는 권장되지 않습니다. + + apps/client/src/app/components/footer/footer.component.html + 182 + + + + Alias + 별칭 + + apps/client/src/app/components/access-table/access-table.component.html + 4 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 17 + + + + Grantee + 권한 수신자 + + apps/client/src/app/components/access-table/access-table.component.html + 11 + + + + please + 부탁드립니다 + + apps/client/src/app/pages/pricing/pricing-page.html + 333 + + + + Type + 유형 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 48 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 28 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 15 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 163 + + + + Details + 상세 + + apps/client/src/app/components/access-table/access-table.component.html + 33 + + + + Revoke + 회수 + + apps/client/src/app/components/access-table/access-table.component.html + 96 + + + + with + 와(과) + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 87 + + + + Do you really want to revoke this granted access? + 이 부여된 접근 권한을 정말로 회수하시겠습니까? + + apps/client/src/app/components/access-table/access-table.component.ts + 113 + + + + Cash Balance + 현금 잔액 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 45 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 34 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 143 + + + + Platform + 플랫폼 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 90 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 48 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 93 + + + + Cash Balances + 현금 잔액 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 148 + + + + Transfer Cash Balance + 현금 잔액 이체 + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 7 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 10 + + + + Name + 이름 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 88 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 309 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 22 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 15 + + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 46 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 22 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 15 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 15 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 139 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 50 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 137 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 12 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 23 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 16 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 88 + + + + Total + 합계 + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 62 + + + + Currency + 통화 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 199 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 316 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 45 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 25 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 145 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 72 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 283 + + + + Value + 평가액 + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 53 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 205 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 208 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 211 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 34 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 178 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 213 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 264 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 300 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 93 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 25 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 102 + + + + Edit + 편집 + + apps/client/src/app/components/access-table/access-table.component.html + 76 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 267 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 74 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 67 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 320 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 457 + + + + Delete + 삭제 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 289 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 87 + + + apps/client/src/app/components/admin-overview/admin-overview.html + 131 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 85 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 78 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 80 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 331 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 484 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 176 + + + + Do you really want to delete this account? + 이 계정을 정말 삭제하시겠습니까? + + libs/ui/src/lib/accounts-table/accounts-table.component.ts + 150 + + + + Asset Profile + 자산 프로필 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 52 + + + + Historical Market Data + 과거 시장 데이터 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 54 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 448 + + + + Data Source + 데이터 소스 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 82 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 105 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 180 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 155 + + + libs/ui/src/lib/i18n.ts + 15 + + + + Attempts + 시도 횟수 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 120 + + + + Created + 생성됨 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 134 + + + + Finished + 완료됨 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 143 + + + + Status + 상태 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 152 + + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 92 + + + + and is driven by the efforts of its contributors + 기여자들의 노력으로 발전하고 있습니다 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 49 + + + + Delete Jobs + 작업 삭제 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 193 + + + + View Data + 데이터 보기 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 208 + + + + View Stacktrace + 스택트레이스 보기 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 216 + + + + Delete Job + 작업 삭제 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 224 + + + + Details for + 에 대한 세부정보 + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html + 2 + + + + Date + 날짜 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 161 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 12 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 172 + + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html + 6 + + + + Market Price + 시장 가격 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 132 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 113 + + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html + 26 + + + + Currencies + 통화 + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 131 + + + apps/client/src/app/pages/public/public-page.html + 96 + + + + ETFs without Countries + 국가 정보 없는 ETF + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 136 + + + + ETFs without Sectors + 섹터 정보 없는 ETF + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 141 + + + + Do you really want to delete this asset profile? + 이 자산 프로필을 정말 삭제하시겠습니까? + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 37 + + + + Filter by... + 다음 기준으로 필터... + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 385 + + + + First Activity + 첫 활동 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 147 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 217 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 219 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 45 + + + + Activities Count + 활동 수 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 156 + + + + Historical Data + 과거 데이터 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 165 + + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html + 44 + + + + Sectors Count + 섹터 수 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 174 + + + + Countries Count + 국가 수 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 183 + + + + Gather Recent Historical Market Data + 최근 과거 시장 데이터 수집 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 225 + + + + Gather All Historical Market Data + 전체 과거 시장 데이터 수집 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 230 + + + + Gather Profile Data + 프로필 데이터 수집 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 234 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 66 + + + + Oops! Could not parse historical data. + 이런! 과거 데이터를 파싱할 수 없습니다. + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts + 262 + + + + Refresh + 새로고침 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 21 + + + + Gather Historical Market Data + 과거 시장 데이터 수집 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 34 + + + + Import + 가져오기 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 155 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 190 + + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.html + 71 + + + + Sector + 섹터 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 262 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 268 + + + + Country + 국가 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 273 + + + apps/client/src/app/components/admin-users/admin-users.html + 60 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 278 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 53 + + + + Sectors + 섹터 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 279 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 396 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 284 + + + apps/client/src/app/pages/public/public-page.html + 114 + + + + Countries + 국가 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 289 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 407 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 296 + + + + Symbol Mapping + 심볼 매핑 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 384 + + + + and we share aggregated key metrics of the platform’s performance + 또한 플랫폼 성과에 대한 집계된 핵심 지표를 공유합니다 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 32 + + + + Scraper Configuration + 스크래퍼 설정 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 471 + + + + Note + 메모 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 432 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 78 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 275 + + + + Add Asset Profile + 자산 프로필 추가 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 7 + + + + Search + 검색 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 16 + + + + Add Manually + 수동 추가 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 18 + + + + Name, symbol or ISIN + 이름, 심볼 또는 ISIN + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 133 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 27 + + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 10 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 124 + + + + Do you really want to delete this coupon? + 이 쿠폰을 정말 삭제하시겠습니까? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 193 + + + + Do you really want to delete this system message? + 이 시스템 메시지를 정말 삭제하시겠습니까? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 206 + + + + Do you really want to flush the cache? + 정말로 캐시를 플러시하시겠습니까? + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 230 + + + + Please set your system message: + 시스템 메시지를 설정하십시오: + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 250 + + + + Version + 버전 + + apps/client/src/app/components/admin-overview/admin-overview.html + 7 + + + + User Count + 사용자 수 + + apps/client/src/app/components/admin-overview/admin-overview.html + 13 + + + + Activity Count + 활동 수 + + apps/client/src/app/components/admin-overview/admin-overview.html + 19 + + + + per User + 사용자당 + + apps/client/src/app/components/admin-overview/admin-overview.html + 28 + + + + Add Currency + 통화 추가 + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 20 + + + + User Signup + 사용자 가입 + + apps/client/src/app/components/admin-overview/admin-overview.html + 34 + + + + Read-only Mode + 읽기 전용 모드 + + apps/client/src/app/components/admin-overview/admin-overview.html + 48 + + + + System Message + 시스템 메시지 + + apps/client/src/app/components/admin-overview/admin-overview.html + 72 + + + + Set Message + 메시지 설정 + + apps/client/src/app/components/admin-overview/admin-overview.html + 94 + + + + Coupons + 쿠폰 + + apps/client/src/app/components/admin-overview/admin-overview.html + 102 + + + + Add + 추가 + + apps/client/src/app/components/admin-overview/admin-overview.html + 176 + + + libs/ui/src/lib/account-balances/account-balances.component.html + 93 + + + + Housekeeping + 유지 관리 + + apps/client/src/app/components/admin-overview/admin-overview.html + 184 + + + + Flush Cache + 캐시 플러시 + + apps/client/src/app/components/admin-overview/admin-overview.html + 200 + + + + Add Platform + 플랫폼 추가 + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 9 + + + + Url + 링크 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 419 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 550 + + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 38 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 25 + + + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + + + Do you really want to delete this platform? + 정말로 이 플랫폼을 삭제하시겠습니까? + + apps/client/src/app/components/admin-platform/admin-platform.component.ts + 106 + + + + By + 에 의해 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 139 + + + + Update platform + 플랫폼 업데이트 + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 8 + + + + Current year + 올해 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 199 + + + + Add platform + 플랫폼 추가 + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 10 + + + + Platforms + 플랫폼 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 195 + + + + Tags + 태그 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 201 + + + libs/ui/src/lib/tags-selector/tags-selector.component.html + 4 + + + libs/ui/src/lib/tags-selector/tags-selector.component.html + 16 + + + + Add Tag + 태그 추가 + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 9 + + + + Do you really want to delete this tag? + 이 태그를 정말로 삭제하시겠습니까? + + apps/client/src/app/components/admin-tag/admin-tag.component.ts + 103 + + + + Update tag + 태그 업데이트 + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 8 + + + + Add tag + 태그 추가 + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 10 + + + + Do you really want to delete this user? + 이 사용자를 정말로 삭제하시겠습니까? + + apps/client/src/app/components/admin-users/admin-users.component.ts + 215 + + + + User + 사용자 + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 31 + + + apps/client/src/app/components/admin-users/admin-users.html + 12 + + + apps/client/src/app/components/header/header.component.html + 231 + + + + No auto-renewal on membership. + 멤버십 자동 갱신은 없습니다. + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 74 + + + + Engagement per Day + 일일 참여 + + apps/client/src/app/components/admin-users/admin-users.html + 140 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 89 + + + + Last Request + 마지막 요청 + + apps/client/src/app/components/admin-users/admin-users.html + 186 + + + + Impersonate User + 사용자 대리 접속 + + apps/client/src/app/components/admin-users/admin-users.html + 233 + + + + Delete User + 사용자 삭제 + + apps/client/src/app/components/admin-users/admin-users.html + 254 + + + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + + + Compare with... + 비교해보세요... + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 18 + + + + Manage Benchmarks + 벤치마크 관리 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 35 + + + + Portfolio + 포트폴리오 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts + 140 + + + apps/client/src/app/components/header/header.component.html + 44 + + + apps/client/src/app/components/header/header.component.html + 258 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 95 + + + libs/common/src/lib/routes/routes.ts + 151 + + + + Benchmark + 기준 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 376 + + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts + 152 + + + + Current Market Mood + 현재 시장 분위기 + + apps/client/src/app/components/fear-and-greed-index/fear-and-greed-index.component.html + 12 + + + + About Ghostfolio + 고스트폴리오 소개 + + apps/client/src/app/components/header/header.component.html + 326 + + + apps/client/src/app/pages/about/overview/about-overview-page.html + 5 + + + + Sign in + 로그인 + + apps/client/src/app/components/header/header.component.html + 422 + + + apps/client/src/app/components/header/header.component.ts + 297 + + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 79 + + + libs/common/src/lib/routes/routes.ts + 81 + + + libs/common/src/lib/routes/routes.ts + 157 + + + + Oops! Incorrect Security Token. + 이런! 잘못된 보안 토큰. + + apps/client/src/app/components/header/header.component.ts + 312 + + + apps/client/src/app/components/user-account-access/user-account-access.component.ts + 154 + + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 193 + + + + Manage Activities + 활동 관리 + + apps/client/src/app/components/home-holdings/home-holdings.html + 67 + + + + Fear + 두려움 + + apps/client/src/app/components/home-market/home-market.component.ts + 42 + + + apps/client/src/app/components/markets/markets.component.ts + 47 + + + libs/ui/src/lib/i18n.ts + 108 + + + + Greed + 탐욕 + + apps/client/src/app/components/home-market/home-market.component.ts + 43 + + + apps/client/src/app/components/markets/markets.component.ts + 48 + + + libs/ui/src/lib/i18n.ts + 109 + + + + Last Days + 지난 + + apps/client/src/app/components/home-market/home-market.html + 7 + + + apps/client/src/app/components/markets/markets.html + 17 + + + + Welcome to Ghostfolio + Ghostfolio에 오신 것을 환영합니다 + + apps/client/src/app/components/home-overview/home-overview.html + 11 + + + + Ready to take control of your personal finances? + 개인 재정을 관리할 준비가 되셨나요? + + apps/client/src/app/components/home-overview/home-overview.html + 12 + + + + The source code is fully available as open source software (OSS) under the AGPL-3.0 license + 소스 코드는 오픈 소스 소프트웨어로 완전히 공개되어 있으며, AGPL-3.0 라이선스 하에 제공됩니다 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 16 + + + + Setup your accounts + 계정 설정 + + apps/client/src/app/components/home-overview/home-overview.html + 19 + + + + Get a comprehensive financial overview by adding your bank and brokerage accounts. + 은행 및 중개 계좌를 추가하여 포괄적인 재무 개요를 확인하세요. + + apps/client/src/app/components/home-overview/home-overview.html + 21 + + + + Capture your activities + 활동을 캡처하세요 + + apps/client/src/app/components/home-overview/home-overview.html + 28 + + + + Record your investment activities to keep your portfolio up to date. + 투자 활동을 기록하여 포트폴리오를 최신 상태로 유지하세요. + + apps/client/src/app/components/home-overview/home-overview.html + 30 + + + + Monitor and analyze your portfolio + 포트폴리오를 모니터링하고 분석하세요. + + apps/client/src/app/components/home-overview/home-overview.html + 37 + + + + Track your progress in real-time with comprehensive analysis and insights. + 포괄적인 분석과 통찰력을 통해 진행 상황을 실시간으로 추적하세요. + + apps/client/src/app/components/home-overview/home-overview.html + 39 + + + + Setup accounts + 계정 설정 + + apps/client/src/app/components/home-overview/home-overview.html + 52 + + + + Current week + 이번주 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 191 + + + + Add activity + 활동 추가 + + apps/client/src/app/components/home-overview/home-overview.html + 60 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 8 + + + + Total Amount + 총액 + + apps/client/src/app/components/investment-chart/investment-chart.component.ts + 143 + + + + Savings Rate + 저축률 + + apps/client/src/app/components/investment-chart/investment-chart.component.ts + 202 + + + + Security Token + 보안 토큰 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 8 + + + apps/client/src/app/components/user-account-access/user-account-access.html + 3 + + + apps/client/src/app/components/user-account-access/user-account-access.html + 15 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 288 + + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 64 + + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 72 + + + + or + 또는 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 30 + + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 32 + + + apps/client/src/app/pages/landing/landing-page.html + 47 + + + apps/client/src/app/pages/landing/landing-page.html + 348 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 97 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 83 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 161 + + + apps/client/src/app/pages/pricing/pricing-page.html + 326 + + + apps/client/src/app/pages/register/register-page.html + 33 + + + apps/client/src/app/pages/webauthn/webauthn-page.html + 30 + + + + Sign in with Google + 구글로 로그인 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 44 + + + + Stay signed in + 로그인 상태 유지 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 66 + + + + Time in Market + 시장 참여 기간 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 3 + + + + Absolute Gross Performance + 절대 총 성과 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 73 + + + + Fees + 수수료 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 208 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 88 + + + + Absolute Net Performance + 절대 순 성과 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 107 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 259 + + + + Net Performance + 순 성과 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 123 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 278 + + + + Total Assets + 총자산 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 149 + + + + Assets + 자산 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 226 + + + + Buying Power + 매수 가능 금액 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 241 + + + + Excluded from Analysis + 분석에서 제외됨 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 267 + + + + Liabilities + 부채 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 295 + + + apps/client/src/app/pages/features/features-page.html + 102 + + + + Net Worth + 순자산 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 317 + + + + Annualized Performance + 연환산 성과 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 331 + + + + Please set the amount of your emergency fund. + 비상금 금액을 설정해 주세요. + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts + 111 + + + + Minimum Price + 최저가 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 130 + + + + Maximum Price + 최고가 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 147 + + + + Quantity + 수량 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 157 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 189 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 193 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 69 + + + + Report Data Glitch + 데이터 결함 보고 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 451 + + + + Are you an ambitious investor who needs the full picture? + 당신은 전체 그림이 필요한 야심찬 투자자이신가요? + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 15 + + + + Upgrade to Ghostfolio Premium today and gain access to exclusive features to enhance your investment experience: + 지금 Ghostfolio 프리미엄으로 업그레이드하고, 투자 경험을 향상시키는 독점 기능을 이용하세요: + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 18 + + + + Portfolio Summary + 포트폴리오 요약 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 24 + + + apps/client/src/app/pages/pricing/pricing-page.html + 47 + + + apps/client/src/app/pages/pricing/pricing-page.html + 204 + + + + Portfolio Allocations + 포트폴리오 자산배분 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 28 + + + apps/client/src/app/pages/features/features-page.html + 161 + + + apps/client/src/app/pages/pricing/pricing-page.html + 51 + + + apps/client/src/app/pages/pricing/pricing-page.html + 208 + + + + Performance Benchmarks + 성과 벤치마크 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 32 + + + apps/client/src/app/pages/pricing/pricing-page.html + 55 + + + apps/client/src/app/pages/pricing/pricing-page.html + 212 + + + + FIRE Calculator + 파이어(FIRE) 계산기 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 36 + + + apps/client/src/app/pages/pricing/pricing-page.html + 59 + + + apps/client/src/app/pages/pricing/pricing-page.html + 216 + + + + Professional Data Provider + 전문 데이터 제공자 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 40 + + + apps/client/src/app/pages/pricing/pricing-page.html + 220 + + + + and more Features... + 그리고 더 많은 기능... + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 44 + + + apps/client/src/app/pages/pricing/pricing-page.html + 75 + + + apps/client/src/app/pages/pricing/pricing-page.html + 243 + + + + Get the tools to effectively manage your finances and refine your personal investment strategy. + 재무를 효율적으로 관리하고 개인 투자 전략을 고도화할 수 있는 도구를 제공합니다. + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 48 + + + + Skip + 건너뛰다 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 59 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 99 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 141 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 181 + + + + Upgrade Plan + 업그레이드 계획 + + apps/client/src/app/components/header/header.component.html + 193 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 70 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 110 + + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 153 + + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 21 + + + apps/client/src/app/pages/pricing/pricing-page.html + 281 + + + + Today + 오늘 + + apps/client/src/app/pages/public/public-page.html + 24 + + + libs/ui/src/lib/assistant/assistant.component.ts + 363 + + + + YTD + 연초 대비 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 199 + + + libs/ui/src/lib/assistant/assistant.component.ts + 375 + + + + 1Y + 1년 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 203 + + + libs/ui/src/lib/assistant/assistant.component.ts + 385 + + + + 5Y + 5년 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 207 + + + libs/ui/src/lib/assistant/assistant.component.ts + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 + + + + Max + 맥스 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 211 + + + libs/ui/src/lib/assistant/assistant.component.ts + 415 + + + + Grant access + 액세스 권한 부여 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 9 + + + + Public + 공공의 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 31 + + + + Granted Access + 액세스 권한 부여 + + apps/client/src/app/components/user-account-access/user-account-access.html + 57 + + + + Please enter your coupon code. + 쿠폰 코드를 입력해주세요. + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 210 + + + + Could not redeem coupon code + 쿠폰 코드를 사용할 수 없습니다. + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 174 + + + + Coupon code has been redeemed + 쿠폰 코드가 사용되었습니다. + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 187 + + + + Reload + 새로고침 + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 188 + + + + per year + 연간 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 33 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 80 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 158 + + + apps/client/src/app/pages/pricing/pricing-page.html + 265 + + + + Try Premium + 프리미엄을 사용해 보세요 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 53 + + + + Redeem Coupon + 쿠폰 사용 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 67 + + + + Auto + 자동 + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 70 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 181 + + + + Do you really want to remove this sign in method? + 이 로그인 방법을 정말로 제거하시겠습니까? + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 282 + + + + Presenter View + 발표자 보기 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 192 + + + + Protection for sensitive information like absolute performances and quantity values + 절대 성과 및 수량 값과 같은 민감한 정보를 보호합니다. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 194 + + + + Base Currency + 기본 통화 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 9 + + + + Language + 언어 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 56 + + + + Locale + 장소 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 509 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 142 + + + + Date and number format + 날짜 및 숫자 형식 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 144 + + + + Appearance + 테마 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 167 + + + + Light + 라이트 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 182 + + + + Dark + 다크 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 183 + + + + Zen Mode + 프라이버시 모드 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 210 + + + apps/client/src/app/pages/features/features-page.html + 246 + + + + Distraction-free experience for turbulent times + 격동의 시대에 방해받지 않는 경험 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 212 + + + + this is projected to increase to + 이는 다음과 같이 증가할 것으로 예상된다. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 147 + + + + Biometric Authentication + 생체인증 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 227 + + + + Sign in with fingerprint + 지문으로 로그인 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 228 + + + + Experimental Features + 실험적 기능 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 244 + + + + Sneak peek at upcoming functionality + 곧 출시될 기능 미리보기 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 246 + + + + User ID + 사용자 ID + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 51 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 261 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 11 + + + + Export Data + 데이터 내보내기 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 269 + + + + This feature is currently unavailable. + 이 기능은 현재 사용할 수 없습니다. + + apps/client/src/app/core/http-response.interceptor.ts + 55 + + + + Please try again later. + 나중에 다시 시도해 주세요. + + apps/client/src/app/core/http-response.interceptor.ts + 57 + + + apps/client/src/app/core/http-response.interceptor.ts + 88 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 195 + + + + Oops! Something went wrong. + 이런! 문제가 발생했습니다. + + apps/client/src/app/core/http-response.interceptor.ts + 86 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 193 + + + + Okay + 좋아요 + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 149 + + + apps/client/src/app/core/http-response.interceptor.ts + 89 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 196 + + + + About + 소개 + + apps/client/src/app/components/footer/footer.component.html + 20 + + + apps/client/src/app/components/header/header.component.html + 124 + + + apps/client/src/app/components/header/header.component.html + 375 + + + apps/client/src/app/pages/about/overview/about-overview-page.routes.ts + 12 + + + libs/common/src/lib/routes/routes.ts + 220 + + + + Changelog + 변경 내역 + + apps/client/src/app/components/footer/footer.component.html + 27 + + + apps/client/src/app/pages/about/changelog/changelog-page.html + 4 + + + libs/common/src/lib/routes/routes.ts + 185 + + + + License + 특허 + + apps/client/src/app/components/footer/footer.component.html + 39 + + + apps/client/src/app/pages/about/license/license-page.html + 4 + + + libs/common/src/lib/routes/routes.ts + 193 + + + + Privacy Policy + 개인 정보 보호 정책 + + apps/client/src/app/components/footer/footer.component.html + 55 + + + apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html + 4 + + + libs/common/src/lib/routes/routes.ts + 209 + + + + Our + 우리의 + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 6 + + + + Discover other exciting Open Source Software projects + 다른 흥미로운 오픈 소스 소프트웨어 프로젝트를 찾아보세요 + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 9 + + + + Visit + 방문하다 + + apps/client/src/app/pages/about/oss-friends/oss-friends-page.html + 28 + + + + for + ~을 위한 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 128 + + + + Accounts + 계정 + + apps/client/src/app/components/admin-platform/admin-platform.component.html + 52 + + + apps/client/src/app/components/admin-users/admin-users.html + 97 + + + apps/client/src/app/components/header/header.component.html + 58 + + + apps/client/src/app/components/header/header.component.html + 268 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 375 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 66 + + + apps/client/src/app/pages/accounts/accounts-page.html + 4 + + + libs/common/src/lib/routes/routes.ts + 69 + + + libs/ui/src/lib/assistant/assistant.html + 84 + + + + Oops, cash balance transfer has failed. + 죄송합니다. 현금 잔액 이체가 실패했습니다. + + apps/client/src/app/pages/accounts/accounts-page.component.ts + 341 + + + + Update account + 계정 업데이트 + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 8 + + + + Add account + 계정 추가 + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 10 + + + + Account ID + 계정 ID + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 96 + + + + From + 에서 + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 11 + + + + To + 에게 + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 32 + + + + Transfer + 옮기다 + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 72 + + + + Admin Control + 관리자 제어 + + apps/client/src/app/components/header/header.component.html + 74 + + + apps/client/src/app/components/header/header.component.html + 289 + + + libs/common/src/lib/routes/routes.ts + 64 + + + + Market Data + 시장 데이터 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 398 + + + libs/common/src/lib/routes/routes.ts + 51 + + + + Settings + 설정 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 2 + + + libs/common/src/lib/routes/routes.ts + 34 + + + libs/common/src/lib/routes/routes.ts + 56 + + + + Users + 사용자 + + libs/common/src/lib/routes/routes.ts + 61 + + + + Overview + 개요 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 114 + + + apps/client/src/app/components/header/header.component.html + 30 + + + apps/client/src/app/components/header/header.component.html + 248 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 47 + + + apps/client/src/app/pages/admin/admin-page.component.ts + 48 + + + apps/client/src/app/pages/resources/resources-page.component.ts + 30 + + + libs/common/src/lib/routes/routes.ts + 113 + + + libs/common/src/lib/routes/routes.ts + 170 + + + + Blog + 블로그 + + apps/client/src/app/components/footer/footer.component.html + 24 + + + apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html + 205 + + + apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html + 185 + + + apps/client/src/app/pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.html + 185 + + + apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html + 185 + + + apps/client/src/app/pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.html + 210 + + + apps/client/src/app/pages/blog/2022/08/500-stars-on-github/500-stars-on-github-page.html + 197 + + + apps/client/src/app/pages/blog/2022/10/hacktoberfest-2022/hacktoberfest-2022-page.html + 182 + + + apps/client/src/app/pages/blog/2022/11/black-friday-2022/black-friday-2022-page.html + 142 + + + apps/client/src/app/pages/blog/2022/12/the-importance-of-tracking-your-personal-finances/the-importance-of-tracking-your-personal-finances-page.html + 169 + + + apps/client/src/app/pages/blog/2023/01/ghostfolio-auf-sackgeld-vorgestellt/ghostfolio-auf-sackgeld-vorgestellt-page.html + 179 + + + apps/client/src/app/pages/blog/2023/02/ghostfolio-meets-umbrel/ghostfolio-meets-umbrel-page.html + 203 + + + apps/client/src/app/pages/blog/2023/03/1000-stars-on-github/1000-stars-on-github-page.html + 254 + + + apps/client/src/app/pages/blog/2023/05/unlock-your-financial-potential-with-ghostfolio/unlock-your-financial-potential-with-ghostfolio-page.html + 234 + + + apps/client/src/app/pages/blog/2023/07/exploring-the-path-to-fire/exploring-the-path-to-fire-page.html + 244 + + + apps/client/src/app/pages/blog/2023/08/ghostfolio-joins-oss-friends/ghostfolio-joins-oss-friends-page.html + 155 + + + apps/client/src/app/pages/blog/2023/09/ghostfolio-2/ghostfolio-2-page.html + 274 + + + apps/client/src/app/pages/blog/2023/09/hacktoberfest-2023/hacktoberfest-2023-page.html + 184 + + + apps/client/src/app/pages/blog/2023/11/black-week-2023/black-week-2023-page.html + 149 + + + apps/client/src/app/pages/blog/2023/11/hacktoberfest-2023-debriefing/hacktoberfest-2023-debriefing-page.html + 271 + + + apps/client/src/app/pages/blog/2024/09/hacktoberfest-2024/hacktoberfest-2024-page.html + 190 + + + apps/client/src/app/pages/blog/2024/11/black-weeks-2024/black-weeks-2024-page.html + 168 + + + apps/client/src/app/pages/blog/2025/09/hacktoberfest-2025/hacktoberfest-2025-page.html + 189 + + + apps/client/src/app/pages/blog/2025/11/black-weeks-2025/black-weeks-2025-page.html + 147 + + + apps/client/src/app/pages/blog/blog-page.html + 5 + + + libs/common/src/lib/routes/routes.ts + 225 + + + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + + + Discover the latest Ghostfolio updates and insights on personal finance + 개인 금융에 대한 최신 Ghostfolio 업데이트와 통찰력을 알아보세요 + + apps/client/src/app/pages/blog/blog-page.html + 7 + + + + As you are already logged in, you cannot access the demo account. + 이미 로그인되어 있으므로 데모 계정에 접근할 수 없습니다. + + apps/client/src/app/pages/demo/demo-page.component.ts + 35 + + + + Frequently Asked Questions (FAQ) + 자주 묻는 질문 + + apps/client/src/app/components/footer/footer.component.html + 33 + + + apps/client/src/app/pages/about/overview/about-overview-page.html + 189 + + + apps/client/src/app/pages/faq/overview/faq-overview-page.routes.ts + 12 + + + libs/common/src/lib/routes/routes.ts + 251 + + + + Features + 특징 + + apps/client/src/app/components/footer/footer.component.html + 29 + + + apps/client/src/app/components/header/header.component.html + 361 + + + apps/client/src/app/pages/features/features-page.html + 5 + + + libs/common/src/lib/routes/routes.ts + 256 + + + + Check out the numerous features of Ghostfolio to manage your wealth + 자산 관리를 위한 Ghostfolio의 다양한 기능을 확인해보세요 + + apps/client/src/app/pages/features/features-page.html + 7 + + + + ETFs + ETF + + apps/client/src/app/pages/features/features-page.html + 25 + + + + Bonds + 채권 + + apps/client/src/app/pages/features/features-page.html + 38 + + + + Wealth Items + 자산 항목 + + apps/client/src/app/pages/features/features-page.html + 76 + + + + Import and Export + 가져오기 및 내보내기 + + apps/client/src/app/pages/features/features-page.html + 116 + + + + Multi-Accounts + 다중 계정 + + apps/client/src/app/pages/features/features-page.html + 127 + + + + Portfolio Calculations + 포트폴리오 계산 + + apps/client/src/app/pages/features/features-page.html + 141 + + + + Dark Mode + 다크 모드 + + apps/client/src/app/pages/features/features-page.html + 233 + + + + Market Mood + 시장 분위기 + + apps/client/src/app/pages/features/features-page.html + 215 + + + + Static Analysis + 정적 분석 + + apps/client/src/app/pages/features/features-page.html + 179 + + + + Multi-Language + 다국어 + + apps/client/src/app/pages/features/features-page.html + 259 + + + + per week + 주당 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 130 + + + + Open Source Software + 오픈 소스 소프트웨어 + + apps/client/src/app/pages/features/features-page.html + 296 + + + + Get Started + 시작하기 + + apps/client/src/app/components/header/header.component.html + 433 + + + apps/client/src/app/pages/features/features-page.html + 321 + + + apps/client/src/app/pages/landing/landing-page.html + 41 + + + apps/client/src/app/pages/landing/landing-page.html + 344 + + + apps/client/src/app/pages/pricing/pricing-page.html + 360 + + + apps/client/src/app/pages/public/public-page.html + 242 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 334 + + + + Holdings + 보유 종목 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 102 + + + apps/client/src/app/components/home-holdings/home-holdings.html + 4 + + + apps/client/src/app/pages/public/public-page.html + 70 + + + libs/common/src/lib/routes/routes.ts + 90 + + + libs/common/src/lib/routes/routes.ts + 167 + + + libs/ui/src/lib/assistant/assistant.html + 110 + + + + Summary + 요약 + + apps/client/src/app/components/home-summary/home-summary.html + 2 + + + libs/common/src/lib/routes/routes.ts + 105 + + + + Markets + 시장 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 378 + + + apps/client/src/app/components/footer/footer.component.html + 11 + + + apps/client/src/app/components/header/header.component.html + 408 + + + apps/client/src/app/components/home-market/home-market.html + 2 + + + apps/client/src/app/components/markets/markets.html + 2 + + + apps/client/src/app/pages/resources/markets/resources-markets.component.html + 2 + + + apps/client/src/app/pages/resources/resources-page.component.ts + 40 + + + libs/common/src/lib/routes/routes.ts + 95 + + + libs/common/src/lib/routes/routes.ts + 100 + + + libs/common/src/lib/routes/routes.ts + 261 + + + libs/common/src/lib/routes/routes.ts + 309 + + + + Ghostfolio is a personal finance dashboard to keep track of your net worth including cash, stocks, ETFs and cryptocurrencies across multiple platforms. + Ghostfolio는 여러 플랫폼에 분산된 현금, 주식, ETF, 암호화폐를 포함한 순자산을 추적할 수 있는 개인 재무 대시보드입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 5 + + + + app, asset, cryptocurrency, dashboard, etf, finance, management, performance, portfolio, software, stock, trading, wealth, web3 + 앱, 자산, 암호화폐, 대시보드, ETF, 금융, 관리, 성과, 포트폴리오, 소프트웨어, 주식, 트레이딩, 자산관리, 웹3 + + apps/client/src/app/pages/i18n/i18n-page.html + 10 + + + + Open Source Wealth Management Software + 오픈 소스 자산관리 소프트웨어 + + apps/client/src/app/pages/i18n/i18n-page.html + 237 + + + + Manage your wealth like a boss + 전문가처럼 자산을 관리하세요 + + apps/client/src/app/pages/landing/landing-page.html + 6 + + + + Ghostfolio is a privacy-first, open source dashboard for your personal finances. Break down your asset allocation, know your net worth and make solid, data-driven investment decisions. + Ghostfolio는 프라이버시를 최우선으로 하는 오픈 소스 개인 재무 대시보드입니다. 자산배분을 분석하고 순자산을 파악하여, 데이터 기반의 합리적인 투자 의사결정을 내리세요. + + apps/client/src/app/pages/landing/landing-page.html + 10 + + + + Edit access + 접근 권한 편집 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 11 + + + + Monthly Active Users + 월간 활성 사용자 + + apps/client/src/app/pages/landing/landing-page.html + 69 + + + + Stars on GitHub + 깃허브 스타 + + apps/client/src/app/pages/landing/landing-page.html + 87 + + + apps/client/src/app/pages/open/open-page.html + 103 + + + + Pulls on Docker Hub + 도커 허브에서 가져오기 + + apps/client/src/app/pages/landing/landing-page.html + 105 + + + apps/client/src/app/pages/open/open-page.html + 117 + + + + As seen in + 에서 볼 수 있듯이 + + apps/client/src/app/pages/landing/landing-page.html + 114 + + + + Protect your assets. Refine your personal investment strategy. + 자산을 보호하세요. 개인 투자 전략을 정교화하세요. + + apps/client/src/app/pages/landing/landing-page.html + 124 + + + + Ghostfolio empowers busy people to keep track of stocks, ETFs or cryptocurrencies without being tracked. + Ghostfolio는 바쁜 사람들이 추적당하지 않으면서도 주식, ETF, 암호화폐를 손쉽게 추적할 수 있도록 돕습니다. + + apps/client/src/app/pages/landing/landing-page.html + 128 + + + + 360° View + 360° 보기 + + apps/client/src/app/pages/landing/landing-page.html + 138 + + + + Get the full picture of your personal finances across multiple platforms. + 여러 플랫폼에 걸쳐 개인 재정에 대한 전체 그림을 얻으세요. + + apps/client/src/app/pages/landing/landing-page.html + 141 + + + + Web3 Ready + 웹3 준비 + + apps/client/src/app/pages/landing/landing-page.html + 149 + + + + Use Ghostfolio anonymously and own your financial data. + 익명으로 Ghostfolio를 사용하고 금융 데이터를 소유하세요. + + apps/client/src/app/pages/landing/landing-page.html + 152 + + + + Benefit from continuous improvements through a strong community. + 강력한 커뮤니티를 통해 지속적인 개선의 혜택을 누리세요. + + apps/client/src/app/pages/landing/landing-page.html + 162 + + + + Get access to 80’000+ tickers from over 50 exchanges + 50개 이상의 거래소에서 80,000개 이상의 티커에 접근하세요 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 84 + + + + Why Ghostfolio? + Ghostfolio인가요? + + apps/client/src/app/pages/landing/landing-page.html + 170 + + + + Ghostfolio is for you if you are... + Ghostfolio는 당신을 위한 것입니다... + + apps/client/src/app/pages/landing/landing-page.html + 172 + + + + trading stocks, ETFs or cryptocurrencies on multiple platforms + 여러 플랫폼에서 주식, ETF 또는 암호화폐 거래 + + apps/client/src/app/pages/landing/landing-page.html + 178 + + + + pursuing a buy & hold strategy + 매수 후 보유 전략을 추구 + + apps/client/src/app/pages/landing/landing-page.html + 184 + + + + interested in getting insights of your portfolio composition + 포트폴리오 구성에 대한 인사이트가 필요하신가요 + + apps/client/src/app/pages/landing/landing-page.html + 189 + + + + valuing privacy and data ownership + 개인 정보 보호 및 데이터 소유권을 소중히 여깁니다. + + apps/client/src/app/pages/landing/landing-page.html + 194 + + + + into minimalism + 미니멀리즘으로 + + apps/client/src/app/pages/landing/landing-page.html + 197 + + + + caring about diversifying your financial resources + 재정 자원을 다양화하는 데 관심을 가짐 + + apps/client/src/app/pages/landing/landing-page.html + 201 + + + + interested in financial independence + 재정적 독립에 관심 + + apps/client/src/app/pages/landing/landing-page.html + 205 + + + + saying no to spreadsheets in + 의 스프레드시트에 거부 의사 표시 + + apps/client/src/app/pages/landing/landing-page.html + 209 + + + + still reading this list + 아직도 이 목록을 읽고 있어요 + + apps/client/src/app/pages/landing/landing-page.html + 212 + + + + Learn more about Ghostfolio + Ghostfolio에 대해 자세히 알아보기 + + apps/client/src/app/pages/landing/landing-page.html + 217 + + + + What our users are saying + 사용자의 이야기 + + apps/client/src/app/pages/landing/landing-page.html + 226 + + + + Members from around the globe are using Ghostfolio Premium + 전 세계의 사용자들이 Ghostfolio 프리미엄을 사용하고 있습니다 + + apps/client/src/app/pages/landing/landing-page.html + 265 + + + + How does Ghostfolio work? + Ghostfolio는 어떻게 동작하나요? + + apps/client/src/app/pages/landing/landing-page.html + 282 + + + + Get started in only 3 steps + 단 3단계만으로 시작하세요 + + apps/client/src/app/pages/landing/landing-page.html + 284 + + + + less than + 미만 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 129 + + + + Sign up anonymously* + 익명으로 가입* + + apps/client/src/app/pages/landing/landing-page.html + 290 + + + + * no e-mail address nor credit card required + * 이메일 주소 및 신용카드 정보가 필요하지 않습니다 + + apps/client/src/app/pages/landing/landing-page.html + 292 + + + + Add any of your historical transactions + 과거 거래를 추가하세요. + + apps/client/src/app/pages/landing/landing-page.html + 304 + + + + Get valuable insights of your portfolio composition + 포트폴리오 구성에 대한 유의미한 인사이트를 확인하세요 + + apps/client/src/app/pages/landing/landing-page.html + 316 + + + + Are you ready? + 준비되셨나요? + + apps/client/src/app/pages/landing/landing-page.html + 330 + + + + At Ghostfolio, transparency is at the core of our values. We publish the source code as open source software (OSS) under the AGPL-3.0 license and we openly share aggregated key metrics of the platform’s operational status. + Ghostfolio는 투명성을 핵심 가치로 삼습니다. 우리는 소스 코드를 오픈 소스 소프트웨어로 공개하며, AGPL-3.0 라이선스 하에 배포합니다. 또한 플랫폼 운영 현황에 대한 집계된 핵심 지표를 공개적으로 공유합니다. + + apps/client/src/app/pages/open/open-page.html + 7 + + + + (Last 24 hours) + (지난 24시간) + + apps/client/src/app/pages/open/open-page.html + 37 + + + + Ghostfolio Status + 고스트폴리오 상태 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 62 + + + + with your university e-mail address + 대학 이메일 주소로 + + apps/client/src/app/pages/pricing/pricing-page.html + 348 + + + + Active Users + 활성 사용자 + + apps/client/src/app/pages/open/open-page.html + 40 + + + apps/client/src/app/pages/open/open-page.html + 62 + + + + (Last 30 days) + (지난 30일) + + apps/client/src/app/pages/open/open-page.html + 48 + + + apps/client/src/app/pages/open/open-page.html + 59 + + + + and a safe withdrawal rate (SWR) of + 안전 인출률(SWR)은 다음과 같습니다. + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 108 + + + + New Users + 신규 사용자 + + apps/client/src/app/pages/open/open-page.html + 51 + + + + Users in Slack community + 슬랙 커뮤니티의 사용자 + + apps/client/src/app/pages/open/open-page.html + 75 + + + + Job ID + 작업 ID + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 34 + + + + Contributors on GitHub + 깃허브의 기여자 + + apps/client/src/app/pages/open/open-page.html + 89 + + + + (Last 90 days) + (지난 90일) + + apps/client/src/app/pages/open/open-page.html + 127 + + + + Uptime + 가동 시간 + + apps/client/src/app/pages/open/open-page.html + 132 + + + + Activities + 활동 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 86 + + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 115 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 226 + + + apps/client/src/app/components/admin-tag/admin-tag.component.html + 45 + + + apps/client/src/app/components/admin-users/admin-users.html + 118 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 231 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 342 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 75 + + + apps/client/src/app/pages/portfolio/activities/activities-page.html + 4 + + + libs/common/src/lib/routes/routes.ts + 128 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 126 + + + + Do you really want to delete these activities? + 정말로 이 활동을 삭제하시겠습니까? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 278 + + + + Update activity + 활동 업데이트 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 10 + + + + Stocks, ETFs, bonds, cryptocurrencies, commodities + 주식, ETF, 채권, 암호화폐, 원자재 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 25 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 65 + + + + One-time fee, annual account fees + 일회성 수수료, 연간 계정 수수료 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 33 + + + + Distribution of corporate earnings + 기업 수익 분배 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 41 + + + + Revenue for lending out money + 이자 수익 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 49 + + + + Mortgages, personal loans, credit cards + 모기지, 개인 대출, 신용카드 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 57 + + + + Luxury items, real estate, private companies + 명품, 부동산, 민간 기업 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 73 + + + + Update Cash Balance + 현금 잔액 업데이트 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 112 + + + + Unit Price + 단가 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 214 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 217 + + + + Import Activities + 활동 가져오기 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 92 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 9 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 383 + + + + Import Dividends + 배당금 가져오기 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 137 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 29 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 397 + + + + Importing data... + 데이터 가져오는 중... + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 175 + + + + Import has been completed + 가져오기가 완료되었습니다. + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 185 + + + + or start a discussion at + 또는 다음에서 토론을 시작하세요. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 94 + + + + Validating data... + 데이터 유효성을 검사하는 중... + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts + 299 + + + + Select Holding + 보유 종목 선택 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 19 + + + + Select File + 파일 선택 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 21 + + + + Holding + 보유 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 32 + + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 26 + + + + Load Dividends + 배당금 불러오기 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 68 + + + + Choose or drop a file here + 여기에 파일을 선택하거나 드롭하세요. + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 84 + + + + The following file formats are supported: + 다음 파일 형식이 지원됩니다. + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 90 + + + + Select Dividends + 배당금 선택 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 113 + + + + Select Activities + 활동 선택 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 115 + + + + Back + 뒤쪽에 + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 146 + + + apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.html + 182 + + + + Allocations + 할당 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 4 + + + apps/client/src/app/pages/portfolio/allocations/allocations-page.routes.ts + 12 + + + libs/common/src/lib/routes/routes.ts + 133 + + + + Proportion of Net Worth + 순자산 비율 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 12 + + + + By Platform + 플랫폼별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 44 + + + + By Currency + 통화별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 63 + + + + By Asset Class + 자산 클래스별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 85 + + + + By Holding + 보유 종목별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 107 + + + + By Sector + 부문별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 130 + + + + By Continent + 대륙별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 153 + + + + By Market + 시장별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 175 + + + + Regions + 지역 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 198 + + + apps/client/src/app/pages/public/public-page.html + 151 + + + + Exclude from Analysis + 분석에서 제외 + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 90 + + + libs/ui/src/lib/i18n.ts + 17 + + + + Developed Markets + 선진시장 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 222 + + + apps/client/src/app/pages/public/public-page.html + 168 + + + + Latest activities + 최신 활동 + + apps/client/src/app/pages/public/public-page.html + 211 + + + + Emerging Markets + 신흥시장 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 231 + + + apps/client/src/app/pages/public/public-page.html + 177 + + + + Other Markets + 기타 시장 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 240 + + + apps/client/src/app/pages/public/public-page.html + 186 + + + + By Account + 계정별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 286 + + + + By ETF Provider + ETF 제공자별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 306 + + + + By Country + 국가별 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 264 + + + + Analysis + 분석 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 2 + + + libs/common/src/lib/routes/routes.ts + 138 + + + + Looking for a student discount? + 학생 할인을 찾고 계십니까? + + apps/client/src/app/pages/pricing/pricing-page.html + 342 + + + + Dividend + 배당금 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 81 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 186 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 365 + + + apps/client/src/app/pages/features/features-page.html + 63 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 202 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 76 + + + libs/ui/src/lib/i18n.ts + 38 + + + + annual interest rate + 연간 이자율 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 185 + + + + Deposit + 보증금 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 377 + + + + Monthly + 월간 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 91 + + + + Yearly + 매년 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 92 + + + + Top + 상위 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 305 + + + + Bottom + 하위 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 354 + + + + Portfolio Evolution + 포트폴리오 진화 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 407 + + + + Investment Timeline + 투자 일정 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 434 + + + + Current Streak + 현재 연속 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 455 + + + + Longest Streak + 최장 연속 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 464 + + + + Dividend Timeline + 배당 일정 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 491 + + + + FIRE + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 4 + + + + Calculator + 계산자 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 7 + + + + Pricing + 가격 + + apps/client/src/app/components/footer/footer.component.html + 49 + + + apps/client/src/app/components/header/header.component.html + 105 + + + apps/client/src/app/components/header/header.component.html + 313 + + + apps/client/src/app/components/header/header.component.html + 389 + + + apps/client/src/app/pages/pricing/pricing-page.routes.ts + 12 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 287 + + + libs/common/src/lib/routes/routes.ts + 271 + + + + Pricing Plans + 가격 계획 + + apps/client/src/app/pages/pricing/pricing-page.html + 4 + + + + Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover operational costs for the hosting infrastructure and professional data providers, and to fund ongoing development. + 공식 Ghostfolio 프리미엄 클라우드 서비스는 시작하는 가장 쉬운 방법입니다. 시간이 절약되므로 이는 대부분의 사람들에게 최선의 선택이 될 것입니다. 수익은 호스팅 인프라 및 전문 데이터 제공업체의 운영 비용을 충당하고 지속적인 개발 자금을 조달하는 데 사용됩니다. + + apps/client/src/app/pages/pricing/pricing-page.html + 7 + + + + If you prefer to run Ghostfolio on your own infrastructure, please find the source code and further instructions on GitHub. + 자체 인프라에서 Ghostfolio를 운영하고 싶다면, 깃허브에서 소스 코드와 추가 안내를 확인하세요. + + apps/client/src/app/pages/pricing/pricing-page.html + 14 + + + + For tech-savvy investors who prefer to run Ghostfolio on their own infrastructure. + 자체 인프라에서 Ghostfolio를 실행하기를 선호하는 기술에 정통한 투자자를 위한 것입니다. + + apps/client/src/app/pages/pricing/pricing-page.html + 26 + + + + Unlimited Transactions + 무제한 거래 + + apps/client/src/app/pages/pricing/pricing-page.html + 35 + + + apps/client/src/app/pages/pricing/pricing-page.html + 127 + + + + Unlimited Accounts + 무제한 계정 + + apps/client/src/app/pages/pricing/pricing-page.html + 39 + + + apps/client/src/app/pages/pricing/pricing-page.html + 131 + + + + Portfolio Performance + 포트폴리오 성과 + + apps/client/src/app/pages/pricing/pricing-page.html + 43 + + + apps/client/src/app/pages/pricing/pricing-page.html + 135 + + + + Data Import and Export + 데이터 가져오기 및 내보내기 + + apps/client/src/app/pages/pricing/pricing-page.html + 63 + + + apps/client/src/app/pages/pricing/pricing-page.html + 139 + + + + Community Support + 커뮤니티 지원 + + apps/client/src/app/pages/pricing/pricing-page.html + 80 + + + + Self-hosted, update manually. + 자체 호스팅, 수동으로 업데이트합니다. + + apps/client/src/app/pages/pricing/pricing-page.html + 84 + + + + Free + 무료 + + apps/client/src/app/pages/pricing/pricing-page.html + 86 + + + apps/client/src/app/pages/pricing/pricing-page.html + 152 + + + + For new investors who are just getting started with trading. + 이제 막 거래를 시작한 신규 투자자를 위한 제품입니다. + + apps/client/src/app/pages/pricing/pricing-page.html + 119 + + + + Fully managed Ghostfolio cloud offering. + 완전 관리형 Ghostfolio 클라우드 제품. + + apps/client/src/app/pages/pricing/pricing-page.html + 150 + + + apps/client/src/app/pages/pricing/pricing-page.html + 252 + + + + For ambitious investors who need the full picture of their financial assets. + 자신의 금융 자산에 대한 전체 그림이 필요한 야심찬 투자자를 위한 제품입니다. + + apps/client/src/app/pages/pricing/pricing-page.html + 193 + + + + Email and Chat Support + 이메일 및 채팅 지원 + + apps/client/src/app/pages/pricing/pricing-page.html + 248 + + + + Renew Plan + 플랜 갱신 + + apps/client/src/app/components/header/header.component.html + 191 + + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 19 + + + apps/client/src/app/pages/pricing/pricing-page.html + 279 + + + + One-time payment, no auto-renewal. + 일회성 결제, 자동 갱신 없음. + + apps/client/src/app/pages/pricing/pricing-page.html + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 + + + + It’s free. + 무료입니다. + + apps/client/src/app/pages/pricing/pricing-page.html + 362 + + + + Hello, has shared a Portfolio with you! + 안녕하세요. 님이 포트폴리오를 공유했습니다! + + apps/client/src/app/pages/public/public-page.html + 5 + + + + Continents + 대륙 + + apps/client/src/app/pages/public/public-page.html + 132 + + + + Sustainable retirement income + 지속 가능한 퇴직 소득 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 41 + + + + Ghostfolio empowers you to keep track of your wealth. + Ghostfolio는 귀하의 재산을 추적할 수 있도록 해줍니다. + + apps/client/src/app/pages/public/public-page.html + 238 + + + + Registration + 등록 + + apps/client/src/app/components/admin-users/admin-users.html + 80 + + + libs/common/src/lib/routes/routes.ts + 281 + + + + Continue with Google + 구글로 계속하기 + + apps/client/src/app/pages/register/register-page.html + 43 + + + + Copy to clipboard + 클립보드에 복사 + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 88 + + + + Personal Finance Tools + 개인 금융 도구 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 351 + + + libs/common/src/lib/routes/routes.ts + 329 + + + + open-source-alternative-to + open-source-alternative-to + kebab-case + + libs/common/src/lib/routes/routes.ts + 320 + + + libs/common/src/lib/routes/routes.ts + 324 + + + + Discover Open Source Alternatives for Personal Finance Tools + 개인 금융 도구를 위한 오픈 소스 대안을 찾아보세요 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 5 + + + + This overview page features a curated collection of personal finance tools compared to the open source alternative Ghostfolio. If you value transparency, data privacy, and community collaboration, Ghostfolio provides an excellent opportunity to take control of your financial management. + 이 개요 페이지에는 오픈 소스 대안인 Ghostfolio와 비교하여 엄선된 개인 금융 도구 컬렉션이 포함되어 있습니다. 투명성, 데이터 개인 정보 보호 및 커뮤니티 협업을 중요하게 생각한다면 Ghostfolio는 재무 관리를 제어할 수 있는 훌륭한 기회를 제공합니다. + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 9 + + + + Explore the links below to compare a variety of personal finance tools with Ghostfolio. + Ghostfolio와 다양한 개인 금융 도구를 비교하려면 아래 링크를 탐색하십시오. + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 17 + + + + Open Source Alternative to + 의 오픈 소스 대안 + + apps/client/src/app/pages/resources/personal-finance-tools/personal-finance-tools-page.html + 42 + + + + The Open Source Alternative to + 오픈 소스 대안 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 8 + + + + Are you looking for an open source alternative to ? Ghostfolio 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 wide range of functionalities to help you make informed decisions and take control of your financial future. + 에 대한 오픈소스 대안을 찾고 계십니까? Ghostfolio는 개인에게 투자를 추적, 분석, 최적화할 수 있는 포괄적인 플랫폼을 제공하는 강력한 포트폴리오 관리 도구입니다. 숙련된 투자자이든 이제 막 시작한 투자자이든 Ghostfolio는 직관적인 사용자 인터페이스와 다양한 기능을 제공하여 정보에 입각한 결정을 내리고 재정적 미래를 관리하는 데 도움을 줍니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 19 + + + + Ghostfolio is an open source software (OSS), providing a cost-effective alternative to making it particularly suitable for individuals on a tight budget, such as those pursuing Financial Independence, Retire Early (FIRE). By leveraging the collective efforts of a community of developers and personal finance enthusiasts, Ghostfolio continuously enhances its capabilities, security, and user experience. + Ghostfolio는 오픈 소스 소프트웨어로, 에 대한 비용 효율적인 대안을 제공하므로 재정적 독립, 조기 퇴직(FIRE)을 추구하는 사람과 같이 예산이 부족한 개인에게 특히 적합합니다. Ghostfolio는 개발자 커뮤니티와 개인 금융 애호가들의 공동 노력을 활용하여 기능, 보안 및 사용자 경험을 지속적으로 향상시킵니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 33 + + + + Let’s dive deeper into the detailed Ghostfolio vs comparison table below to gain a thorough understanding of how Ghostfolio positions itself relative to . 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. + Ghostfolio가 과 관련하여 어떻게 위치하는지 철저하게 이해하기 위해 아래의 자세한 Ghostfolio 대 비교표를 자세히 살펴보겠습니다. 우리는 기능, 데이터 개인 정보 보호, 가격 등과 같은 다양한 측면을 탐색하여 귀하의 개인 요구 사항에 맞는 정보를 바탕으로 선택할 수 있도록 할 것입니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 44 + + + + per month + 매월 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 94 + + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 172 + + + + Ghostfolio vs comparison table + Ghostfolio와 비교표 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 55 + + + + Website of Thomas Kaul + 토마스 카울의 웹사이트 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 44 + + + + Founded + 설립 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 77 + + + + Origin + 기원 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 82 + + + + Region + 지역 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 87 + + + + Available in + 사용 가능 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 109 + + + + ✅ Yes + ✅ 예 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 140 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 157 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 179 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 196 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 218 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 235 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 257 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 274 + + + + ❌ No + ❌ 아니요 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 147 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 164 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 186 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 203 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 225 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 242 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 264 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 281 + + + + Self-Hosting + 셀프 호스팅 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 171 + + + + Use anonymously + 익명으로 사용 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 210 + + + + Free Plan + 무료 플랜 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 249 + + + + Starting from + 에서 시작 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 289 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 294 + + + + Notes + 메모 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 302 + + + + Please note that the information provided in the Ghostfolio vs comparison table is based on our independent research and analysis. This website is not affiliated with 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 GitHub. + Ghostfolio와 비교표에 제공된 정보는 당사의 독립적인 연구 및 분석을 기반으로 한 것입니다. 이 웹사이트는 또는 비교에 언급된 다른 제품과 관련이 없습니다. 개인 금융 도구의 환경이 발전함에 따라 각 제품 페이지에서 직접 특정 세부 정보나 변경 사항을 확인하는 것이 중요합니다. 데이터를 새로 고쳐야 합니까? 깃허브에서 정확한 데이터를 유지할 수 있도록 도와주세요. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 312 + + + + Ready to take your investments to the next level? + 투자다음 단계로 발전시킬 준비가 되셨나요? + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 325 + + + + Effortlessly track, analyze, and visualize your wealth with Ghostfolio. + Ghostfolio를 사용하여 귀하의 재산을 쉽게 추적, 분석 및 시각화하십시오. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 329 + + + + Switzerland + 스위스 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 58 + + + libs/ui/src/lib/i18n.ts + 99 + + + + Global + 글로벌 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 59 + + + libs/ui/src/lib/i18n.ts + 18 + + + + Resources + 리소스 + + apps/client/src/app/components/footer/footer.component.html + 14 + + + apps/client/src/app/components/header/header.component.html + 88 + + + apps/client/src/app/components/header/header.component.html + 301 + + + apps/client/src/app/pages/resources/overview/resources-overview.component.html + 4 + + + libs/common/src/lib/routes/routes.ts + 332 + + + + Membership + 멤버십 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 48 + + + libs/common/src/lib/routes/routes.ts + 31 + + + libs/ui/src/lib/membership-card/membership-card.component.html + 40 + + + + Request it + 요청하세요 + + apps/client/src/app/pages/pricing/pricing-page.html + 344 + + + + Access + 입장 + + libs/common/src/lib/routes/routes.ts + 26 + + + + My Ghostfolio + 나의 고스트폴리오 + + apps/client/src/app/components/header/header.component.html + 277 + + + apps/client/src/app/pages/user-account/user-account-page.routes.ts + 33 + + + + Oops, authentication has failed. + 앗, 인증에 실패했습니다. + + apps/client/src/app/pages/webauthn/webauthn-page.html + 19 + + + + Try again + 다시 시도하세요 + + apps/client/src/app/pages/webauthn/webauthn-page.html + 27 + + + + Go back to Home Page + 홈 페이지로 돌아가기 + + apps/client/src/app/pages/webauthn/webauthn-page.html + 33 + + + + Do you really want to delete this account balance? + 정말로 이 계정 잔액을 삭제하시겠습니까? + + libs/ui/src/lib/account-balances/account-balances.component.ts + 120 + + + + Export Activities + 수출 활동 + + libs/ui/src/lib/activities-table/activities-table.component.html + 41 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 411 + + + + Export Drafts as ICS + 초안을 달력 파일로 내보내기 + + libs/ui/src/lib/activities-table/activities-table.component.html + 54 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 424 + + + + Draft + 초안 + + libs/ui/src/lib/activities-table/activities-table.component.html + 144 + + + + Clone + 클론 + + libs/ui/src/lib/activities-table/activities-table.component.html + 463 + + + + Export Draft as ICS + 초안을 달력 파일로 내보내기 + + libs/ui/src/lib/activities-table/activities-table.component.html + 473 + + + + Do you really want to delete this activity? + 정말로 이 활동을 삭제하시겠습니까? + + libs/ui/src/lib/activities-table/activities-table.component.ts + 288 + + + + Asset Profiles + 자산 프로필 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 106 + + + libs/ui/src/lib/assistant/assistant.html + 140 + + + + 50-Day Trend + 50일 추세 + + libs/ui/src/lib/benchmark/benchmark.component.html + 32 + + + + 200-Day Trend + 200일 추세 + + libs/ui/src/lib/benchmark/benchmark.component.html + 61 + + + + , + , + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 145 + + + + Last All Time High + 마지막 역대 최고치 + + libs/ui/src/lib/benchmark/benchmark.component.html + 90 + + + + Change from All Time High + 역대 최고치에서 변화 + + libs/ui/src/lib/benchmark/benchmark.component.html + 117 + + + + contact us + 저희에게 연락주세요 + + apps/client/src/app/pages/pricing/pricing-page.html + 336 + + + + from ATH + ATH에서 + + libs/ui/src/lib/benchmark/benchmark.component.html + 119 + + + + Market data provided by + 시장 데이터 제공: + + libs/ui/src/lib/data-provider-credits/data-provider-credits.component.html + 2 + + + + Savings Rate per Month + 월별 저축률 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 10 + + + + Annual Interest Rate + 연이자율 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 21 + + + + Retirement Date + 퇴직일 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 32 + + + + Projected Total Amount + 예상총액 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.html + 59 + + + + Interest + 관심 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 69 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 352 + + + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 387 + + + libs/ui/src/lib/i18n.ts + 40 + + + + Savings + 저금 + + libs/ui/src/lib/fire-calculator/fire-calculator.component.ts + 397 + + + + Allocation + 배당 + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 248 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 117 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 40 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 116 + + + + Show all + 모두 표시 + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 216 + + + + Account + 계정 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 85 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 315 + + + libs/ui/src/lib/i18n.ts + 4 + + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 4 + + + + Asia-Pacific + 아시아·태평양 + + libs/ui/src/lib/i18n.ts + 5 + + + + Asset Class + 자산 클래스 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 114 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 235 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 326 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 242 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 290 + + + libs/ui/src/lib/i18n.ts + 6 + + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 64 + + + + Asset Sub Class + 자산 하위 클래스 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 123 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 244 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 342 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 251 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 309 + + + libs/ui/src/lib/i18n.ts + 7 + + + + Core + 핵심 + + libs/ui/src/lib/i18n.ts + 10 + + + + Switch to Ghostfolio Premium or Ghostfolio Open Source easily + Ghostfolio 프리미엄 또는 Ghostfolio Open Source로 쉽게 전환하세요 + + libs/ui/src/lib/i18n.ts + 12 + + + + Switch to Ghostfolio Premium easily + Ghostfolio 프리미엄으로 쉽게 전환하세요 + + libs/ui/src/lib/i18n.ts + 13 + + + + Switch to Ghostfolio Open Source or Ghostfolio Basic easily + Ghostfolio Open Source 또는 Ghostfolio Basic으로 쉽게 전환하세요 + + libs/ui/src/lib/i18n.ts + 14 + + + + Emergency Fund + 비상자금 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 164 + + + apps/client/src/app/pages/features/features-page.html + 89 + + + libs/ui/src/lib/i18n.ts + 16 + + + + Grant + 승인하다 + + libs/ui/src/lib/i18n.ts + 19 + + + + Higher Risk + 더 높은 위험 + + libs/ui/src/lib/i18n.ts + 20 + + + + This activity already exists. + 이 활동은 이미 존재합니다. + + libs/ui/src/lib/i18n.ts + 21 + + + + Japan + 일본 + + libs/ui/src/lib/i18n.ts + 92 + + + + Lower Risk + 위험 감소 + + libs/ui/src/lib/i18n.ts + 22 + + + + Month + + + libs/ui/src/lib/i18n.ts + 23 + + + + Months + 개월 + + libs/ui/src/lib/i18n.ts + 24 + + + + Other + 다른 + + libs/ui/src/lib/i18n.ts + 25 + + + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 437 + + + + Preset + 프리셋 + + libs/ui/src/lib/i18n.ts + 27 + + + + Retirement Provision + 퇴직금 + + libs/ui/src/lib/i18n.ts + 28 + + + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + + + Satellite + 위성 + + libs/ui/src/lib/i18n.ts + 29 + + + + Symbol + 상징 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 68 + + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 74 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 169 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 37 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 315 + + + libs/ui/src/lib/i18n.ts + 30 + + + + Tag + 꼬리표 + + libs/ui/src/lib/i18n.ts + 31 + + + libs/ui/src/lib/portfolio-filter-form/portfolio-filter-form.component.html + 53 + + + + Year + 년도 + + libs/ui/src/lib/i18n.ts + 32 + + + + View Details + 세부정보 보기 + + apps/client/src/app/components/admin-users/admin-users.html + 225 + + + libs/ui/src/lib/accounts-table/accounts-table.component.html + 314 + + + + Years + 연령 + + libs/ui/src/lib/i18n.ts + 33 + + + + Sign in with OpenID Connect + OpenID Connect로 로그인 + + apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html + 55 + + + + Buy + 구입하다 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 31 + + + libs/ui/src/lib/i18n.ts + 37 + + + + Fee + 요금 + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 262 + + + libs/ui/src/lib/activities-table/activities-table.component.html + 241 + + + libs/ui/src/lib/i18n.ts + 39 + + + + Valuable + 귀중한 + + libs/ui/src/lib/i18n.ts + 43 + + + + Liability + 책임 + + libs/ui/src/lib/i18n.ts + 41 + + + + Sell + 팔다 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 44 + + + libs/ui/src/lib/i18n.ts + 42 + + + + Cash + 현금 + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 212 + + + libs/ui/src/lib/i18n.ts + 55 + + + + Commodity + 상품 + + libs/ui/src/lib/i18n.ts + 47 + + + + Equity + 주식 + + apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html + 57 + + + libs/ui/src/lib/i18n.ts + 48 + + + + Fixed Income + 채권 + + libs/ui/src/lib/i18n.ts + 49 + + + + Real Estate + 부동산 + + libs/ui/src/lib/i18n.ts + 51 + + + + Authentication + 입증 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 35 + + + + Bond + 노예 + + libs/ui/src/lib/i18n.ts + 54 + + + + Cryptocurrency + 암호화폐 + + libs/ui/src/lib/i18n.ts + 57 + + + + ETF + ETF + + libs/ui/src/lib/i18n.ts + 58 + + + + Mutual Fund + 뮤추얼 펀드 + + libs/ui/src/lib/i18n.ts + 59 + + + + Precious Metal + 귀금속 + + libs/ui/src/lib/i18n.ts + 60 + + + + Private Equity + 사모펀드 + + libs/ui/src/lib/i18n.ts + 61 + + + + Stock + 재고 + + libs/ui/src/lib/i18n.ts + 62 + + + + Africa + 아프리카 + + libs/ui/src/lib/i18n.ts + 69 + + + + Asia + 아시아 + + libs/ui/src/lib/i18n.ts + 70 + + + + Europe + 유럽 + + libs/ui/src/lib/i18n.ts + 71 + + + + North America + 북미 + + libs/ui/src/lib/i18n.ts + 72 + + + + If you retire today, you would be able to withdraw + 오늘 퇴사하면 탈퇴 가능 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 68 + + + + Oceania + 오세아니아 + + libs/ui/src/lib/i18n.ts + 73 + + + + South America + 남아메리카 + + libs/ui/src/lib/i18n.ts + 74 + + + + Extreme Fear + 극심한 공포 + + libs/ui/src/lib/i18n.ts + 106 + + + + Extreme Greed + 극도의 탐욕 + + libs/ui/src/lib/i18n.ts + 107 + + + + Neutral + 중립적 + + libs/ui/src/lib/i18n.ts + 110 + + + + Valid until + 유효기간 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 74 + + + libs/ui/src/lib/membership-card/membership-card.component.html + 45 + + + + Time to add your first activity. + 첫 번째 활동을 추가할 시간입니다. + + libs/ui/src/lib/no-transactions-info/no-transactions-info.component.html + 12 + + + + No data available + 사용 가능한 데이터가 없습니다. + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 250 + + + apps/client/src/app/pages/public/public-page.html + 196 + + + libs/ui/src/lib/benchmark/benchmark.component.html + 209 + + + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 439 + + + libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts + 452 + + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 181 + + + + If a translation is missing, kindly support us in extending it here. + 번역이 누락된 경우 여기에서 번역을 확장할 수 있도록 지원해 주시기 바랍니다. + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 59 + + + + Date Range + 기간 + + libs/ui/src/lib/assistant/assistant.html + 170 + + + + The current market price is + 현재 시장가격은 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 706 + + + + Test + 시험 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 568 + + + + Oops! Could not grant access. + 이런! 액세스 권한을 부여할 수 없습니다. + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts + 141 + + + + Argentina + 아르헨티나 + + libs/ui/src/lib/i18n.ts + 78 + + + + Restricted view + 제한된 보기 + + apps/client/src/app/components/access-table/access-table.component.html + 26 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 40 + + + + Permission + 허가 + + apps/client/src/app/components/access-table/access-table.component.html + 18 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 38 + + + + Private + 사적인 + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 30 + + + + Job Queue + 작업 대기열 + + libs/common/src/lib/routes/routes.ts + 46 + + + + Market data is delayed for + 시장 데이터가 지연됩니다. + + apps/client/src/app/components/portfolio-performance/portfolio-performance.component.ts + 95 + + + + Absolute Currency Performance + 절대적인 통화 성과 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 211 + + + + Close Holding + 닫기 보유 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 442 + + + + Absolute Asset Performance + 절대자산성과 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 168 + + + + Investment + 투자 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 171 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 60 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 81 + + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 97 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 89 + + + + here + 여기 + + apps/client/src/app/pages/pricing/pricing-page.html + 347 + + + + Asset Performance + 자산 성과 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 190 + + + + Currency Performance + 통화 성과 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 236 + + + + Year to date + 연초 현재 + + libs/ui/src/lib/assistant/assistant.component.ts + 375 + + + + Week to date + 이번주 현재까지 + + libs/ui/src/lib/assistant/assistant.component.ts + 367 + + + + Month to date + 월간 누계 + + libs/ui/src/lib/assistant/assistant.component.ts + 371 + + + + MTD + MTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 195 + + + libs/ui/src/lib/assistant/assistant.component.ts + 371 + + + + WTD + WTD + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 191 + + + libs/ui/src/lib/assistant/assistant.component.ts + 367 + + + + Oops! A data provider is experiencing the hiccups. + 이런! 데이터 제공업체에 문제가 발생했습니다. + + apps/client/src/app/components/portfolio-performance/portfolio-performance.component.html + 8 + + + + View + 보다 + + apps/client/src/app/components/access-table/access-table.component.html + 23 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 42 + + + + Reset Filters + 필터 재설정 + + libs/ui/src/lib/assistant/assistant.html + 204 + + + + year + 년도 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 203 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 290 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 296 + + + libs/ui/src/lib/assistant/assistant.component.ts + 385 + + + + years + 연령 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 207 + + + libs/ui/src/lib/assistant/assistant.component.ts + 409 + + + + Apply Filters + 필터 적용 + + libs/ui/src/lib/assistant/assistant.html + 217 + + + + self-hosting + self-hosting + kebab-case + + libs/common/src/lib/routes/routes.ts + 243 + + + libs/common/src/lib/routes/routes.ts + 246 + + + + Self-Hosting + 셀프 호스팅 + + apps/client/src/app/pages/faq/faq-page.component.ts + 60 + + + libs/common/src/lib/routes/routes.ts + 248 + + + + Data Gathering + 데이터 수집 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 587 + + + apps/client/src/app/components/admin-overview/admin-overview.html + 60 + + + + General + 일반적인 + + apps/client/src/app/pages/faq/faq-page.component.ts + 49 + + + + Cloud + 구름 + + apps/client/src/app/pages/faq/faq-page.component.ts + 54 + + + libs/common/src/lib/routes/routes.ts + 240 + + + + Oops! It looks like you’re making too many requests. Please slow down a bit. + 이런! 요청을 너무 많이 하시는 것 같습니다. 조금 천천히 해주세요. + + apps/client/src/app/core/http-response.interceptor.ts + 106 + + + + My Account + 내 계정 + + apps/client/src/app/pages/i18n/i18n-page.html + 13 + + + + Closed + 닫은 + + apps/client/src/app/components/home-holdings/home-holdings.component.ts + 65 + + + + Active + 활동적인 + + apps/client/src/app/components/home-holdings/home-holdings.component.ts + 64 + + + + Indonesia + 인도네시아 공화국 + + libs/ui/src/lib/i18n.ts + 90 + + + + Activity + 활동 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 229 + + + + Dividend Yield + 배당수익률 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 196 + + + + Execute Job + 작업 실행 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 220 + + + + This action is not allowed. + 이 작업은 허용되지 않습니다. + + apps/client/src/app/core/http-response.interceptor.ts + 67 + + + + Priority + 우선 사항 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 96 + + + + Liquidity + 유동성 + + libs/ui/src/lib/i18n.ts + 50 + + + + Buy and sell + 구매 및 판매 + + libs/ui/src/lib/i18n.ts + 8 + + + + {VAR_PLURAL, plural, =1 {activity} other {activities}} + {VAR_PLURAL, 복수형, =1 {활동} 기타 {활동}} + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.html + 14 + + + + Delete Activities + 활동 삭제 + + libs/ui/src/lib/activities-table/activities-table.component.html + 69 + + + + Internationalization + 국제화 + + libs/common/src/lib/routes/routes.ts + 119 + + + + Close Account + 계정 폐쇄 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 316 + + + + Do you really want to close your Ghostfolio account? + 정말로 Ghostfolio 계정을 폐쇄하시겠습니까? + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 208 + + + + Danger Zone + 위험지대 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 281 + + + + Approximation based on the top holdings of each ETF + 각 ETF의 상위 보유량을 기준으로 한 근사치 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 340 + + + + By ETF Holding + ETF 홀딩으로 + + apps/client/src/app/pages/portfolio/allocations/allocations-page.html + 333 + + + + Join now or check out the example account + 지금 가입하거나 예시 계정을 확인하세요. + + apps/client/src/app/pages/landing/landing-page.html + 333 + + + + Include in + 포함 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 374 + + + + Oops! There was an error setting up biometric authentication. + 이런! 생체 인증을 설정하는 중에 오류가 발생했습니다. + + apps/client/src/app/components/user-account-settings/user-account-settings.component.ts + 336 + + + + Show more + 더 보기 + + libs/ui/src/lib/top-holdings/top-holdings.component.html + 174 + + + + Do you really want to delete these profiles? + 이 프로필을 정말로 삭제하시겠습니까? + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 68 + + + + Delete Profiles + 프로필 삭제 + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 242 + + + + Oops! Could not delete profiles. + 이런! 프로필을 삭제할 수 없습니다. + + apps/client/src/app/components/admin-market-data/admin-market-data.service.ts + 56 + + + + Benchmarks + 벤치마크 + + apps/client/src/app/components/admin-market-data/admin-market-data.component.ts + 126 + + + + Chart + 차트 + + apps/client/src/app/components/home-holdings/home-holdings.html + 19 + + + + Table + 테이블 + + apps/client/src/app/components/home-holdings/home-holdings.html + 16 + + + + Would you like to refine your personal investment strategy? + 개인 투자 전략개선하시겠습니까? + + apps/client/src/app/pages/public/public-page.html + 234 + + + + Wealth + 재산 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 99 + + + + Community + 지역 사회 + + apps/client/src/app/components/footer/footer.component.html + 80 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 85 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 91 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 95 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 99 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 103 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 109 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 114 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 118 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 122 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 + + + apps/client/src/app/pages/features/features-page.html + 277 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 86 + + + + Thailand + 태국 + + libs/ui/src/lib/i18n.ts + 100 + + + + India + 인도 + + libs/ui/src/lib/i18n.ts + 89 + + + + Austria + 오스트리아 + + libs/ui/src/lib/i18n.ts + 80 + + + + Poland + 폴란드 + + libs/ui/src/lib/i18n.ts + 95 + + + + Italy + 이탈리아 + + libs/ui/src/lib/i18n.ts + 91 + + + + User Experience + 사용자 경험 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 98 + + + + App + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 84 + + + + Tool + 도구 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 97 + + + + Investor + 투자자 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 90 + + + + Wealth Management + 자산관리 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 100 + + + + View Holding + 보유보기 + + libs/ui/src/lib/activities-table/activities-table.component.html + 450 + + + + Canada + 캐나다 + + libs/ui/src/lib/i18n.ts + 84 + + + + New Zealand + 뉴질랜드 + + libs/ui/src/lib/i18n.ts + 94 + + + + Netherlands + 네덜란드 + + libs/ui/src/lib/i18n.ts + 93 + + + + Alternative + 대안 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 83 + + + + Family Office + 패밀리오피스 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 87 + + + + Personal Finance + 개인 금융 + + apps/client/src/app/components/footer/footer.component.html + 7 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 93 + + + + Software + 소프트웨어 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 96 + + + + Romania + 루마니아 + + libs/ui/src/lib/i18n.ts + 96 + + + + Germany + 독일 + + libs/ui/src/lib/i18n.ts + 88 + + + + United States + 미국 + + libs/ui/src/lib/i18n.ts + 103 + + + + Budgeting + 예산 편성 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 85 + + + + Belgium + 벨기에 + + libs/ui/src/lib/i18n.ts + 81 + + + + Open Source + 오픈 소스 + + apps/client/src/app/pages/landing/landing-page.html + 159 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 91 + + + + Czech Republic + 체코 + + libs/ui/src/lib/i18n.ts + 85 + + + + Australia + 호주 + + libs/ui/src/lib/i18n.ts + 79 + + + + South Africa + 남아프리카 + + libs/ui/src/lib/i18n.ts + 98 + + + + Bulgaria + 불가리아 + + libs/ui/src/lib/i18n.ts + 83 + + + + Privacy + 은둔 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts + 94 + + + + Finland + 핀란드 + + libs/ui/src/lib/i18n.ts + 86 + + + + France + 프랑스 + + libs/ui/src/lib/i18n.ts + 87 + + + + Error + 오류 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 697 + + + + Cancel + 취소 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 162 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 592 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 57 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 44 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 27 + + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 17 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 66 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 105 + + + apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.html + 65 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 345 + + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 48 + + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html + 46 + + + libs/ui/src/lib/i18n.ts + 9 + + + + Role + 역할 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 14 + + + + Yes + + + libs/ui/src/lib/i18n.ts + 34 + + + + , based on your total assets of + , 귀하의 총 자산을 기준으로 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 96 + + + + Inactive + 비활성 + + apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html + 88 + + + + Close + 닫다 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 594 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 59 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 46 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 29 + + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 19 + + + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html + 130 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 68 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 107 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 347 + + + libs/ui/src/lib/i18n.ts + 11 + + + + Activate + 활성화 + + apps/client/src/app/components/rule/rule.component.html + 83 + + + + Oops! Could not update access. + 이런! 액세스를 업데이트할 수 없습니다. + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts + 178 + + + + Deactivate + 비활성화 + + apps/client/src/app/components/rule/rule.component.html + 78 + + + + Threshold Max + 임계값 최대 + + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html + 93 + + + + send an e-mail to + 에게 이메일을 보내다 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 87 + + + + Customize + 사용자 정의 + + apps/client/src/app/components/rule/rule.component.html + 69 + + + + Portfolio Snapshot + 포트폴리오 스냅샷 + + apps/client/src/app/components/admin-jobs/admin-jobs.html + 56 + + + + Threshold Min + 임계값 최소 + + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html + 55 + + + + If you plan to open an account at + 에서 계좌를 개설할 계획이라면 + + apps/client/src/app/pages/pricing/pricing-page.html + 312 + + + + Performance with currency effect Performance + 환율 효과가 있는 실적 실적 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 83 + + + + Copy link to clipboard + 링크를 클립보드에 복사 + + apps/client/src/app/components/access-table/access-table.component.html + 84 + + + + Change with currency effect Change + 통화 효과로 변경 변경 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 63 + + + + From the beginning + 처음부터 + + apps/client/src/app/pages/public/public-page.html + 60 + + + + This year + 올해 + + apps/client/src/app/pages/public/public-page.html + 42 + + + + offers a free plan + 은(는) 무료 요금제를 제공합니다 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 256 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 273 + + + + does not offer a free plan + 은(는) 무료 요금제를 제공하지 않습니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 263 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 280 + + + + Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions. + Ghostfolio는 개인이 주식, ETF 또는 암호화폐를 추적하고 확실한 데이터 기반 투자 결정을 내릴 수 있는 경량 자산 관리 애플리케이션입니다. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 10 + + + + , assuming a + , 가정 + + apps/client/src/app/pages/portfolio/fire/fire-page.html + 174 + + + + to use our referral link and get a Ghostfolio Premium membership for one year + 추천 링크를 사용하고 1년 동안 Ghostfolio 프리미엄 멤버십을 얻으려면 + + apps/client/src/app/pages/pricing/pricing-page.html + 340 + + + + can be self-hosted + 은(는) 자체 호스팅 가능 + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 178 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 195 + + + + cannot be self-hosted + 은(는) 자체 호스팅할 수 없습니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 185 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 202 + + + + can be used anonymously + 은(는) 익명으로 사용할 수 있습니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 217 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 234 + + + + cannot be used anonymously + 은(는) 익명으로 사용할 수 없습니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 224 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 241 + + + + is not Open Source Software + 은(는) 오픈 소스 소프트웨어가 아닙니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 146 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 163 + + + + is Open Source Software + 은(는) 오픈 소스 소프트웨어입니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 139 + + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 156 + + + + This page has been archived. + 이 페이지는 보관되었습니다. + + apps/client/src/app/pages/resources/personal-finance-tools/product-page.html + 14 + + + + Oops! Invalid currency. + 이런! 통화가 잘못되었습니다. + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 48 + + + + Oops! Could not find any assets. + 이런! 자산을 찾을 수 없습니다. + + libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.html + 40 + + + + Ukraine + 우크라이나 + + libs/ui/src/lib/i18n.ts + 101 + + + + Set API key + API 키 설정 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 171 + + + + Get access to 80’000+ tickers from over 50 exchanges + 50개 이상의 거래소에서 80,000개 이상의 티커에 접근하세요 + + libs/ui/src/lib/i18n.ts + 26 + + + + Data Providers + 데이터 제공자 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 4 + + + + Join now + 지금 가입하세요 + + apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html + 193 + + + + Glossary + 용어집 + + apps/client/src/app/pages/resources/glossary/resources-glossary.component.html + 4 + + + apps/client/src/app/pages/resources/resources-page.component.ts + 45 + + + libs/common/src/lib/routes/routes.ts + 293 + + + + glossary + glossary + kebab-case + + libs/common/src/lib/routes/routes.ts + 288 + + + libs/common/src/lib/routes/routes.ts + 291 + + + + Guides + 가이드 + + apps/client/src/app/pages/resources/guides/resources-guides.component.html + 4 + + + apps/client/src/app/pages/resources/resources-page.component.ts + 34 + + + libs/common/src/lib/routes/routes.ts + 301 + + + + guides + guides + kebab-case + + libs/common/src/lib/routes/routes.ts + 296 + + + libs/common/src/lib/routes/routes.ts + 299 + + + + Threshold range + 임계값 범위 + + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html + 9 + + + + Ghostfolio X-ray uses static analysis to uncover potential issues and risks in your portfolio. Adjust the rules below and set custom thresholds to align with your personal investment strategy. + Ghostfolio X-ray는 정적 분석을 사용하여 포트폴리오의 잠재적인 문제와 위험을 찾아냅니다. 아래 규칙을 조정하고 개인 투자 전략에 맞게 맞춤 임계값을 설정하세요. + + apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html + 6 + + + + Please enter your Ghostfolio API key: + Ghostfolio API 키를 입력하세요: + + apps/client/src/app/pages/api/api-page.component.ts + 43 + + + + of + ~의 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 135 + + + + Do you really want to delete the API key? + API 키를 정말로 삭제하시겠습니까? + + apps/client/src/app/components/admin-settings/admin-settings.component.ts + 127 + + + + Remove API key + API 키 제거 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 161 + + + + daily requests + 일일 요청 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 137 + + + + Generate Ghostfolio Premium Data Provider API key for self-hosted environments... + 자체 호스팅 환경을 위한 Ghostfolio 프리미엄 데이터 공급자 API 키 생성... + + libs/ui/src/lib/membership-card/membership-card.component.html + 29 + + + + API Key + API 키 + + libs/ui/src/lib/membership-card/membership-card.component.html + 21 + + + + API Requests Today + 오늘의 API 요청 + + apps/client/src/app/components/admin-users/admin-users.html + 161 + + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 98 + + + + Could not generate an API key + API 키를 생성할 수 없습니다. + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 136 + + + + Do you really want to generate a new API key? + 정말로 새 API 키를 생성하시겠습니까? + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 159 + + + + Ghostfolio Premium Data Provider API Key + Ghostfolio 프리미엄 데이터 공급자 API 키 + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 154 + + + + Set this API key in your self-hosted environment: + 자체 호스팅 환경에서 이 API 키를 설정하세요. + + apps/client/src/app/components/user-account-membership/user-account-membership.component.ts + 151 + + + + rules align with your portfolio. + 규칙은 귀하의 포트폴리오와 일치합니다. + + apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html + 58 + + + + out of + 밖으로 + + apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.html + 56 + + + + Save + 구하다 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 603 + + + apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html + 68 + + + apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.html + 55 + + + apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.html + 38 + + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 28 + + + apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts + 109 + + + apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html + 136 + + + apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html + 81 + + + apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html + 116 + + + apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html + 356 + + + libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.html + 48 + + + + Received Access + 수신된 액세스 + + apps/client/src/app/components/user-account-access/user-account-access.html + 53 + + + + Check the system status at + 시스템 상태를 확인하세요. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 57 + + + + Me + + + apps/client/src/app/components/header/header.component.html + 213 + + + apps/client/src/app/components/user-account-access/user-account-access.component.ts + 260 + + + + Please enter your Ghostfolio API key. + Ghostfolio API 키를 입력하세요. + + apps/client/src/app/components/admin-settings/admin-settings.component.ts + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 + + + + AI prompt has been copied to the clipboard + AI 프롬프트가 클립보드에 복사되었습니다. + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 201 + + + + Link has been copied to the clipboard + 링크가 클립보드에 복사되었습니다. + + apps/client/src/app/components/access-table/access-table.component.ts + 99 + + + + Mode + 방법 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 518 + + + + Default Market Price + 기본 시장 가격 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 481 + + + + Selector + 선택자 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 534 + + + + Instant + 즉각적인 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 229 + + + + Lazy + 게으른 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 225 + + + + HTTP Request Headers + HTTP 요청 헤더 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 494 + + + + real-time + 실시간 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 229 + + + + end of day + 하루의 끝 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 225 + + + + Open Duck.ai + 오픈 Duck.ai + + apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts + 202 + + + + Create + 만들다 + + libs/ui/src/lib/tags-selector/tags-selector.component.html + 50 + + + + Change + 변화 + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 138 + + + libs/ui/src/lib/treemap-chart/treemap-chart.component.ts + 368 + + + + Performance + 성능 + + apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.html + 6 + + + apps/client/src/app/components/home-overview/home-overview.component.ts + 55 + + + libs/ui/src/lib/holdings-table/holdings-table.component.html + 161 + + + libs/ui/src/lib/treemap-chart/treemap-chart.component.ts + 368 + + + libs/ui/src/lib/treemap-chart/treemap-chart.component.ts + 381 + + + + The project has been initiated by + 프로젝트는 다음에 의해 시작되었습니다. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 40 + + + + Copy AI prompt to clipboard for analysis + 분석을 위해 AI 프롬프트를 클립보드에 복사 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 67 + + + + Singapore + 싱가포르 + + libs/ui/src/lib/i18n.ts + 97 + + + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + + + Armenia + 아르메니아 + + libs/ui/src/lib/i18n.ts + 77 + + + + British Virgin Islands + 영국령 버진아일랜드 + + libs/ui/src/lib/i18n.ts + 82 + + + + Copy portfolio data to clipboard for AI prompt + AI 프롬프트를 위해 포트폴리오 데이터를 클립보드에 복사 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 42 + + + + I understand that if I lose my security token, I cannot recover my account + 보안 토큰을 분실하면 계정을 복구할 수 없다는 점을 이해합니다. + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 28 + + + + Please keep your security token safe. If you lose it, you will not be able to recover your account. + 보안 토큰을 안전하게 보관하세요. 분실한 경우 계정을 복구할 수 없습니다. + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 18 + + + + Here is your security token. It is only visible once, please store and keep it in a safe place. + 여기 보안 토큰이 있습니다. 한 번만 볼 수 있으므로 안전한 곳에 보관하여 보관하시기 바랍니다. + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 67 + + + + Continue + 계속하다 + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 57 + + + + Terms and Conditions + 이용약관 + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 15 + + + + Do you really want to generate a new security token for this user? + 정말로 이 사용자에 대한 새 보안 토큰을 생성하시겠습니까? + + apps/client/src/app/components/admin-users/admin-users.component.ts + 241 + + + + Find account, holding or page... + 계정, 보유 또는 페이지 찾기... + + libs/ui/src/lib/assistant/assistant.component.ts + 151 + + + + Security token + 보안 토큰 + + apps/client/src/app/components/admin-users/admin-users.component.ts + 236 + + + apps/client/src/app/components/user-account-access/user-account-access.component.ts + 170 + + + + Generate Security Token + 보안 토큰 생성 + + apps/client/src/app/components/admin-users/admin-users.html + 243 + + + + United Kingdom + 영국 + + libs/ui/src/lib/i18n.ts + 102 + + + + Terms of Service + 이용약관 + + apps/client/src/app/components/footer/footer.component.html + 62 + + + libs/common/src/lib/routes/routes.ts + 217 + + + + terms-of-service + terms-of-service + kebab-case + + libs/common/src/lib/routes/routes.ts + 212 + + + libs/common/src/lib/routes/routes.ts + 215 + + + + Terms of Service + 이용약관 + + apps/client/src/app/pages/about/terms-of-service/terms-of-service-page.html + 5 + + + + and I agree to the Terms of Service. + 서비스 약관에 동의합니다. + + apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html + 34 + + + + () is already in use. + ()은(는) 이미 사용 중입니다. + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 633 + + + + An error occurred while updating to (). + ()로 업데이트하는 동안 오류가 발생했습니다. + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 641 + + + + Apply + 적용하다 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html + 154 + + + + with API access for + 다음에 대한 API 액세스 권한이 있는 + + apps/client/src/app/pages/pricing/pricing-page.html + 235 + + + + Data Gathering is off + 데이터 수집이 사용 중지되었습니다. + + apps/client/src/app/components/admin-market-data/admin-market-data.html + 38 + + + + Performance Calculation + 성능 계산 + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 31 + + + + someone + 누구 + + apps/client/src/app/pages/public/public-page.component.ts + 59 + + + + Add asset to watchlist + 관심 목록에 자산 추가 + + apps/client/src/app/components/home-watchlist/create-watchlist-item-dialog/create-watchlist-item-dialog.html + 7 + + + + Watchlist + 관심 목록 + + apps/client/src/app/components/home-watchlist/home-watchlist.html + 4 + + + apps/client/src/app/pages/features/features-page.html + 197 + + + libs/common/src/lib/routes/routes.ts + 110 + + + + Do you really want to delete this item? + 이 항목을 정말로 삭제하시겠습니까? + + libs/ui/src/lib/benchmark/benchmark.component.ts + 144 + + + + Log out + 로그아웃 + + apps/client/src/app/components/header/header.component.html + 329 + + + + Calculations are based on delayed market data and may not be displayed in real-time. + 계산은 지연된 시장 데이터를 기반으로 하며 실시간으로 표시되지 않을 수 있습니다. + + apps/client/src/app/components/home-market/home-market.html + 45 + + + apps/client/src/app/components/markets/markets.html + 54 + + + + changelog + changelog + kebab-case + + libs/common/src/lib/routes/routes.ts + 180 + + + libs/common/src/lib/routes/routes.ts + 183 + + + + Sync Demo User Account + 데모 사용자 계정 동기화 + + apps/client/src/app/components/admin-overview/admin-overview.html + 195 + + + + Demo user account has been synced. + 데모 사용자 계정이 동기화되었습니다. + + apps/client/src/app/components/admin-overview/admin-overview.component.ts + 274 + + + + Set up + 설정 + + apps/client/src/app/pages/i18n/i18n-page.html + 145 + + + + No emergency fund has been set up + 비상금은 마련되지 않았습니다 + + apps/client/src/app/pages/i18n/i18n-page.html + 147 + + + + An emergency fund has been set up + 비상금이 마련됐어요 + + apps/client/src/app/pages/i18n/i18n-page.html + 150 + + + + Fee Ratio + 수수료 비율 + + apps/client/src/app/pages/i18n/i18n-page.html + 152 + + + + The fees do exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + 수수료가 초기 투자금(${feeRatio}%)의 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 154 + + + + The fees do not exceed ${thresholdMax}% of your initial investment (${feeRatio}%) + 수수료는 초기 투자금의 ${thresholdMax}%(${feeRatio}%)를 초과하지 않습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 158 + + + + Quick Links + 빠른 링크 + + libs/ui/src/lib/assistant/assistant.html + 58 + + + + Live Demo + 라이브 데모 + + apps/client/src/app/pages/landing/landing-page.html + 48 + + + apps/client/src/app/pages/landing/landing-page.html + 349 + + + libs/common/src/lib/routes/routes.ts + 231 + + + + Open Source Alternative to + 오픈 소스 대안 + + libs/common/src/lib/routes/routes.ts + 326 + + + + Single Account + 단일 계정 + + apps/client/src/app/pages/i18n/i18n-page.html + 28 + + + + Your net worth is managed by a single account + 귀하의 순자산은 단일 계정으로 관리됩니다 + + apps/client/src/app/pages/i18n/i18n-page.html + 30 + + + + Your net worth is managed by ${accountsLength} accounts + 귀하의 순자산은 ${accountsLength} 계정에서 관리됩니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 36 + + + + personal-finance-tools + personal-finance-tools + kebab-case + + libs/common/src/lib/routes/routes.ts + 312 + + + libs/common/src/lib/routes/routes.ts + 315 + + + libs/common/src/lib/routes/routes.ts + 323 + + + + markets + markets + kebab-case + + libs/common/src/lib/routes/routes.ts + 304 + + + libs/common/src/lib/routes/routes.ts + 307 + + + + Get Access + 액세스 권한 얻기 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 27 + + + + Fuel your self-hosted Ghostfolio with a powerful data provider to access 80,000+ tickers from over 50 exchanges worldwide. + 자체 호스팅 Ghostfolio강력한 데이터 제공업체와 함께 활용하여 전 세계 50개 이상의 거래소에서 80,000개 이상의 시세에 액세스하세요. + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 16 + + + + Learn more + 자세히 알아보기 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 38 + + + + Limited Offer! + 한정 상품! + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 41 + + + apps/client/src/app/pages/pricing/pricing-page.html + 294 + + + + Get extra + 추가 구매 + + apps/client/src/app/components/user-account-membership/user-account-membership.html + 44 + + + apps/client/src/app/pages/pricing/pricing-page.html + 297 + + + + Unavailable + 없는 + + apps/client/src/app/components/data-provider-status/data-provider-status.component.html + 5 + + + + Available + 사용 가능 + + apps/client/src/app/components/data-provider-status/data-provider-status.component.html + 3 + + + + Current month + 이번 달 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 195 + + + + new + 새로운 + + apps/client/src/app/components/admin-settings/admin-settings.component.html + 67 + + + apps/client/src/app/pages/admin/admin-page.component.ts + 56 + + + + Investment + 투자 + + apps/client/src/app/pages/i18n/i18n-page.html + 15 + + + + Over ${thresholdMax}% of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) + 현재 투자의 ${thresholdMax}% 이상이 ${maxAccountName} (${maxInvestmentRatio}%)에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 17 + + + + The major part of your current investment is at ${maxAccountName} (${maxInvestmentRatio}%) and does not exceed ${thresholdMax}% + 현재 투자의 주요 부분은 ${maxAccountName} (${maxInvestmentRatio}%)이며 ${thresholdMax}%를 초과하지 않습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 24 + + + + Equity + 주식 + + apps/client/src/app/pages/i18n/i18n-page.html + 41 + + + + The equity contribution of your current investment (${equityValueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 지분 기여도(${equityValueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 43 + + + + The equity contribution of your current investment (${equityValueRatio}%) is below ${thresholdMin}% + 현재 투자의 지분 기여도(${equityValueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 47 + + + + The equity contribution of your current investment (${equityValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 지분 기여도(${equityValueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 51 + + + + Fixed Income + 채권 + + apps/client/src/app/pages/i18n/i18n-page.html + 55 + + + + The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 고정 수입 기여도(${fixedIncomeValueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 57 + + + + The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is below ${thresholdMin}% + 현재 투자의 고정 수입 기여도(${fixedIncomeValueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 61 + + + + The fixed income contribution of your current investment (${fixedIncomeValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 고정 수입 기여도(${fixedIncomeValueRatio}%)가 ${thresholdMin}% ~ ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 66 + + + + Investment: Base Currency + 투자: 기본 통화 + + apps/client/src/app/pages/i18n/i18n-page.html + 85 + + + + The major part of your current investment is not in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) + 현재 투자의 주요 부분이 기본 통화(${baseCurrency}의 ${baseCurrencyValueRatio}%)로 되어 있지 않습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 88 + + + + The major part of your current investment is in your base currency (${baseCurrencyValueRatio}% in ${baseCurrency}) + 현재 투자의 주요 부분은 기본 통화(${baseCurrency}의 ${baseCurrencyValueRatio}%)입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 92 + + + + Investment + 투자 + + apps/client/src/app/pages/i18n/i18n-page.html + 95 + + + + Over ${thresholdMax}% of your current investment is in ${currency} (${maxValueRatio}%) + 현재 투자의 ${thresholdMax}% 이상이 ${currency}(${maxValueRatio}%)에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 97 + + + + The major part of your current investment is in ${currency} (${maxValueRatio}%) and does not exceed ${thresholdMax}% + 현재 투자의 주요 부분은 ${currency} (${maxValueRatio}%)이며 ${thresholdMax}%를 초과하지 않습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 101 + + + + start + start + kebab-case + + libs/common/src/lib/routes/routes.ts + 336 + + + libs/common/src/lib/routes/routes.ts + 337 + + + + Generate + 생성하다 + + apps/client/src/app/components/user-account-access/user-account-access.html + 43 + + + + If you encounter a bug, would like to suggest an improvement or a new feature, please join the Ghostfolio Slack community, post to @ghostfolio_ + 버그가 발생하거나 개선 사항이나 새로운 기능을 제안하고 싶다면 Ghostfolio 슬랙 커뮤니티에 가입하고 @ghostfolio_에 게시하세요. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 69 + + + + Do you really want to generate a new security token? + 정말로 새로운 보안 토큰을 생성하시겠습니까? + + apps/client/src/app/components/user-account-access/user-account-access.component.ts + 175 + + + + Cryptocurrencies + 암호화폐 + + apps/client/src/app/components/markets/markets.component.ts + 53 + + + apps/client/src/app/pages/features/features-page.html + 51 + + + + Stocks + 주식 + + apps/client/src/app/components/markets/markets.component.ts + 52 + + + apps/client/src/app/pages/features/features-page.html + 15 + + + + + + + apps/client/src/app/components/admin-users/admin-users.html + 39 + + + + Manage Asset Profile + 자산 프로필 관리 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 466 + + + + Alternative Investment + 대체투자 + + libs/ui/src/lib/i18n.ts + 46 + + + + Collectible + 소장용 + + libs/ui/src/lib/i18n.ts + 56 + + + + Average Unit Price + 평균단가 + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts + 113 + + + apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html + 101 + + + + No results found... + 검색된 결과가 없습니다... + + libs/ui/src/lib/assistant/assistant.html + 51 + + + + Account Cluster Risks + 계정 클러스터 위험 + + apps/client/src/app/pages/i18n/i18n-page.html + 14 + + + + Asset Class Cluster Risks + 자산 클래스 클러스터 위험 + + apps/client/src/app/pages/i18n/i18n-page.html + 39 + + + + Currency Cluster Risks + 통화 클러스터 위험 + + apps/client/src/app/pages/i18n/i18n-page.html + 83 + + + + Economic Market Cluster Risks + 경제 시장 클러스터 위험 + + apps/client/src/app/pages/i18n/i18n-page.html + 106 + + + + Emergency Fund + 비상자금 + + apps/client/src/app/pages/i18n/i18n-page.html + 144 + + + + Fees + 수수료 + + apps/client/src/app/pages/i18n/i18n-page.html + 161 + + + + Liquidity + 유동성 + + apps/client/src/app/pages/i18n/i18n-page.html + 70 + + + + Buying Power + 매수 가능 금액 + + apps/client/src/app/pages/i18n/i18n-page.html + 71 + + + + Your buying power is below ${thresholdMin} ${baseCurrency} + 귀하의 구매력은 ${thresholdMin} ${baseCurrency} 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 73 + + + + Your buying power is 0 ${baseCurrency} + 귀하의 구매력은 0입니다 ${baseCurrency} + + apps/client/src/app/pages/i18n/i18n-page.html + 77 + + + + Your buying power exceeds ${thresholdMin} ${baseCurrency} + 매수 가능 금액이 ${thresholdMin} ${baseCurrency}을(를) 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 80 + + + + Regional Market Cluster Risks + 지역 시장 클러스터 위험 + + apps/client/src/app/pages/i18n/i18n-page.html + 163 + + + + Developed Markets + 선진시장 + + apps/client/src/app/pages/i18n/i18n-page.html + 109 + + + + The developed markets contribution of your current investment (${developedMarketsValueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 선진국 시장 기여도(${개발된MarketsValueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 112 + + + + The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is below ${thresholdMin}% + 현재 투자의 선진국 시장 기여도(${개발된MarketsValueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 117 + + + + The developed markets contribution of your current investment (${developedMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 선진국 시장 기여도(${개발된MarketsValueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 122 + + + + Emerging Markets + 신흥시장 + + apps/client/src/app/pages/i18n/i18n-page.html + 127 + + + + The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 신흥 시장 기여도(${emergingMarketsValueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 130 + + + + The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is below ${thresholdMin}% + 현재 투자의 신흥 시장 기여도(${emergingMarketsValueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 135 + + + + The emerging markets contribution of your current investment (${emergingMarketsValueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 신흥 시장 기여도(${emergingMarketsValueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 140 + + + + No accounts have been set up + 설정된 계정이 없습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 21 + + + + Your net worth is managed by 0 accounts + 귀하의 순자산은 0개의 계정에서 관리됩니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 33 + + + + Asia-Pacific + 아시아·태평양 + + apps/client/src/app/pages/i18n/i18n-page.html + 165 + + + + The Asia-Pacific market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 167 + + + + The Asia-Pacific market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + 현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 171 + + + + The Asia-Pacific market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 아시아 태평양 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 175 + + + + Emerging Markets + 신흥시장 + + apps/client/src/app/pages/i18n/i18n-page.html + 180 + + + + The Emerging Markets contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 183 + + + + The Emerging Markets contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + 현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 187 + + + + The Emerging Markets contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 신흥 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 191 + + + + Europe + 유럽 + + apps/client/src/app/pages/i18n/i18n-page.html + 195 + + + + The Europe market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 유럽 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 197 + + + + The Europe market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + 현재 투자의 유럽 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 201 + + + + The Europe market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 유럽 시장 기여도(${valueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 205 + + + + Japan + 일본 + + apps/client/src/app/pages/i18n/i18n-page.html + 209 + + + + The Japan market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 일본 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 211 + + + + The Japan market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + 현재 투자의 일본 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 215 + + + + The Japan market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 일본 시장 기여도(${valueRatio}%)는 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 219 + + + + North America + 북미 + + apps/client/src/app/pages/i18n/i18n-page.html + 223 + + + + The North America market contribution of your current investment (${valueRatio}%) exceeds ${thresholdMax}% + 현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMax}%를 초과합니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 225 + + + + The North America market contribution of your current investment (${valueRatio}%) is below ${thresholdMin}% + 현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 미만입니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 229 + + + + The North America market contribution of your current investment (${valueRatio}%) is within the range of ${thresholdMin}% and ${thresholdMax}% + 현재 투자의 북미 시장 기여도(${valueRatio}%)가 ${thresholdMin}% 및 ${thresholdMax}% 범위 내에 있습니다. + + apps/client/src/app/pages/i18n/i18n-page.html + 233 + + + + Support Ghostfolio + 고스트폴리오 지원 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 166 + + + + Find Ghostfolio on GitHub + 깃허브에서 Ghostfolio 찾기 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 99 + + + apps/client/src/app/pages/about/overview/about-overview-page.html + 138 + + + + Ghostfolio is an independent & bootstrapped business + Ghostfolio는 독립적이고 부트스트랩된 사업입니다. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 157 + + + + Send an e-mail + 이메일 보내기 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 89 + + + apps/client/src/app/pages/about/overview/about-overview-page.html + 128 + + + + Registration Date + 등록일 + + apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html + 26 + + + + Join the Ghostfolio Slack community + Ghostfolio 슬랙 커뮤니티에 참여하세요 + + apps/client/src/app/pages/about/overview/about-overview-page.html + 109 + + + + Follow Ghostfolio on LinkedIn + LinkedIn에서 Ghostfolio를 팔로우하세요. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 147 + + + + Follow Ghostfolio on X (formerly Twitter) + X(이전의 Twitter)에서 Ghostfolio를 팔로우하세요. + + apps/client/src/app/pages/about/overview/about-overview-page.html + 118 + + + + + diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index b3b9d8040..d7d0b71e8 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -26,7 +26,7 @@ Het risico op verlies bij handelen kan aanzienlijk zijn. Het is niet aan te raden om geld te investeren dat je misschien op korte termijn nodig heeft. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -42,7 +42,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -89,20 +89,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Wil je deze verleende toegang echt intrekken? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -114,7 +106,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -146,7 +138,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -158,7 +150,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -174,7 +166,7 @@ Totaal libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -202,11 +194,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -218,7 +210,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -250,7 +242,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -266,7 +258,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -286,7 +278,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -326,7 +318,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -402,7 +394,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -482,7 +474,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -490,7 +482,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -518,7 +510,7 @@ Wil je deze coupon echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -526,7 +518,7 @@ Wil je echt de cache legen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -534,7 +526,7 @@ Stel je systeemboodschap in: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -638,7 +630,7 @@ Wilt je deze gebruiker echt verwijderen? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -714,7 +706,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -726,7 +718,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -774,7 +766,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -814,7 +806,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -858,7 +850,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -910,7 +902,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -922,7 +914,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -962,7 +954,7 @@ Voer het bedrag van je noodfonds in: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -970,11 +962,11 @@ Sectoren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -990,11 +982,11 @@ Landen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1030,11 +1022,11 @@ Allocatie libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1050,7 +1042,7 @@ Toon alle libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -1062,7 +1054,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1070,11 +1062,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1082,11 +1074,11 @@ 1J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1094,11 +1086,19 @@ 5J apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -1106,11 +1106,11 @@ Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -1118,7 +1118,7 @@ Oké apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -1186,7 +1186,7 @@ Voer je couponcode in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -1194,7 +1194,7 @@ Kon je kortingscode niet inwisselen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -1202,7 +1202,7 @@ Je couponcode is ingewisseld apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -1210,7 +1210,7 @@ Herladen apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -1218,7 +1218,7 @@ Wil je deze aanmeldingsmethode echt verwijderen? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -1238,7 +1238,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -1262,7 +1262,7 @@ Presentatie weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -1278,11 +1278,11 @@ Locatie apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -1290,7 +1290,7 @@ Datum- en getalnotatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -1298,7 +1298,7 @@ Zen-modus apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -1310,7 +1310,7 @@ Aanmelden met vingerafdruk apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -1322,7 +1322,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1414,11 +1414,11 @@ Valuta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1434,7 +1434,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -1454,7 +1454,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -1470,7 +1470,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -1658,7 +1658,7 @@ Overzicht apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -1694,7 +1694,7 @@ Markten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -1838,7 +1838,7 @@ Tijdlijn investeringen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -1846,7 +1846,7 @@ Winnaars apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -1854,7 +1854,7 @@ Verliezers apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -1914,7 +1914,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1946,7 +1946,7 @@ Naam, symbool of ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1978,7 +1978,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1998,7 +1998,7 @@ Opmerking apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2022,7 +2022,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -2054,7 +2054,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -2130,7 +2130,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -2322,7 +2322,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -2462,7 +2462,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2474,7 +2474,7 @@ Land apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -2554,7 +2554,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2610,7 +2610,7 @@ Filter op... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -2638,7 +2638,7 @@ Experimentele functies apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2646,13 +2646,25 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts 152 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Vergelijk met... @@ -2682,11 +2694,11 @@ Automatisch apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2694,7 +2706,7 @@ Weergave apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2702,7 +2714,7 @@ Licht apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2710,7 +2722,7 @@ Donker apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2726,7 +2738,7 @@ Waardeontwikkeling van portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -2766,11 +2778,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2802,7 +2814,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3094,7 +3106,7 @@ Symbool toewijzen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -3102,7 +3114,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3130,7 +3142,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3142,7 +3154,7 @@ Tijdlijn dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3154,11 +3166,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3262,7 +3274,7 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3333,6 +3345,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satelliet @@ -3346,7 +3366,7 @@ Bescherming voor gevoelige informatie zoals absoluut rendement en hoeveelheden apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -3354,7 +3374,7 @@ Afleidingsvrije ervaring voor roerige tijden apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -3362,7 +3382,7 @@ Voorproefje van nieuwe functionaliteit apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -3386,7 +3406,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -3402,7 +3422,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -3418,7 +3438,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -3434,7 +3454,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -3482,7 +3502,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -3566,7 +3586,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3582,7 +3602,19 @@ Eenmalige betaling, geen automatische verlenging. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3590,7 +3622,7 @@ Het is gratis. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -3622,7 +3654,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -3666,7 +3698,7 @@ Ondersteuning via e-mail en chat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3710,7 +3742,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -3734,7 +3766,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3798,7 +3830,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -3814,11 +3846,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3829,12 +3861,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Wil je dit platform echt verwijderen? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -3970,7 +4010,7 @@ Huidige reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -3978,7 +4018,7 @@ Langste reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4022,7 +4062,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -4162,7 +4202,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -4186,7 +4226,7 @@ Scraper instellingen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -4425,20 +4465,12 @@ 43 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETF’s zonder Landen apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -4446,7 +4478,7 @@ ETF’s zonder Sectoren apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -4582,7 +4614,7 @@ Biometrische authenticatie apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4674,7 +4706,7 @@ Exporteer Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4682,7 +4714,7 @@ Valuta apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html @@ -4729,6 +4761,18 @@ 7 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Ontdek de nieuwste Ghostfolio-updates en inzichten in persoonlijke financiën @@ -5280,7 +5324,7 @@ Zwitserland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5292,7 +5336,7 @@ Wereldwijd apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5320,7 +5364,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5504,7 +5548,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5644,7 +5688,7 @@ Oeps! Ophalen van historische data is mislukt. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5652,7 +5696,7 @@ Wilt u dit systeembericht echt verwijderen? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5712,7 +5756,7 @@ De huidige markt waarde is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5720,7 +5764,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5808,15 +5852,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5824,7 +5868,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5840,7 +5884,7 @@ Absolute Activaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5848,7 +5892,7 @@ Activaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5856,7 +5900,7 @@ Absolute Valutaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5864,7 +5908,7 @@ Valutaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5872,7 +5916,7 @@ Week tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5880,11 +5924,11 @@ Week tot nu toe apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5892,7 +5936,7 @@ Maand tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5900,11 +5944,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5912,7 +5956,7 @@ Jaar tot nu toe libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5948,7 +5992,7 @@ jaar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5960,7 +6004,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5968,11 +6012,11 @@ jaren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5988,7 +6032,7 @@ Data Verzamelen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6165,7 +6209,7 @@ Wilt u uw Ghostfolio account echt sluiten? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6173,7 +6217,7 @@ Gevarenzone apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6181,7 +6225,7 @@ Account Sluiten apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6213,7 +6257,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6221,7 +6265,7 @@ Oeps! Er is een fout opgetreden met het instellen van de biometrische authenticatie. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6237,7 +6281,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6293,7 +6337,7 @@ Alternatief apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6301,7 +6345,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6309,7 +6353,7 @@ Budgetteren apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6325,47 +6369,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6373,7 +6421,7 @@ Familiekantoor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6381,7 +6429,7 @@ Investeerder apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6393,7 +6441,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6405,7 +6453,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6413,7 +6461,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6421,7 +6469,7 @@ Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6429,7 +6477,7 @@ Hulpmiddel apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6437,7 +6485,7 @@ Gebruikers Ervaring apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6445,7 +6493,7 @@ Vermogen apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6453,7 +6501,7 @@ Vermogensbeheer apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6613,7 +6661,7 @@ Fout apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6661,11 +6709,11 @@ Annuleren apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6717,7 +6765,7 @@ Sluiten apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6801,7 +6849,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6913,7 +6961,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7147,7 +7195,7 @@ Wilt u de API-sleutel echt verwijderen? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7175,7 +7223,7 @@ Er kon geen API-sleutel worden gegenereerd apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7183,7 +7231,7 @@ Stel deze API-sleutel in uw zelf-gehoste omgeving in: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7191,7 +7239,7 @@ Ghostfolio Premium Gegevensleverancier API-sleutel apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7199,7 +7247,7 @@ Wilt u echt een nieuwe API-sleutel genereren? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7239,7 +7287,7 @@ Opslaan apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,7 +7307,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7315,7 +7363,15 @@ Voer uw Ghostfolio API-sleutel in. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7323,7 +7379,7 @@ AI-prompt is naar het klembord gekopieerd apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7331,7 +7387,7 @@ Link is gekopieerd naar klemboord apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7339,7 +7395,7 @@ Lui apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Direct apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Standaard Marktprijs apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Modus apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Kiezer apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ HTTP Verzoek Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ eind van de dag apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Aanpassen libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenië @@ -7543,7 +7607,7 @@ Beveiligingstoken apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Wilt u echt een nieuw beveiligingstoken voor deze gebruiker aanmaken? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () is al in gebruik. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ Er is een fout opgetreden tijdens het updaten naar (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Toepassen apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ met API toegang tot apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Wilt u dit item echt verwijderen? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Demo-gebruikersaccount is gesynchroniseerd. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 28c63f231..a94a76d2f 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -215,7 +215,7 @@ Ryzyko strat na rynku może być znaczne. Nie jest zalecane inwestowanie pieniędzy, które mogą być potrzebne w krótkim okresie. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -243,7 +243,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -290,20 +290,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Czy na pewno chcesz cofnąć przyznany dostęp? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -319,7 +311,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -335,7 +327,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -359,7 +351,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -391,7 +383,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -403,7 +395,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -419,7 +411,7 @@ Suma libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -427,11 +419,11 @@ Waluta apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -447,7 +439,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -479,11 +471,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -495,7 +487,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -527,7 +519,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -543,7 +535,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -563,7 +555,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -599,7 +591,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -615,7 +607,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -751,27 +743,19 @@ Waluty apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html 96 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETF-y bez Krajów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -779,7 +763,7 @@ ETF-y bez Sektorów apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -795,7 +779,7 @@ Filtruj według... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -807,7 +791,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -815,7 +799,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -871,7 +855,7 @@ Ups! Nie udało się sparsować danych historycznych. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -903,7 +887,7 @@ Sektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -915,7 +899,7 @@ Kraj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -935,11 +919,11 @@ Sektory apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -955,11 +939,11 @@ Kraje apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -971,7 +955,7 @@ Mapowanie Symboli apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -987,7 +971,7 @@ Konfiguracja Scrapera apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -995,7 +979,7 @@ Notatka apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1035,7 +1019,7 @@ Nazwa, symbol lub ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1055,7 +1039,7 @@ Czy naprawdę chcesz usunąć ten kupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -1063,7 +1047,7 @@ Czy naprawdę chcesz usunąć tę wiadomość systemową? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -1071,7 +1055,7 @@ Czy naprawdę chcesz wyczyścić pamięć podręczną? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -1079,7 +1063,7 @@ Proszę ustawić swoją wiadomość systemową: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -1203,11 +1187,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1218,12 +1202,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Czy naprawdę chcesz usunąć tę platformę? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -1247,7 +1239,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -1319,7 +1311,7 @@ Czy na pewno chcesz usunąć tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -1382,6 +1374,18 @@ 254 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Porównaj z... @@ -1415,7 +1419,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -1427,7 +1431,7 @@ Poziom Odniesienia (Benchmark) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1491,7 +1495,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1631,7 +1635,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1679,7 +1683,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1723,7 +1727,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1787,7 +1791,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -1799,7 +1803,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -1867,7 +1871,7 @@ Wprowadź wysokość funduszu rezerwowego: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -1903,7 +1907,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1943,7 +1947,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -1963,7 +1967,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -1979,7 +1983,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -1995,7 +1999,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -2007,7 +2011,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -2023,7 +2027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -2079,7 +2083,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -2091,7 +2095,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -2099,11 +2103,11 @@ Liczony od początku roku (year-to-date) apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -2111,11 +2115,11 @@ 1 rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -2123,11 +2127,19 @@ 5 lat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -2135,11 +2147,11 @@ Maksimum apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -2171,7 +2183,7 @@ Wpisz kod kuponu: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -2179,7 +2191,7 @@ Nie udało się zrealizować kodu kuponu apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -2187,7 +2199,7 @@ Kupon został zrealizowany apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -2195,7 +2207,7 @@ Odśwież apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -2215,7 +2227,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -2239,11 +2251,11 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2251,7 +2263,7 @@ Czy na pewno chcesz usunąć tą metode logowania? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -2259,7 +2271,7 @@ Widok Prezentera apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -2267,7 +2279,7 @@ Ochrona dla wrażliwych informacji takich jak wyniki i wartości ilościowe apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -2291,11 +2303,11 @@ Ustawienia Regionalne apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -2303,7 +2315,7 @@ Format daty i liczb apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -2311,7 +2323,7 @@ Wygląd (tryb) apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2319,7 +2331,7 @@ Jasny apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2327,7 +2339,7 @@ Ciemny apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2335,7 +2347,7 @@ Tryb Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -2347,7 +2359,7 @@ Doświadczenie bez zakłóceń w niespokojnych czasach apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -2363,7 +2375,7 @@ Uwierzytelnianie Biometryczne apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -2371,7 +2383,7 @@ Logowanie za pomocą linii papilarnych apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -2379,7 +2391,7 @@ Funkcje Eksperymentalne apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2387,7 +2399,7 @@ Podgląd nadchodzących funkcjonalności apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -2399,7 +2411,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2411,7 +2423,7 @@ Eksportuj Dane apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -2455,7 +2467,7 @@ Okej apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -2723,7 +2735,7 @@ Przegląd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -2862,6 +2874,18 @@ 225 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Odkryj najnowsze aktualizacje Ghostfolio oraz spostrzeżenia na temat finansów osobistych @@ -3019,7 +3043,7 @@ Oprogramowanie Open Source apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -3031,7 +3055,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -3043,7 +3067,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -3099,7 +3123,7 @@ Rynki apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -3499,7 +3523,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -3595,7 +3619,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3627,7 +3651,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -4051,7 +4075,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -4079,7 +4103,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4107,7 +4131,7 @@ Miesięcznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4115,7 +4139,7 @@ Rocznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4123,7 +4147,7 @@ Największe wzrosty apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -4131,7 +4155,7 @@ Największy spadek apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -4139,7 +4163,7 @@ Rozwój portfela apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -4147,7 +4171,7 @@ Oś czasu inwestycji apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -4155,7 +4179,7 @@ Obecna passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -4163,7 +4187,7 @@ Najdłuższa passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4171,7 +4195,7 @@ Oś czasu dywidend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -4347,7 +4371,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -4363,7 +4387,7 @@ Wsparcie przez E-mail i Czat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -4379,7 +4403,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -4387,7 +4411,19 @@ Płatność jednorazowa, bez automatycznego odnawiania. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -4395,7 +4431,7 @@ Jest bezpłatny. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -4740,7 +4776,7 @@ Szwajcaria apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -4752,7 +4788,7 @@ Globalny apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -4804,7 +4840,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -4948,7 +4984,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -5032,11 +5068,11 @@ Podział libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5052,7 +5088,7 @@ Pokaż wszystko libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -5092,11 +5128,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5124,11 +5160,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5275,6 +5311,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satelita @@ -5296,7 +5340,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5340,7 +5384,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -5712,7 +5756,7 @@ Obecna cena rynkowa wynosi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5720,7 +5764,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5808,15 +5852,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5824,7 +5868,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5840,7 +5884,7 @@ Łączny wynik aktywów apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5848,7 +5892,7 @@ Wyniki aktywów apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5856,7 +5900,7 @@ Łączny wynik walut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5864,7 +5908,7 @@ Wynik walut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5872,7 +5916,7 @@ Dotychczasowy tydzień libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5880,11 +5924,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5892,7 +5936,7 @@ Od początku miesiąca libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5900,11 +5944,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5912,7 +5956,7 @@ Od początku roku libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5948,7 +5992,7 @@ rok apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5960,7 +6004,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5968,11 +6012,11 @@ lata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5988,7 +6032,7 @@ Gromadzenie Danych apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6165,7 +6209,7 @@ Czy na pewno chcesz zamknąć swoje konto Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6173,7 +6217,7 @@ Strefa Zagrożenia apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6181,7 +6225,7 @@ Zamknij Konto apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6213,7 +6257,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6221,7 +6265,7 @@ Ups! Wystąpił błąd podczas konfigurowania uwierzytelniania biometrycznego. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6237,7 +6281,7 @@ Punkty Odniesienia apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6293,7 +6337,7 @@ Alternatywa apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6301,7 +6345,7 @@ Aplikacja apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6309,7 +6353,7 @@ Budżetowanie apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6325,47 +6369,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6373,7 +6421,7 @@ Biuro Rodzinne apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6381,7 +6429,7 @@ Inwestor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6393,7 +6441,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6405,7 +6453,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6413,7 +6461,7 @@ Prywatność apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6421,7 +6469,7 @@ Oprogramowanie apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6429,7 +6477,7 @@ Narzędzie apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6437,7 +6485,7 @@ Doświadczenie Użytkownika apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6445,7 +6493,7 @@ Majątek apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6453,7 +6501,7 @@ Zarządzanie Majątkiem apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6613,7 +6661,7 @@ Błąd apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6661,11 +6709,11 @@ Anuluj apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6717,7 +6765,7 @@ Zamknij apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6801,7 +6849,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6913,7 +6961,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7147,7 +7195,7 @@ Czy na pewno chcesz usunąć klucz API?? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7175,7 +7223,7 @@ Nie udało się wygenerować klucza API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7183,7 +7231,7 @@ Ustaw ten klucz API w samodzielnie hostowanym środowisku: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7191,7 +7239,7 @@ Klucz API dostawcy danych Premium Ghostfolio apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7199,7 +7247,7 @@ Czy na pewno chcesz wygenerować nowy klucz API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7239,7 +7287,7 @@ Zapisz apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,7 +7307,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7315,7 +7363,15 @@ Wprowadź swój klucz API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7323,7 +7379,7 @@ Prompt AI został skopiowany do schowka apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7331,7 +7387,7 @@ Link został skopiowany do schowka apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7339,7 +7395,7 @@ Leniwy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Natychmiastowy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Domyślna cena rynkowa apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Tryb apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Selektor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ Nagłówki żądań HTTP apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ koniec dnia apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ w czasie rzeczywistym apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Otwórz Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Zmiana libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenia @@ -7543,7 +7607,7 @@ Token bezpieczeństwa apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Czy napewno chcesz wygenerować nowy token bezpieczeństwa dla tego użytkownika? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () jest już w użyciu. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ Wystąpił błąd podczas aktualizacji do (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Zatwierdź apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ z dostępem API dla apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Czy na pewno chcesz usunąć ten element? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Konto użytkownika demonstracyjnego zostało zsynchronizowane. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 812d24b20..2bcd7c401 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -6,7 +6,7 @@ O risco de perda em investimentos pode ser substancial. Não é aconselhável investir dinheiro que possa vir a precisar a curto prazo. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -34,7 +34,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -81,20 +81,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Pretende realmente revogar este acesso concedido? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -110,7 +102,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -122,7 +114,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -154,7 +146,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -166,7 +158,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -182,7 +174,7 @@ Total libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -190,11 +182,11 @@ Moeda apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -210,7 +202,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -230,7 +222,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -258,11 +250,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -274,7 +266,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -306,7 +298,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -322,7 +314,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -342,7 +334,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -374,7 +366,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -458,7 +450,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -534,7 +526,7 @@ Filtrar por... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -546,7 +538,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -554,7 +546,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -610,7 +602,7 @@ Deseja realmente eliminar este cupão? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -618,7 +610,7 @@ Deseja realmente limpar a cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -626,7 +618,7 @@ Por favor, defina a sua mensagem do sistema: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -718,7 +710,7 @@ Deseja realmente excluir este utilizador? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -765,6 +757,18 @@ 186 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Comparar com... @@ -790,7 +794,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -802,7 +806,7 @@ Referência apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -866,7 +870,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -970,7 +974,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1014,7 +1018,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1066,7 +1070,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -1078,7 +1082,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -1126,7 +1130,7 @@ Por favor, insira o valor do seu fundo de emergência: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -1162,7 +1166,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1170,7 +1174,7 @@ Setor apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1182,7 +1186,7 @@ País apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -1202,11 +1206,11 @@ Setores apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1222,11 +1226,11 @@ Países apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1262,11 +1266,11 @@ Alocação libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -1282,7 +1286,7 @@ Mostrar tudo libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -1294,7 +1298,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1302,11 +1306,11 @@ AATD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1314,11 +1318,11 @@ 1A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1326,11 +1330,19 @@ 5A apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -1338,11 +1350,11 @@ Máx apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -1386,7 +1398,7 @@ OK apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -1454,11 +1466,11 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -1466,7 +1478,7 @@ Por favor, insira o seu código de cupão: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -1474,7 +1486,7 @@ Não foi possível resgatar o código de cupão apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -1482,7 +1494,7 @@ Código de cupão foi resgatado apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -1490,7 +1502,7 @@ Atualizar apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -1498,7 +1510,7 @@ Deseja realmente remover este método de início de sessão? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -1518,7 +1530,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -1542,7 +1554,7 @@ Vista do Apresentador apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -1574,11 +1586,11 @@ Localidade apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -1586,7 +1598,7 @@ Formato de números e datas apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -1594,7 +1606,7 @@ Modo Zen apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -1606,7 +1618,7 @@ Aparência apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -1614,7 +1626,7 @@ Claro apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -1622,7 +1634,7 @@ Escuro apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -1630,7 +1642,7 @@ Iniciar sessão com impressão digital apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -1638,7 +1650,7 @@ Funcionalidades Experimentais apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -1650,7 +1662,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -1922,7 +1934,7 @@ Visão geral apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -1958,7 +1970,7 @@ Mercados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -2014,7 +2026,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -2046,7 +2058,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -2062,7 +2074,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -2094,7 +2106,7 @@ Nome, símbolo or ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2126,7 +2138,7 @@ Nota apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -2346,7 +2358,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2354,7 +2366,7 @@ Topo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -2362,7 +2374,7 @@ Fundo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -2370,7 +2382,7 @@ Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -2378,7 +2390,7 @@ Cronograma de Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -2498,7 +2510,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -2510,7 +2522,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -2702,7 +2714,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -2786,11 +2798,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -2850,7 +2862,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -3102,7 +3114,7 @@ Mapeamento de Símbolo apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -3166,7 +3178,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3194,7 +3206,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3206,7 +3218,7 @@ Cronograma de Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3218,11 +3230,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -3262,7 +3274,7 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3333,6 +3345,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Satélite @@ -3346,7 +3366,7 @@ Proteção para informações sensíveis, como desempenhos absolutos e valores quantitativos apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -3354,7 +3374,7 @@ Experiência sem distrações para tempos turbulentos apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -3362,7 +3382,7 @@ Acesso antecipado a funcionalidades futuras apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -3386,7 +3406,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -3402,7 +3422,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -3418,7 +3438,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -3434,7 +3454,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -3482,7 +3502,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -3566,7 +3586,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3582,7 +3602,19 @@ Pagamento único, sem renovação automática. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3590,7 +3622,7 @@ É gratuito. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -3622,7 +3654,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -3666,7 +3698,7 @@ Suporte por Email e Chat apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3710,7 +3742,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -3734,7 +3766,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3798,7 +3830,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -3814,11 +3846,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -3829,12 +3861,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Deseja mesmo eliminar esta plataforma? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -3970,7 +4010,7 @@ Série Atual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -3978,7 +4018,7 @@ Série mais Longa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4022,7 +4062,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -4162,7 +4202,7 @@ Software de código aberto apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -4186,7 +4226,7 @@ Configuração do raspador apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -4425,20 +4465,12 @@ 43 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETFs sem países apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -4446,7 +4478,7 @@ ETFs sem setores apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -4582,7 +4614,7 @@ Autenticação biométrica apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4674,7 +4706,7 @@ Exportar dados apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4682,7 +4714,7 @@ Moedas apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html @@ -4729,6 +4761,18 @@ 7 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Descubra as últimas atualizações e insights do Ghostfolio sobre finanças pessoais @@ -5280,7 +5324,7 @@ Suíça apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5292,7 +5336,7 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5320,7 +5364,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5504,7 +5548,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5644,7 +5688,7 @@ Ops! Não foi possível analisar os dados históricos. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5652,7 +5696,7 @@ Você realmente deseja excluir esta mensagem do sistema? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5712,7 +5756,7 @@ O preço de mercado atual é apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5720,7 +5764,7 @@ Teste apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5808,15 +5852,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5824,7 +5868,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5840,7 +5884,7 @@ Desempenho absoluto de ativos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5848,7 +5892,7 @@ Desempenho de ativos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5856,7 +5900,7 @@ Desempenho absoluto da moeda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5864,7 +5908,7 @@ Desempenho da moeda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5872,7 +5916,7 @@ Semana até agora libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5880,11 +5924,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5892,7 +5936,7 @@ Do mês até a data libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5900,11 +5944,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5912,7 +5956,7 @@ No acumulado do ano libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5948,7 +5992,7 @@ ano apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5960,7 +6004,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5968,11 +6012,11 @@ anos apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5988,7 +6032,7 @@ Coleta de dados apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6165,7 +6209,7 @@ Você realmente deseja encerrar sua conta Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6173,7 +6217,7 @@ Zona de perigo apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6181,7 +6225,7 @@ Fechar conta apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6213,7 +6257,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6221,7 +6265,7 @@ Ops! Ocorreu um erro ao configurar a autenticação biométrica. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6237,7 +6281,7 @@ Referências apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6293,7 +6337,7 @@ Alternativo apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6301,7 +6345,7 @@ Aplicativo apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6309,7 +6353,7 @@ Orçamento apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6325,47 +6369,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6373,7 +6421,7 @@ Escritório Familiar apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6381,7 +6429,7 @@ Investidor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6393,7 +6441,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6405,7 +6453,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6413,7 +6461,7 @@ Privacidade apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6421,7 +6469,7 @@ Programas apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6429,7 +6477,7 @@ Ferramenta apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6437,7 +6485,7 @@ Experiência do usuário apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6445,7 +6493,7 @@ Fortuna apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6453,7 +6501,7 @@ Gestão de patrimônio apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6613,7 +6661,7 @@ Erro apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6661,11 +6709,11 @@ Cancelar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6717,7 +6765,7 @@ Fechar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6801,7 +6849,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6913,7 +6961,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7147,7 +7195,7 @@ Você realmente deseja excluir a chave de API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7175,7 +7223,7 @@ Não foi possível gerar uma chave de API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7183,7 +7231,7 @@ Defina esta chave de API no seu ambiente auto-hospedado: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7191,7 +7239,7 @@ Chave de API do Provedor de Dados do Ghostfolio Premium apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7199,7 +7247,7 @@ Você realmente deseja gerar uma nova chave de API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7239,7 +7287,7 @@ Guardar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,7 +7307,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7315,7 +7363,15 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7323,7 +7379,7 @@ AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7331,7 +7387,7 @@ O link foi copiado para a área de transferência apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7339,7 +7395,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Preço de mercado padrão apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Mudar libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenia @@ -7543,7 +7607,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ with API access for apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index 357fb9f83..421ef3855 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -187,7 +187,7 @@ Alım satımda kayıp riski büyük boyutta olabilir. Kısa vadede ihtiyaç duyabileceğiniz parayla yatırım yapmak tavsiye edilmez. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -215,7 +215,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -262,20 +262,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? Bu erişim iznini geri almayı gerçekten istiyor musunuz? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -291,7 +283,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -307,7 +299,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -319,7 +311,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -351,7 +343,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -363,7 +355,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -379,7 +371,7 @@ Toplam libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -387,11 +379,11 @@ Para Birimi apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -407,7 +399,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -439,11 +431,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -455,7 +447,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -487,7 +479,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -503,7 +495,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -523,7 +515,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -555,7 +547,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -639,7 +631,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -715,27 +707,19 @@ Para Birimleri apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html 96 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries Ülkesi Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -743,7 +727,7 @@ Sektörü Olmayan ETF’ler apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -751,7 +735,7 @@ Filtrele... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -763,7 +747,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -771,7 +755,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -835,7 +819,7 @@ Sektör apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -847,7 +831,7 @@ Ülke apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -867,11 +851,11 @@ Sektörler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -887,11 +871,11 @@ Ülkeler apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -903,7 +887,7 @@ Sembol Eşleştirme apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -919,7 +903,7 @@ Veri Toplayıcı Yapılandırması apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -927,7 +911,7 @@ Not apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -951,7 +935,7 @@ Ad, sembol ya da ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -971,7 +955,7 @@ Bu kuponu gerçekten silmek istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -979,7 +963,7 @@ Önbelleği temizlemeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -987,7 +971,7 @@ Lütfen sistem mesajınızı belirleyin: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -1119,11 +1103,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1134,12 +1118,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? Bu platformu silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -1163,7 +1155,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -1187,7 +1179,7 @@ Bu kullanıcıyı silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -1250,6 +1242,18 @@ 254 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Karşılaştır... @@ -1283,7 +1287,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -1295,7 +1299,7 @@ Karşılaştırma Ölçütü apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1359,7 +1363,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1499,7 +1503,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1547,7 +1551,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1591,7 +1595,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1643,7 +1647,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -1655,7 +1659,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -1723,7 +1727,7 @@ Lütfen acil durum yedeği meblağını giriniz: apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -1759,7 +1763,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1811,7 +1815,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -1831,7 +1835,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -1847,7 +1851,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -1863,7 +1867,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -1875,7 +1879,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -1891,7 +1895,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -1947,7 +1951,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -1959,7 +1963,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -1967,11 +1971,11 @@ YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -1979,11 +1983,11 @@ 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -1991,11 +1995,19 @@ 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -2003,11 +2015,11 @@ Maks. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -2051,7 +2063,7 @@ Tamam apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -2287,7 +2299,7 @@ Özet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -2426,6 +2438,18 @@ 225 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Son Ghostfolio güncellemelerini ve kişisel finans hakkındaki en son bilgileri keşfedin. @@ -2551,7 +2575,7 @@ Zen Modu apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -2595,7 +2619,7 @@ Açık Kaynak Yazılım apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -2607,7 +2631,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -2619,7 +2643,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -2675,7 +2699,7 @@ Piyasalar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -3095,7 +3119,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3127,7 +3151,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -3535,7 +3559,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3563,7 +3587,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3591,7 +3615,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -3599,7 +3623,7 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3607,7 +3631,7 @@ Üst apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -3615,7 +3639,7 @@ Alt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -3623,7 +3647,7 @@ Portföyün Gelişimi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -3631,7 +3655,7 @@ Yatırım Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -3639,7 +3663,7 @@ Güncel Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -3647,7 +3671,7 @@ En Uzun Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -3655,7 +3679,7 @@ Temettü Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3831,7 +3855,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -3847,7 +3871,7 @@ E-posta ve Sohbet Desteği apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -3863,7 +3887,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -3871,7 +3895,19 @@ Tek seferlik ödeme, otomatik yenileme yok. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -3879,7 +3915,7 @@ Ücretsiz. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -4224,7 +4260,7 @@ İsviçre apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -4236,7 +4272,7 @@ Küresel apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -4300,11 +4336,11 @@ Otomatik apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -4312,7 +4348,7 @@ Lütfen kupon kodunuzu girin: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -4320,7 +4356,7 @@ Kupon kodu kullanılamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -4328,7 +4364,7 @@ Kupon kodu kullanıldı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -4336,7 +4372,7 @@ Yeniden Yükle apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -4344,7 +4380,7 @@ Bu giriş yöntemini kaldırmayı gerçekten istiyor musunuz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -4376,7 +4412,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -4400,7 +4436,7 @@ Sunum Görünümü apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -4408,7 +4444,7 @@ Gerçek performans ve miktar değerleri gibi hassas bilgilerin saklanması için apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -4432,11 +4468,11 @@ Yerel Ayarlar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -4444,7 +4480,7 @@ Tarih ve Sayı Formatları apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -4452,7 +4488,7 @@ Görünüm apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -4460,7 +4496,7 @@ Açık apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -4468,7 +4504,7 @@ Koyu apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -4476,7 +4512,7 @@ Çalkantılı zamanlar için dikkat dağıtmayan bir deneyim apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -4492,7 +4528,7 @@ Biyometrik Kimlik Doğrulama apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -4500,7 +4536,7 @@ Parmak iziyle oturum aç apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -4508,7 +4544,7 @@ Deneysel Özellikler apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -4516,7 +4552,7 @@ Gelecek özelliklere göz atın apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -4528,7 +4564,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -4540,7 +4576,7 @@ Verileri Dışa Aktar apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -4644,7 +4680,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -4728,11 +4764,11 @@ Dağılım libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4748,7 +4784,7 @@ Tümünü göster libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -4788,11 +4824,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4820,11 +4856,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4971,6 +5007,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Uydu @@ -4992,7 +5036,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5036,7 +5080,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -5328,7 +5372,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -5504,7 +5548,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -5644,7 +5688,7 @@ Hay Allah! Geçmiş veriler ayrıştırılamadı. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -5652,7 +5696,7 @@ Bu sistem mesajını silmeyi gerçekten istiyor musunuz? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -5712,7 +5756,7 @@ Şu anki piyasa fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5720,7 +5764,7 @@ Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5808,15 +5852,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5824,7 +5868,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5840,7 +5884,7 @@ Mutlak Varlık Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5848,7 +5892,7 @@ Varlık Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5856,7 +5900,7 @@ Mutlak Para Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5864,7 +5908,7 @@ Para Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5872,7 +5916,7 @@ Hafta içi libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5880,11 +5924,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5892,7 +5936,7 @@ Ay içi libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5900,11 +5944,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5912,7 +5956,7 @@ Yıl içi libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5948,7 +5992,7 @@ Yıl apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5960,7 +6004,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5968,11 +6012,11 @@ Yıllar apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5988,7 +6032,7 @@ Veri Toplama apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6165,7 +6209,7 @@ Ghostfolio hesabınızı kapatmak istediğinize emin misiniz? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6173,7 +6217,7 @@ Tehlikeli Alan apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6181,7 +6225,7 @@ Hesabı Kapat apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6213,7 +6257,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6221,7 +6265,7 @@ Oops! Biyometrik kimlik doğrulama ayarlanırken bir hata oluştu. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6237,7 +6281,7 @@ Kıyaslamalar apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6293,7 +6337,7 @@ Alternatif apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6301,7 +6345,7 @@ App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6309,7 +6353,7 @@ Bütçeleme apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6325,47 +6369,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6373,7 +6421,7 @@ Aile Ofisi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6381,7 +6429,7 @@ Yatırımcı apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6393,7 +6441,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6405,7 +6453,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6413,7 +6461,7 @@ Gizlilik apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6421,7 +6469,7 @@ Yazılım apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6429,7 +6477,7 @@ Araç apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6437,7 +6485,7 @@ Kullanıcı Deneyimi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6445,7 +6493,7 @@ Zenginlik apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6453,7 +6501,7 @@ Zenginlik Yönetimi apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6613,7 +6661,7 @@ Hata apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6661,11 +6709,11 @@ İptal Et apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6717,7 +6765,7 @@ Kapat apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6801,7 +6849,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6913,7 +6961,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7147,7 +7195,7 @@ API anahtarını silmek istediğinize emin misiniz? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7175,7 +7223,7 @@ API anahtarı oluşturulamadı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7183,7 +7231,7 @@ Bu API anahtarını kendi barındırılan ortamınıza ayarlayın: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7191,7 +7239,7 @@ Ghostfolio Premium Veri Sağlayıcı API Anahtarı apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7199,7 +7247,7 @@ Yeni bir API anahtarı oluşturmak istediğinize emin misiniz? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7239,7 +7287,7 @@ Kaydet apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7259,7 +7307,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7315,7 +7363,15 @@ Lütfen Ghostfolio API anahtarınızı girin. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7323,7 +7379,7 @@ Yapay zeka istemi panoya kopyalandı apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7331,7 +7387,7 @@ Bağlantı panoya kopyalandı apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7339,7 +7395,7 @@ Tembel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Anında apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Varsayılan Piyasa Fiyatı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Mod apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Seçici apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ HTTP İstek Başlıkları apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ gün sonu apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ gerçek zamanlı apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Duck.ai’yi aç apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Değişim libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Ermenistan @@ -7543,7 +7607,7 @@ Güvenlik belirteci apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Bu kullanıcı için yeni bir güvenlik belirteci oluşturmak istediğinize emin misiniz? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ Güncelleştirilirken bir hata oluştu (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Uygula apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ API erişimi için apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Bu öğeyi silmek istediğinize emin misiniz? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Demo kullanıcı hesabı senkronize edildi. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 3375f4e2c..2fc389030 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -102,7 +102,7 @@ Ризик втрат у торгівлі може бути суттєвим. Не рекомендується інвестувати гроші, які можуть знадобитися в короткостроковій перспективі. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -295,7 +295,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -371,15 +371,7 @@ Посилання скопійовано в буфер обміну apps/client/src/app/components/access-table/access-table.component.ts - 101 - - - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 + 99 @@ -387,7 +379,7 @@ Ви дійсно хочете відкликати цей наданий доступ? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -403,7 +395,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -419,7 +411,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -451,7 +443,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -483,7 +475,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -495,7 +487,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -511,7 +503,7 @@ Загалом libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -519,11 +511,11 @@ Валюта apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -539,7 +531,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -571,11 +563,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -587,7 +579,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -619,7 +611,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -635,7 +627,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -655,7 +647,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -711,7 +703,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -735,7 +727,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -843,7 +835,7 @@ Порівняльні показники apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -851,27 +843,19 @@ Валюти apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html 96 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries ETF без країн apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -879,7 +863,7 @@ ETF без секторів apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -887,7 +871,7 @@ Фільтрувати за... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -915,7 +899,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -923,7 +907,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -1011,7 +995,7 @@ Помилка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -1019,7 +1003,7 @@ Поточна ринкова ціна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -1035,7 +1019,7 @@ Сектор apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1047,7 +1031,7 @@ Країна apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -1067,11 +1051,11 @@ Сектори apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1087,11 +1071,11 @@ Країни apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -1103,7 +1087,7 @@ Зіставлення символів apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -1119,7 +1103,7 @@ Конфігурація скребка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -1127,7 +1111,7 @@ Тест apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -1135,11 +1119,11 @@ URL apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1150,12 +1134,20 @@ 25 + + Asset profile has been saved + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Note Примітка apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1203,7 +1195,7 @@ Назва, символ або ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1231,7 +1223,7 @@ Ви дійсно хочете видалити цей купон? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -1239,7 +1231,7 @@ Ви дійсно хочете видалити це системне повідомлення? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -1247,7 +1239,7 @@ Ви дійсно хочете очистити кеш? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -1255,7 +1247,7 @@ Будь ласка, встановіть ваше системне повідомлення: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -1311,7 +1303,7 @@ Збір даних apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -1383,7 +1375,7 @@ Ви дійсно хочете видалити цю платформу? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -1407,7 +1399,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -1499,7 +1491,7 @@ Ви дійсно хочете видалити ключ API? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -1507,7 +1499,7 @@ Будь ласка, введіть ваш ключ API Ghostfolio. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 @@ -1543,7 +1535,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1615,7 +1607,7 @@ Ви дійсно хочете видалити цього користувача? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -1666,6 +1658,18 @@ 254 + + Could not validate form + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... Порівняти з... @@ -1699,7 +1703,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -1711,7 +1715,7 @@ Порівняльний показник apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1751,7 +1755,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -1767,7 +1771,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -1795,7 +1799,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1811,7 +1815,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -1855,7 +1859,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -2071,7 +2075,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -2119,7 +2123,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -2195,7 +2199,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -2207,7 +2211,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -2275,7 +2279,7 @@ Зберегти apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -2295,7 +2299,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -2323,7 +2327,7 @@ Будь ласка, встановіть суму вашого резервного фонду. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -2419,7 +2423,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -2439,7 +2443,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -2455,7 +2459,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -2471,7 +2475,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -2483,7 +2487,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -2499,7 +2503,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -2547,7 +2551,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -2555,11 +2559,11 @@ З початку року apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -2567,11 +2571,11 @@ 1 рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -2579,11 +2583,19 @@ 5 років apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -2591,11 +2603,11 @@ Максимум apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -2647,7 +2659,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2695,7 +2707,7 @@ Не вдалося згенерувати ключ API apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -2703,7 +2715,7 @@ ОК apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -2719,7 +2731,7 @@ Встановіть цей ключ API у вашому self-hosted середовищі: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -2727,7 +2739,7 @@ Ключ API Ghostfolio Premium Data Provider apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -2735,7 +2747,7 @@ Ви дійсно хочете згенерувати новий ключ API? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -2743,7 +2755,7 @@ Не вдалося обміняти код купона apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -2751,7 +2763,7 @@ Код купона був обміняний apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -2759,7 +2771,7 @@ Перезавантажити apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -2767,7 +2779,7 @@ Будь ласка, введіть ваш код купона. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -2787,7 +2799,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -2811,11 +2823,11 @@ Автоматичний apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2823,7 +2835,7 @@ Ви дійсно хочете закрити ваш обліковий запис Ghostfolio? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -2831,7 +2843,7 @@ Ви дійсно хочете вилучити цей спосіб входу? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -2839,7 +2851,7 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -2847,7 +2859,7 @@ Упс! Виникла помилка під час налаштування біометричної автентифікації. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -2855,7 +2867,7 @@ Режим доповідача apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -2863,7 +2875,7 @@ Захист конфіденційної інформації, такої як абсолютні показники та кількісні значення apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -2895,11 +2907,11 @@ Локалізація apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -2907,7 +2919,7 @@ Формат дати та чисел apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -2915,7 +2927,7 @@ Зовнішній вигляд apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2923,7 +2935,7 @@ Світлий apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2931,7 +2943,7 @@ Темний apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2939,7 +2951,7 @@ Режим дзен apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -2951,7 +2963,7 @@ Досвід без відволікань для неспокійних часів apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -2967,7 +2979,7 @@ Біометрична аутентифікація apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -2975,7 +2987,7 @@ Увійти з відбитком пальця apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -2983,7 +2995,7 @@ Експериментальні функції apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2991,7 +3003,7 @@ Попередній перегляд майбутніх функцій apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -2999,7 +3011,7 @@ Експортувати дані apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -3007,7 +3019,7 @@ Зона небезпеки apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -3015,7 +3027,7 @@ Закрити обліковий запис apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -3335,7 +3347,7 @@ Огляд apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -3482,6 +3494,18 @@ 225 + + Could not parse scraper configuration + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance Відкрийте для себе останні оновлення Ghostfolio та виявлення особистих фінансів @@ -3664,7 +3688,7 @@ Програмне забезпечення з відкритим кодом apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -3676,7 +3700,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -3688,7 +3712,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -3744,7 +3768,7 @@ Ринки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -4160,7 +4184,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -4256,7 +4280,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -4288,7 +4312,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -4756,7 +4780,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -4784,7 +4808,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4804,15 +4828,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -4820,7 +4844,7 @@ here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -4828,7 +4852,7 @@ Щомісячно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4836,7 +4860,7 @@ Щорічно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4852,7 +4876,7 @@ Абсолютна прибутковість активів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -4860,7 +4884,7 @@ Прибутковість активів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -4868,7 +4892,7 @@ Абсолютна прибутковість валюти apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -4876,7 +4900,7 @@ Прибутковість валюти apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -4884,7 +4908,7 @@ Топ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -4892,7 +4916,7 @@ Низ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -4900,7 +4924,7 @@ Еволюція портфеля apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -4908,7 +4932,7 @@ Інвестиційний графік apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -4916,7 +4940,7 @@ Поточна серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -4924,7 +4948,7 @@ Найдовша серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4932,7 +4956,7 @@ Графік дивідендів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -5148,7 +5172,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -5164,7 +5188,7 @@ Підтримка електронної пошти та чату apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -5172,7 +5196,19 @@ Разова оплата, без автоматичного поновлення. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -5180,7 +5216,7 @@ Це безкоштовно. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -5387,7 +5423,7 @@ Швейцарія apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -5399,7 +5435,7 @@ Глобальний apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -5411,7 +5447,7 @@ Альтернатива apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -5419,7 +5455,7 @@ Додаток apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -5427,7 +5463,7 @@ Бюджетування apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -5443,47 +5479,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -5491,7 +5531,7 @@ Сімейний офіс apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -5499,7 +5539,7 @@ Інвестор apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -5511,7 +5551,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -5523,7 +5563,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -5531,7 +5571,7 @@ Конфіденційність apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -5539,7 +5579,7 @@ Програмне забезпечення apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -5547,7 +5587,7 @@ Інструмент apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -5555,7 +5595,7 @@ Користувацький досвід apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -5563,7 +5603,7 @@ Багатство apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -5571,7 +5611,7 @@ Управління багатством apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -5791,7 +5831,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -5979,7 +6019,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -6111,7 +6151,7 @@ Тиждень до дати libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -6119,11 +6159,11 @@ WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -6131,7 +6171,7 @@ Місяць до дати libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -6139,11 +6179,11 @@ MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -6151,7 +6191,7 @@ Рік до дати libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -6159,7 +6199,7 @@ рік apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -6171,7 +6211,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -6179,11 +6219,11 @@ роки apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -6267,7 +6307,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -6375,7 +6415,7 @@ Упс! Не вдалося отримати історичні дані. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -6383,11 +6423,11 @@ Розподіл libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -6403,7 +6443,7 @@ Показати все libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -6443,11 +6483,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6475,11 +6515,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -6507,11 +6547,11 @@ Скасувати apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6571,7 +6611,7 @@ Закрити apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6734,6 +6774,14 @@ 28 + + Everything in Basic, plus + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + Satellite Супутник @@ -6755,7 +6803,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6799,7 +6847,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -7326,12 +7374,20 @@ 174 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 + + AI prompt has been copied to the clipboard Запит AI скопійовано в буфер обміну apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7339,7 +7395,7 @@ Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7347,7 +7403,7 @@ Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7355,7 +7411,7 @@ Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7363,7 +7419,7 @@ Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7371,7 +7427,7 @@ Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7379,7 +7435,7 @@ HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7387,7 +7443,7 @@ end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7395,7 +7451,7 @@ real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7403,7 +7459,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7419,7 +7475,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7439,7 +7495,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7474,6 +7530,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia Armenia @@ -7543,7 +7607,7 @@ Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7555,7 +7619,7 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7563,7 +7627,7 @@ Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7628,7 +7692,7 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7636,7 +7700,7 @@ An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7644,7 +7708,7 @@ Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7652,7 +7716,7 @@ with API access for apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7732,7 +7796,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7773,7 +7837,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7951,7 +8015,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7963,7 +8027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7987,7 +8051,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index 9b0db6cff..a6907698d 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -203,7 +203,7 @@ The risk of loss in trading can be substantial. It is not advisable to invest money you may need in the short term. apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -228,7 +228,7 @@ please apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -271,18 +271,11 @@ 87 - - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -297,7 +290,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -312,7 +305,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -341,7 +334,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -373,7 +366,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -385,7 +378,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -400,18 +393,18 @@ Total libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 Currency apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -427,7 +420,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -458,11 +451,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -474,7 +467,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -505,7 +498,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -520,7 +513,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -540,7 +533,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -573,7 +566,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -588,7 +581,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -711,32 +704,25 @@ Currencies apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html 96 - - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 ETFs without Sectors apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -750,7 +736,7 @@ Filter by... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -761,7 +747,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -769,7 +755,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -833,7 +819,7 @@ Oops! Could not parse historical data. libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -869,7 +855,7 @@ Sector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -880,7 +866,7 @@ Country apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -899,11 +885,11 @@ Sectors apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -918,11 +904,11 @@ Countries apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -933,7 +919,7 @@ Symbol Mapping apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -947,14 +933,14 @@ Scraper Configuration apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 Note apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -990,7 +976,7 @@ Name, symbol or ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1009,28 +995,28 @@ Do you really want to delete this coupon? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 Do you really want to delete this system message? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 Do you really want to flush the cache? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 Please set your system message: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -1139,11 +1125,11 @@ Url apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1154,11 +1140,18 @@ 25 + + Asset profile has been saved + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 @@ -1179,7 +1172,7 @@ Current year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -1243,7 +1236,7 @@ Do you really want to delete this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -1300,6 +1293,17 @@ 254 + + Could not validate form + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... @@ -1330,7 +1334,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -1341,7 +1345,7 @@ Benchmark apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1401,7 +1405,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1526,7 +1530,7 @@ Current week apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1570,7 +1574,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1613,7 +1617,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1671,7 +1675,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -1682,7 +1686,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -1742,7 +1746,7 @@ Please set the amount of your emergency fund. apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -1775,7 +1779,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1811,7 +1815,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -1830,7 +1834,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -1845,7 +1849,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -1860,7 +1864,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -1871,7 +1875,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -1886,7 +1890,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -1939,7 +1943,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -1950,51 +1954,58 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 YTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 1Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 5Y apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 Max apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -2022,28 +2033,28 @@ Please enter your coupon code. apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 Could not redeem coupon code apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 Coupon code has been redeemed apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 Reload apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -2062,7 +2073,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -2083,32 +2094,32 @@ Auto apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 Do you really want to remove this sign in method? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 Presenter View apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 Protection for sensitive information like absolute performances and quantity values apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -2129,46 +2140,46 @@ Locale apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 Date and number format apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 Appearance apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 Light apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 Dark apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 Zen Mode apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -2179,7 +2190,7 @@ Distraction-free experience for turbulent times apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 @@ -2193,28 +2204,28 @@ Biometric Authentication apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 Sign in with fingerprint apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 Experimental Features apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 Sneak peek at upcoming functionality apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -2225,7 +2236,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2236,7 +2247,7 @@ Export Data apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -2276,7 +2287,7 @@ Okay apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -2523,7 +2534,7 @@ Overview apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -2661,6 +2672,17 @@ 225 + + Could not parse scraper configuration + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance @@ -2801,7 +2823,7 @@ Open Source Software apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -2812,7 +2834,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -2824,7 +2846,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -2877,7 +2899,7 @@ Markets apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -3068,6 +3090,13 @@ 172 + + Everything in Basic, plus + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + trading stocks, ETFs or cryptocurrencies on multiple platforms @@ -3233,7 +3262,7 @@ with your university e-mail address apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -3319,7 +3348,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3351,7 +3380,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -3730,7 +3759,7 @@ Looking for a student discount? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -3757,7 +3786,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3782,63 +3811,63 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 Top apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 Bottom apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 Portfolio Evolution apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 Investment Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -3998,7 +4027,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -4012,7 +4041,7 @@ Email and Chat Support apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -4027,21 +4056,32 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 One-time payment, no auto-renewal. apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 It’s free. apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -4363,7 +4403,7 @@ Switzerland apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -4374,7 +4414,7 @@ Global apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -4423,7 +4463,7 @@ Request it apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -4572,7 +4612,7 @@ contact us apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -4647,11 +4687,11 @@ Allocation libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -4666,7 +4706,7 @@ Show all libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -4703,11 +4743,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4734,11 +4774,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -4889,7 +4929,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -4930,7 +4970,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -5230,14 +5270,14 @@ The current market price is apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 Test apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5301,7 +5341,7 @@ Absolute Currency Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5315,7 +5355,7 @@ Absolute Asset Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5330,79 +5370,79 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 here apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 Asset Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 Currency Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 Year to date libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 Week to date libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 Month to date libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 MTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 WTD apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5434,7 +5474,7 @@ year apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5446,18 +5486,18 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 years apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -5494,7 +5534,7 @@ Data Gathering apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -5628,21 +5668,21 @@ Close Account apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 Do you really want to close your Ghostfolio account? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 Danger Zone apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -5670,14 +5710,14 @@ Include in apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 Oops! There was an error setting up biometric authentication. apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -5712,7 +5752,7 @@ Benchmarks apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -5740,7 +5780,7 @@ Wealth apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -5755,47 +5795,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -5837,35 +5881,35 @@ User Experience apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 App apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 Tool apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 Investor apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 Wealth Management apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -5900,14 +5944,14 @@ Alternative apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 Family Office apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -5918,14 +5962,14 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 Software apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -5953,7 +5997,7 @@ Budgeting apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -5971,7 +6015,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6006,7 +6050,7 @@ Privacy apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6027,18 +6071,18 @@ Error apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 Cancel apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6117,7 +6161,7 @@ Close apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6216,7 +6260,7 @@ If you plan to open an account at apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6294,7 +6338,7 @@ to use our referral link and get a Ghostfolio Premium membership for one year apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -6505,7 +6549,7 @@ Do you really want to delete the API key? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -6551,28 +6595,28 @@ Could not generate an API key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 Do you really want to generate a new API key? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 Ghostfolio Premium Data Provider API Key apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 Set this API key in your self-hosted environment: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -6593,7 +6637,7 @@ Save apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6613,7 +6657,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -6665,84 +6709,91 @@ Please enter your Ghostfolio API key. apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 Link has been copied to the clipboard apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 Mode apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 Default Market Price apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 Selector apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 Instant apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 Lazy apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 HTTP Request Headers apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 real-time apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 end of day apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -6756,7 +6807,7 @@ Change libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -6775,7 +6826,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -6807,6 +6858,13 @@ 97 + + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia @@ -6867,21 +6925,21 @@ Do you really want to generate a new security token for this user? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 Find account, holding or page... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 Security token apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -6943,28 +7001,28 @@ () is already in use. apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 An error occurred while updating to (). apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 Apply apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 with API access for apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7014,7 +7072,7 @@ Do you really want to delete this item? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7058,7 +7116,7 @@ Demo user account has been synced. apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7210,7 +7268,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7221,7 +7279,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7242,7 +7300,7 @@ Current month apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index afa49fefd..7ec9d85a0 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -216,7 +216,7 @@ 交易存在巨大亏损风险,因此不应投入您短期内可能急需的资金。 apps/client/src/app/components/footer/footer.component.html - 171 + 182 @@ -244,7 +244,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 336 + 333 @@ -291,20 +291,12 @@ 87 - - plus - plus - - apps/client/src/app/pages/pricing/pricing-page.html - 202 - - Do you really want to revoke this granted access? 您真的要撤销此访问权限吗? apps/client/src/app/components/access-table/access-table.component.ts - 115 + 113 @@ -320,7 +312,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 136 + 143 @@ -336,7 +328,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 86 + 93 @@ -368,7 +360,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 311 + 309 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -400,7 +392,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 43 + 50 libs/ui/src/lib/activities-table/activities-table.component.html @@ -412,7 +404,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 28 + 23 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -428,7 +420,7 @@ 总计 libs/ui/src/lib/accounts-table/accounts-table.component.html - 55 + 62 @@ -436,11 +428,11 @@ 货币 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 201 + 199 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 318 + 316 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -456,7 +448,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 65 + 72 libs/ui/src/lib/activities-table/activities-table.component.html @@ -488,11 +480,11 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 171 + 178 libs/ui/src/lib/accounts-table/accounts-table.component.html - 206 + 213 libs/ui/src/lib/activities-table/activities-table.component.html @@ -504,7 +496,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 98 + 93 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -536,7 +528,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 313 + 320 libs/ui/src/lib/activities-table/activities-table.component.html @@ -552,7 +544,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 86 + 87 apps/client/src/app/components/admin-overview/admin-overview.html @@ -572,7 +564,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 324 + 331 libs/ui/src/lib/activities-table/activities-table.component.html @@ -608,7 +600,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 574 + 448 @@ -624,7 +616,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 179 + 180 apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.html @@ -760,27 +752,19 @@ 货币 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 132 + 131 apps/client/src/app/pages/public/public-page.html 96 - - Everything in - Everything in - - apps/client/src/app/pages/pricing/pricing-page.html - 199 - - ETFs without Countries 没有国家的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 137 + 136 @@ -788,7 +772,7 @@ 无行业类别的 ETF apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 142 + 141 @@ -804,7 +788,7 @@ 过滤... apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 386 + 385 @@ -816,7 +800,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 219 + 217 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -824,7 +808,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 50 + 45 @@ -880,7 +864,7 @@ 哎呀!无法解析历史数据。 libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts - 263 + 262 @@ -912,7 +896,7 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 264 + 262 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -924,7 +908,7 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 275 + 273 apps/client/src/app/components/admin-users/admin-users.html @@ -944,11 +928,11 @@ 行业 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 281 + 279 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 522 + 396 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -964,11 +948,11 @@ 国家 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 291 + 289 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 533 + 407 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -980,7 +964,7 @@ 代码映射 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 386 + 384 @@ -996,7 +980,7 @@ 刮削配置 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 411 + 471 @@ -1004,7 +988,7 @@ 笔记 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 558 + 432 apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html @@ -1044,7 +1028,7 @@ 名称、代码或 ISIN apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 132 + 133 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -1064,7 +1048,7 @@ 您确实要删除此优惠券吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 194 + 193 @@ -1072,7 +1056,7 @@ 您真的要删除这条系统消息吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 207 + 206 @@ -1080,7 +1064,7 @@ 您真的要刷新缓存吗? apps/client/src/app/components/admin-overview/admin-overview.component.ts - 231 + 230 @@ -1088,7 +1072,7 @@ 请设置您的系统消息: apps/client/src/app/components/admin-overview/admin-overview.component.ts - 251 + 250 @@ -1212,11 +1196,11 @@ 网址 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 493 + 419 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 545 + 550 apps/client/src/app/components/admin-platform/admin-platform.component.html @@ -1227,17 +1211,25 @@ 25 + + Asset profile has been saved + 资产概况已保存 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 578 + + Do you really want to delete this platform? 您真的要删除这个平台吗? apps/client/src/app/components/admin-platform/admin-platform.component.ts - 107 + 106 By - By + 预计到 apps/client/src/app/pages/portfolio/fire/fire-page.html 139 @@ -1256,7 +1248,7 @@ 当前年份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 @@ -1328,7 +1320,7 @@ 您真的要删除该用户吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 210 + 215 @@ -1349,7 +1341,7 @@ No auto-renewal on membership. - No auto-renewal on membership. + 会员资格不自动续订。 apps/client/src/app/components/user-account-membership/user-account-membership.html 74 @@ -1391,6 +1383,18 @@ 254 + + Could not validate form + 无法验证表单 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 554 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 557 + + Compare with... 与之比较... @@ -1424,7 +1428,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 94 + 95 libs/common/src/lib/routes/routes.ts @@ -1436,7 +1440,7 @@ 基准 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 378 + 376 apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts @@ -1500,7 +1504,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 192 + 193 @@ -1640,7 +1644,7 @@ 当前周 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 @@ -1688,7 +1692,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 279 + 288 apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.html @@ -1732,7 +1736,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 329 + 326 apps/client/src/app/pages/register/register-page.html @@ -1796,7 +1800,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 259 @@ -1808,7 +1812,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 278 @@ -1876,7 +1880,7 @@ 请输入您的应急基金金额。 apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 108 + 111 @@ -1912,7 +1916,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 74 + 69 @@ -1952,7 +1956,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 207 + 204 @@ -1972,7 +1976,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 211 + 208 @@ -1988,7 +1992,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 215 + 212 @@ -2004,7 +2008,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 219 + 216 @@ -2016,7 +2020,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 223 + 220 @@ -2032,7 +2036,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 246 + 243 @@ -2088,7 +2092,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 284 + 281 @@ -2100,7 +2104,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 365 + 363 @@ -2108,11 +2112,11 @@ 年初至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 204 + 199 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -2120,11 +2124,11 @@ 1年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -2132,11 +2136,19 @@ 5年 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 + + + + Performance with currency effect + 含货币影响的表现 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 135 @@ -2144,11 +2156,11 @@ 最大限度 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 216 + 211 libs/ui/src/lib/assistant/assistant.component.ts - 417 + 415 @@ -2180,7 +2192,7 @@ 请输入您的优惠券代码。 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 218 + 210 @@ -2188,7 +2200,7 @@ 无法兑换优惠券代码 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 182 + 174 @@ -2196,7 +2208,7 @@ 优惠券代码已被兑换 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 195 + 187 @@ -2204,7 +2216,7 @@ 重新加载 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 196 + 188 @@ -2224,7 +2236,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 268 + 265 @@ -2248,11 +2260,11 @@ 自动 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 69 + 70 apps/client/src/app/components/user-account-settings/user-account-settings.html - 172 + 181 @@ -2260,7 +2272,7 @@ 您确实要删除此登录方法吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 281 + 282 @@ -2268,7 +2280,7 @@ 演示者视图 apps/client/src/app/components/user-account-settings/user-account-settings.html - 183 + 192 @@ -2276,7 +2288,7 @@ 保护绝对业绩、金额等敏感信息 apps/client/src/app/components/user-account-settings/user-account-settings.html - 185 + 194 @@ -2300,11 +2312,11 @@ 语言环境 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 448 + 509 apps/client/src/app/components/user-account-settings/user-account-settings.html - 133 + 142 @@ -2312,7 +2324,7 @@ 日期和数字格式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 135 + 144 @@ -2320,7 +2332,7 @@ 外观 apps/client/src/app/components/user-account-settings/user-account-settings.html - 158 + 167 @@ -2328,7 +2340,7 @@ 明亮 apps/client/src/app/components/user-account-settings/user-account-settings.html - 173 + 182 @@ -2336,7 +2348,7 @@ 黑暗 apps/client/src/app/components/user-account-settings/user-account-settings.html - 174 + 183 @@ -2344,7 +2356,7 @@ 极简模式 apps/client/src/app/components/user-account-settings/user-account-settings.html - 201 + 210 apps/client/src/app/pages/features/features-page.html @@ -2356,12 +2368,12 @@ 动荡时期的无干扰体验 apps/client/src/app/components/user-account-settings/user-account-settings.html - 203 + 212 this is projected to increase to - this is projected to increase to + 预计将增至 apps/client/src/app/pages/portfolio/fire/fire-page.html 147 @@ -2372,7 +2384,7 @@ 生物识别认证 apps/client/src/app/components/user-account-settings/user-account-settings.html - 218 + 227 @@ -2380,7 +2392,7 @@ 使用指纹登录 apps/client/src/app/components/user-account-settings/user-account-settings.html - 219 + 228 @@ -2388,7 +2400,7 @@ 实验性功能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 235 + 244 @@ -2396,7 +2408,7 @@ 预览即将推出的功能 apps/client/src/app/components/user-account-settings/user-account-settings.html - 237 + 246 @@ -2408,7 +2420,7 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 252 + 261 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html @@ -2420,7 +2432,7 @@ 导出数据 apps/client/src/app/components/user-account-settings/user-account-settings.html - 260 + 269 @@ -2464,7 +2476,7 @@ 好的 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 157 + 149 apps/client/src/app/core/http-response.interceptor.ts @@ -2732,7 +2744,7 @@ 概述 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 113 + 114 apps/client/src/app/components/header/header.component.html @@ -2871,6 +2883,18 @@ 225 + + Could not parse scraper configuration + 无法解析抓取器配置 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 509 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 512 + + Discover the latest Ghostfolio updates and insights on personal finance 了解最新的 Ghostfolio 更新和个人理财见解 @@ -3028,7 +3052,7 @@ 开源软件 apps/client/src/app/pages/features/features-page.html - 295 + 296 @@ -3040,7 +3064,7 @@ apps/client/src/app/pages/features/features-page.html - 320 + 321 apps/client/src/app/pages/landing/landing-page.html @@ -3052,7 +3076,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 363 + 360 apps/client/src/app/pages/public/public-page.html @@ -3108,7 +3132,7 @@ 市场 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 380 + 378 apps/client/src/app/components/footer/footer.component.html @@ -3319,6 +3343,14 @@ 172 + + Everything in Basic, plus + 包含 Basic 所有功能,以及 + + apps/client/src/app/pages/pricing/pricing-page.html + 199 + + trading stocks, ETFs or cryptocurrencies on multiple platforms 在多个平台上交易股票、ETF 或加密货币 @@ -3508,7 +3540,7 @@ 使用您的学校电子邮件地址 apps/client/src/app/pages/pricing/pricing-page.html - 351 + 348 @@ -3604,7 +3636,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 228 + 226 apps/client/src/app/components/admin-tag/admin-tag.component.html @@ -3636,7 +3668,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 119 + 126 @@ -4060,7 +4092,7 @@ 寻找学生折扣? apps/client/src/app/pages/pricing/pricing-page.html - 345 + 342 @@ -4088,7 +4120,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4097,7 +4129,7 @@ annual interest rate - annual interest rate + 年利率 apps/client/src/app/pages/portfolio/fire/fire-page.html 185 @@ -4116,7 +4148,7 @@ 每月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4124,7 +4156,7 @@ 每年 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4132,7 +4164,7 @@ 顶部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 305 @@ -4140,7 +4172,7 @@ 底部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 354 @@ -4148,7 +4180,7 @@ 投资组合演变 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 407 @@ -4156,7 +4188,7 @@ 投资时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 434 @@ -4164,7 +4196,7 @@ 当前连胜 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 455 @@ -4172,7 +4204,7 @@ 最长连续纪录 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 464 @@ -4180,7 +4212,7 @@ 股息时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 491 @@ -4329,7 +4361,7 @@ Free - 自由的 + 免费 apps/client/src/app/pages/pricing/pricing-page.html 86 @@ -4356,7 +4388,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 255 + 252 @@ -4372,7 +4404,7 @@ 电子邮件和聊天支持 apps/client/src/app/pages/pricing/pricing-page.html - 251 + 248 @@ -4388,7 +4420,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 282 + 279 @@ -4396,7 +4428,19 @@ 一次性付款,无自动续订。 apps/client/src/app/pages/pricing/pricing-page.html - 288 + 285 + + + + Could not save asset profile + 无法保存资产概况 + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 588 + + + apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts + 591 @@ -4404,7 +4448,7 @@ 免费。 apps/client/src/app/pages/pricing/pricing-page.html - 365 + 362 @@ -4761,7 +4805,7 @@ 瑞士 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 57 + 58 libs/ui/src/lib/i18n.ts @@ -4773,7 +4817,7 @@ 全球的 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 58 + 59 libs/ui/src/lib/i18n.ts @@ -4825,7 +4869,7 @@ 请求它 apps/client/src/app/pages/pricing/pricing-page.html - 347 + 344 @@ -4993,7 +5037,7 @@ 联系我们 apps/client/src/app/pages/pricing/pricing-page.html - 339 + 336 @@ -5077,11 +5121,11 @@ 分配 libs/ui/src/lib/accounts-table/accounts-table.component.html - 241 + 248 libs/ui/src/lib/holdings-table/holdings-table.component.html - 122 + 117 libs/ui/src/lib/top-holdings/top-holdings.component.html @@ -5097,7 +5141,7 @@ 显示所有 libs/ui/src/lib/holdings-table/holdings-table.component.html - 221 + 216 @@ -5137,11 +5181,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 237 + 235 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 328 + 326 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5169,11 +5213,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 246 + 244 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 344 + 342 apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -5341,7 +5385,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 168 + 169 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -5385,7 +5429,7 @@ libs/ui/src/lib/accounts-table/accounts-table.component.html - 307 + 314 @@ -5398,7 +5442,7 @@ Sign in with OpenID Connect - Sign in with OpenID Connect + 使用 OpenID Connect 登录 apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html 55 @@ -5510,7 +5554,7 @@ Authentication - Authentication + 认证 apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html 35 @@ -5721,7 +5765,7 @@ 当前市场价格为 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 672 + 706 @@ -5729,7 +5773,7 @@ 测试 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 511 + 568 @@ -5801,7 +5845,7 @@ 绝对货币表现 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 211 @@ -5817,7 +5861,7 @@ 绝对资产回报 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 168 @@ -5833,15 +5877,15 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 88 + 89 @@ -5849,7 +5893,7 @@ 这里 apps/client/src/app/pages/pricing/pricing-page.html - 350 + 347 @@ -5857,7 +5901,7 @@ 资产回报 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 190 @@ -5865,7 +5909,7 @@ 货币表现 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 236 @@ -5873,7 +5917,7 @@ 今年迄今为止 libs/ui/src/lib/assistant/assistant.component.ts - 377 + 375 @@ -5881,7 +5925,7 @@ 本周至今 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5889,7 +5933,7 @@ 本月至今 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5897,11 +5941,11 @@ 本月至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 libs/ui/src/lib/assistant/assistant.component.ts - 373 + 371 @@ -5909,11 +5953,11 @@ 本周至今 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 196 + 191 libs/ui/src/lib/assistant/assistant.component.ts - 369 + 367 @@ -5949,7 +5993,7 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 208 + 203 apps/client/src/app/pages/resources/personal-finance-tools/product-page.html @@ -5961,7 +6005,7 @@ libs/ui/src/lib/assistant/assistant.component.ts - 387 + 385 @@ -5969,11 +6013,11 @@ apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 212 + 207 libs/ui/src/lib/assistant/assistant.component.ts - 411 + 409 @@ -6014,7 +6058,7 @@ 数据收集 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 604 + 587 apps/client/src/app/components/admin-overview/admin-overview.html @@ -6166,7 +6210,7 @@ 您确定要关闭您的 Ghostfolio 账户吗? apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 207 + 208 @@ -6174,7 +6218,7 @@ 危险区域 apps/client/src/app/components/user-account-settings/user-account-settings.html - 272 + 281 @@ -6182,7 +6226,7 @@ 关闭账户 apps/client/src/app/components/user-account-settings/user-account-settings.html - 307 + 316 @@ -6214,7 +6258,7 @@ 包含在 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 376 + 374 @@ -6222,7 +6266,7 @@ 哎呀!设置生物识别认证时发生错误。 apps/client/src/app/components/user-account-settings/user-account-settings.component.ts - 335 + 336 @@ -6238,7 +6282,7 @@ 基准 apps/client/src/app/components/admin-market-data/admin-market-data.component.ts - 127 + 126 @@ -6294,7 +6338,7 @@ 另类 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 82 + 83 @@ -6302,7 +6346,7 @@ 应用 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 83 + 84 @@ -6310,7 +6354,7 @@ 预算管理 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 84 + 85 @@ -6326,47 +6370,51 @@ apps/client/src/app/components/user-account-settings/user-account-settings.html - 90 + 91 apps/client/src/app/components/user-account-settings/user-account-settings.html - 94 + 95 apps/client/src/app/components/user-account-settings/user-account-settings.html - 98 + 99 apps/client/src/app/components/user-account-settings/user-account-settings.html - 102 + 103 apps/client/src/app/components/user-account-settings/user-account-settings.html - 106 + 109 apps/client/src/app/components/user-account-settings/user-account-settings.html - 110 + 114 apps/client/src/app/components/user-account-settings/user-account-settings.html - 114 + 118 apps/client/src/app/components/user-account-settings/user-account-settings.html - 118 + 122 apps/client/src/app/components/user-account-settings/user-account-settings.html - 123 + 126 + + + apps/client/src/app/components/user-account-settings/user-account-settings.html + 132 apps/client/src/app/pages/features/features-page.html - 276 + 277 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 85 + 86 @@ -6374,7 +6422,7 @@ 家族办公室 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 86 + 87 @@ -6382,7 +6430,7 @@ 投资者 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 89 + 90 @@ -6394,7 +6442,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 90 + 91 @@ -6406,7 +6454,7 @@ apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 92 + 93 @@ -6414,7 +6462,7 @@ 隐私 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 93 + 94 @@ -6422,7 +6470,7 @@ 软件 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 95 + 96 @@ -6430,7 +6478,7 @@ 工具 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 96 + 97 @@ -6438,7 +6486,7 @@ 用户体验 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 97 + 98 @@ -6446,7 +6494,7 @@ 财富 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 98 + 99 @@ -6454,7 +6502,7 @@ 财富管理 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts - 99 + 100 @@ -6614,7 +6662,7 @@ 错误 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 663 + 697 @@ -6643,7 +6691,7 @@ , based on your total assets of - 基于您总资产的 + 基于您总资产的 apps/client/src/app/pages/portfolio/fire/fire-page.html 96 @@ -6662,11 +6710,11 @@ 取消 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 161 + 162 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 609 + 592 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6718,7 +6766,7 @@ 关闭 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 611 + 594 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -6802,7 +6850,7 @@ 如果您计划开通账户在 apps/client/src/app/pages/pricing/pricing-page.html - 315 + 312 @@ -6903,7 +6951,7 @@ , assuming a - , assuming a + , 假设一个 apps/client/src/app/pages/portfolio/fire/fire-page.html 174 @@ -6914,7 +6962,7 @@ 使用我们的推荐链接并获得一年的Ghostfolio Premium会员资格 apps/client/src/app/pages/pricing/pricing-page.html - 343 + 340 @@ -7148,7 +7196,7 @@ 您确定要删除此 API 密钥吗? apps/client/src/app/components/admin-settings/admin-settings.component.ts - 128 + 127 @@ -7176,7 +7224,7 @@ 无法生成 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 144 + 136 @@ -7184,7 +7232,7 @@ 在您的自托管环境中设置此 API 密钥: apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 159 + 151 @@ -7192,7 +7240,7 @@ Ghostfolio Premium 数据提供者 API 密钥 apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 162 + 154 @@ -7200,7 +7248,7 @@ 您确定要生成新的 API 密钥吗? apps/client/src/app/components/user-account-membership/user-account-membership.component.ts - 167 + 159 @@ -7240,7 +7288,7 @@ 保存 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 620 + 603 apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.html @@ -7260,7 +7308,7 @@ apps/client/src/app/components/portfolio-summary/portfolio-summary.component.ts - 106 + 109 apps/client/src/app/components/rule/rule-settings-dialog/rule-settings-dialog.html @@ -7316,7 +7364,15 @@ 请输入您的 Ghostfolio API 密钥。 apps/client/src/app/components/admin-settings/admin-settings.component.ts - 147 + 146 + + + + Change with currency effect + 含货币影响的涨跌 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 116 @@ -7324,7 +7380,7 @@ AI 提示已复制到剪贴板 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7332,7 +7388,7 @@ 链接已复制到剪贴板 apps/client/src/app/components/access-table/access-table.component.ts - 101 + 99 @@ -7340,7 +7396,7 @@ 延迟 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7348,7 +7404,7 @@ 即时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7356,7 +7412,7 @@ 默认市场价格 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 420 + 481 @@ -7364,7 +7420,7 @@ 模式 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 461 + 518 @@ -7372,7 +7428,7 @@ 选择器 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 477 + 534 @@ -7380,7 +7436,7 @@ HTTP 请求标头 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 433 + 494 @@ -7388,7 +7444,7 @@ 收盘 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 230 + 225 @@ -7396,7 +7452,7 @@ 实时 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 234 + 229 @@ -7404,7 +7460,7 @@ 打开 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7420,7 +7476,7 @@ 涨跌 libs/ui/src/lib/holdings-table/holdings-table.component.html - 143 + 138 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7440,7 +7496,7 @@ libs/ui/src/lib/holdings-table/holdings-table.component.html - 166 + 161 libs/ui/src/lib/treemap-chart/treemap-chart.component.ts @@ -7475,6 +7531,14 @@ 67 + + Total amount + 总金额 + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 95 + + Armenia 亚美尼亚 @@ -7544,7 +7608,7 @@ 安全令牌 apps/client/src/app/components/admin-users/admin-users.component.ts - 231 + 236 apps/client/src/app/components/user-account-access/user-account-access.component.ts @@ -7556,7 +7620,7 @@ 您确定要为此用户生成新的安全令牌吗? apps/client/src/app/components/admin-users/admin-users.component.ts - 236 + 241 @@ -7564,7 +7628,7 @@ 查找账户、持仓或页面... libs/ui/src/lib/assistant/assistant.component.ts - 153 + 151 @@ -7629,7 +7693,7 @@ () 已在使用中。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 599 + 633 @@ -7637,7 +7701,7 @@ 在更新到 () 时发生错误。 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 607 + 641 @@ -7645,7 +7709,7 @@ 应用 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html - 153 + 154 @@ -7653,7 +7717,7 @@ 包含 API 访问权限,适用于 apps/client/src/app/pages/pricing/pricing-page.html - 238 + 235 @@ -7733,7 +7797,7 @@ 您确定要删除此项目吗? libs/ui/src/lib/benchmark/benchmark.component.ts - 139 + 144 @@ -7774,7 +7838,7 @@ 演示用户账户已同步。 apps/client/src/app/components/admin-overview/admin-overview.component.ts - 275 + 274 @@ -7952,7 +8016,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 297 + 294 @@ -7964,7 +8028,7 @@ apps/client/src/app/pages/pricing/pricing-page.html - 300 + 297 @@ -7988,7 +8052,7 @@ 当前月份 apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts - 200 + 195 diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index d562fc439..f596de5f4 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -1,5 +1,6 @@ import { InfoResponse } from '@ghostfolio/common/interfaces'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; +import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment'; import { GfNotificationModule } from '@ghostfolio/ui/notifications'; import { Platform } from '@angular/cdk/platform'; @@ -7,7 +8,11 @@ import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; -import { enableProdMode, importProvidersFrom } from '@angular/core'; +import { + enableProdMode, + importProvidersFrom, + provideZoneChangeDetection +} from '@angular/core'; import { DateAdapter, MAT_DATE_FORMATS, @@ -23,7 +28,6 @@ import { ServiceWorkerModule } from '@angular/service-worker'; import { provideIonicAngular } from '@ionic/angular/standalone'; import { provideMarkdown } from 'ngx-markdown'; import { provideNgxSkeletonLoader } from 'ngx-skeleton-loader'; -import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; import { CustomDateAdapter } from './app/adapter/custom-date-adapter'; import { DateFormats } from './app/adapter/date-formats'; @@ -50,8 +54,6 @@ import { environment } from './environments/environment'; (window as any).info = info; - environment.stripePublicKey = info.stripePublicKey; - if (environment.production) { enableProdMode(); } @@ -65,7 +67,6 @@ import { environment } from './environments/environment'; MatNativeDateModule, MatSnackBarModule, MatTooltipModule, - NgxStripeModule.forRoot(environment.stripePublicKey), RouterModule.forRoot(routes, { anchorScrolling: 'enabled', preloadingStrategy: ModulePreloadService, @@ -83,18 +84,19 @@ import { environment } from './environments/environment'; provideIonicAngular(), provideMarkdown(), provideNgxSkeletonLoader(), + provideZoneChangeDetection(), { deps: [LanguageService, MAT_DATE_LOCALE, Platform], provide: DateAdapter, useClass: CustomDateAdapter }, { - provide: MAT_DATE_FORMATS, - useValue: DateFormats + provide: GF_ENVIRONMENT, + useValue: environment }, { - provide: STRIPE_PUBLISHABLE_KEY, - useFactory: () => environment.stripePublicKey + provide: MAT_DATE_FORMATS, + useValue: DateFormats }, { provide: TitleStrategy, diff --git a/apps/client/tsconfig.app.json b/apps/client/tsconfig.app.json index 6f3ea7448..56a5535d4 100644 --- a/apps/client/tsconfig.app.json +++ b/apps/client/tsconfig.app.json @@ -1,7 +1,6 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "moduleResolution": "bundler", "outDir": "../../dist/out-tsc", "types": ["node"], "typeRoots": ["../../node_modules/@types"], diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json index 1dd30aad1..d207f5966 100644 --- a/apps/client/tsconfig.json +++ b/apps/client/tsconfig.json @@ -20,6 +20,8 @@ "strictTemplates": false }, "compilerOptions": { + "lib": ["dom", "es2022"], + "module": "preserve", "target": "es2020" } } diff --git a/apps/client/tsconfig.spec.json b/apps/client/tsconfig.spec.json index e7d525ae4..36a2e401c 100644 --- a/apps/client/tsconfig.spec.json +++ b/apps/client/tsconfig.spec.json @@ -2,7 +2,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../dist/out-tsc", - "module": "commonjs", + "module": "preserve", + "isolatedModules": true, "types": ["jest", "node"], "target": "es2016" }, diff --git a/eslint.config.cjs b/eslint.config.cjs index 5962e261d..76d627d18 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -28,9 +28,7 @@ module.exports = [ onlyDependOnLibsWithTags: ['*'] } ], - enforceBuildableLibDependency: true, - // Temporary fix, should be removed eventually - ignoredCircularDependencies: [['client', 'ui']] + enforceBuildableLibDependency: true } ], '@typescript-eslint/no-extra-semi': 'error', diff --git a/libs/common/eslint.config.cjs b/libs/common/eslint.config.cjs index a78dde897..990c264b4 100644 --- a/libs/common/eslint.config.cjs +++ b/libs/common/eslint.config.cjs @@ -18,7 +18,9 @@ module.exports = [ { files: ['**/*.ts', '**/*.tsx'], // Override or add rules here - rules: {} + rules: { + '@typescript-eslint/prefer-nullish-coalescing': 'error' + } }, { files: ['**/*.js', '**/*.jsx'], diff --git a/libs/common/src/lib/chart-helper.ts b/libs/common/src/lib/chart-helper.ts index 697f39467..1f385e901 100644 --- a/libs/common/src/lib/chart-helper.ts +++ b/libs/common/src/lib/chart-helper.ts @@ -1,4 +1,13 @@ -import { Chart, TooltipPosition } from 'chart.js'; +import type { ElementRef } from '@angular/core'; +import type { + Chart, + ChartType, + ControllerDatasetOptions, + Plugin, + Point, + TooltipOptions, + TooltipPosition +} from 'chart.js'; import { format } from 'date-fns'; import { @@ -15,7 +24,7 @@ export function formatGroupedDate({ date, groupBy }: { - date: Date; + date: number; groupBy: GroupBy; }) { if (groupBy === 'month') { @@ -27,47 +36,55 @@ export function formatGroupedDate({ return format(date, DATE_FORMAT); } -export function getTooltipOptions({ +export function getTooltipOptions({ colorScheme, currency = '', groupBy, locale = getLocale(), unit = '' }: { - colorScheme?: ColorScheme; + colorScheme: ColorScheme; currency?: string; groupBy?: GroupBy; locale?: string; unit?: string; -} = {}) { +}): Partial> { return { backgroundColor: getBackgroundColor(colorScheme), bodyColor: `rgb(${getTextColor(colorScheme)})`, borderWidth: 1, borderColor: `rgba(${getTextColor(colorScheme)}, 0.1)`, + // @ts-expect-error: no need to set all attributes in callbacks callbacks: { label: (context) => { - let label = context.dataset.label || ''; + let label = (context.dataset as ControllerDatasetOptions).label ?? ''; + if (label) { label += ': '; } - if (context.parsed.y !== null) { + + const yPoint = (context.parsed as Point).y; + + if (yPoint !== null) { if (currency) { - label += `${context.parsed.y.toLocaleString(locale, { + label += `${yPoint.toLocaleString(locale, { maximumFractionDigits: 2, minimumFractionDigits: 2 })} ${currency}`; } else if (unit) { - label += `${context.parsed.y.toFixed(2)} ${unit}`; + label += `${yPoint.toFixed(2)} ${unit}`; } else { - label += context.parsed.y.toFixed(2); + label += yPoint.toFixed(2); } } + return label; }, title: (contexts) => { - if (groupBy) { - return formatGroupedDate({ groupBy, date: contexts[0].parsed.x }); + const xPoint = (contexts[0].parsed as Point).x; + + if (groupBy && xPoint !== null) { + return formatGroupedDate({ groupBy, date: xPoint }); } return contexts[0].label; @@ -92,16 +109,17 @@ export function getTooltipPositionerMapTop( if (!position || !chart?.chartArea) { return false; } + return { x: position.x, y: chart.chartArea.top }; } -export function getVerticalHoverLinePlugin( - chartCanvas, - colorScheme?: ColorScheme -) { +export function getVerticalHoverLinePlugin( + chartCanvas: ElementRef, + colorScheme: ColorScheme +): Plugin { return { afterDatasetsDraw: (chart, _, options) => { const active = chart.getActiveElements(); @@ -110,8 +128,8 @@ export function getVerticalHoverLinePlugin( return; } - const color = options.color || `rgb(${getTextColor(colorScheme)})`; - const width = options.width || 1; + const color = options.color ?? `rgb(${getTextColor(colorScheme)})`; + const width = options.width ?? 1; const { chartArea: { bottom, top } @@ -119,13 +137,16 @@ export function getVerticalHoverLinePlugin( const xValue = active[0].element.x; const context = chartCanvas.nativeElement.getContext('2d'); - context.lineWidth = width; - context.strokeStyle = color; - context.beginPath(); - context.moveTo(xValue, top); - context.lineTo(xValue, bottom); - context.stroke(); + if (context) { + context.lineWidth = width; + context.strokeStyle = color; + + context.beginPath(); + context.moveTo(xValue, top); + context.lineTo(xValue, bottom); + context.stroke(); + } }, id: 'verticalHoverLine' }; diff --git a/libs/common/src/lib/class-transformer.ts b/libs/common/src/lib/class-transformer.ts index 328e2bf9e..60e0eab60 100644 --- a/libs/common/src/lib/class-transformer.ts +++ b/libs/common/src/lib/class-transformer.ts @@ -16,7 +16,7 @@ export function transformToMapOfBig({ return mapOfBig; } -export function transformToBig({ value }: { value: string }): Big { +export function transformToBig({ value }: { value: string }): Big | null { if (value === null) { return null; } diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index 169ab80c1..b558ccc42 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -78,6 +78,58 @@ export const DEFAULT_PROCESSOR_GATHER_HISTORICAL_MARKET_DATA_CONCURRENCY = 1; export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_CONCURRENCY = 1; export const DEFAULT_PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT = 30000; +export const DEFAULT_REDACTED_PATHS = [ + 'accounts[*].balance', + 'accounts[*].valueInBaseCurrency', + 'activities[*].account.balance', + 'activities[*].account.comment', + 'activities[*].comment', + 'activities[*].fee', + 'activities[*].feeInAssetProfileCurrency', + 'activities[*].feeInBaseCurrency', + 'activities[*].quantity', + 'activities[*].SymbolProfile.symbolMapping', + 'activities[*].SymbolProfile.watchedByCount', + 'activities[*].value', + 'activities[*].valueInBaseCurrency', + 'balance', + 'balanceInBaseCurrency', + 'balances[*].account.balance', + 'balances[*].account.comment', + 'balances[*].value', + 'balances[*].valueInBaseCurrency', + 'comment', + 'dividendInBaseCurrency', + 'feeInBaseCurrency', + 'grossPerformance', + 'grossPerformanceWithCurrencyEffect', + 'historicalData[*].quantity', + 'holdings[*].dividend', + 'holdings[*].grossPerformance', + 'holdings[*].grossPerformanceWithCurrencyEffect', + 'holdings[*].holdings[*].valueInBaseCurrency', + 'holdings[*].investment', + 'holdings[*].netPerformance', + 'holdings[*].netPerformanceWithCurrencyEffect', + 'holdings[*].quantity', + 'holdings[*].valueInBaseCurrency', + 'interestInBaseCurrency', + 'investmentInBaseCurrencyWithCurrencyEffect', + 'netPerformance', + 'netPerformanceWithCurrencyEffect', + 'platforms[*].balance', + 'platforms[*].valueInBaseCurrency', + 'quantity', + 'SymbolProfile.symbolMapping', + 'SymbolProfile.watchedByCount', + 'totalBalanceInBaseCurrency', + 'totalDividendInBaseCurrency', + 'totalInterestInBaseCurrency', + 'totalValueInBaseCurrency', + 'value', + 'valueInBaseCurrency' +]; + // USX is handled separately export const DERIVED_CURRENCIES = [ { @@ -193,6 +245,7 @@ export const SUPPORTED_LANGUAGE_CODES = [ 'es', 'fr', 'it', + 'ko', 'nl', 'pl', 'pt', diff --git a/libs/common/src/lib/helper.ts b/libs/common/src/lib/helper.ts index 7452b604c..4db1fcf2d 100644 --- a/libs/common/src/lib/helper.ts +++ b/libs/common/src/lib/helper.ts @@ -11,7 +11,21 @@ import { parseISO, subDays } from 'date-fns'; -import { ca, de, es, fr, it, nl, pl, pt, tr, uk, zhCN } from 'date-fns/locale'; +import { + ca, + de, + es, + fr, + it, + ko, + nl, + pl, + pt, + tr, + uk, + zhCN +} from 'date-fns/locale'; +import { get, isNil, isString } from 'lodash'; import { DEFAULT_CURRENCY, @@ -130,7 +144,7 @@ export function extractNumberFromString({ }: { locale?: string; value: string; -}): number { +}): number | undefined { try { // Remove non-numeric characters (excluding international formatting characters) const numericValue = value.replace(/[^\d.,'’\s]/g, ''); @@ -184,6 +198,8 @@ export function getDateFnsLocale(aLanguageCode: string) { return fr; } else if (aLanguageCode === 'it') { return it; + } else if (aLanguageCode === 'ko') { + return ko; } else if (aLanguageCode === 'nl') { return nl; } else if (aLanguageCode === 'pl') { @@ -207,8 +223,8 @@ export function getDateFormatString(aLocale?: string) { ); return formatObject - .map((object) => { - switch (object.type) { + .map(({ type, value }) => { + switch (type) { case 'day': return 'dd'; case 'month': @@ -216,7 +232,7 @@ export function getDateFormatString(aLocale?: string) { case 'year': return 'yyyy'; default: - return object.value; + return value; } }) .join(''); @@ -242,12 +258,22 @@ export function getLocale() { return navigator.language ?? locale; } +export function getLowercase(object: object, path: string) { + const value = get(object, path); + + if (isNil(value)) { + return ''; + } + + return isString(value) ? value.toLocaleLowerCase() : value; +} + export function getNumberFormatDecimal(aLocale?: string) { const formatObject = new Intl.NumberFormat(aLocale).formatToParts(9999.99); - return formatObject.find((object) => { - return object.type === 'decimal'; - }).value; + return formatObject.find(({ type }) => { + return type === 'decimal'; + })?.value; } export function getNumberFormatGroup(aLocale = getLocale()) { @@ -255,9 +281,9 @@ export function getNumberFormatGroup(aLocale = getLocale()) { useGrouping: true }).formatToParts(9999.99); - return formatObject.find((object) => { - return object.type === 'group'; - }).value; + return formatObject.find(({ type }) => { + return type === 'group'; + })?.value; } export function getStartOfUtcDate(aDate: Date) { @@ -368,7 +394,7 @@ export function isRootCurrency(aCurrency: string) { }); } -export function parseDate(date: string): Date { +export function parseDate(date: string): Date | undefined { if (!date) { return undefined; } diff --git a/libs/common/src/lib/interfaces/activities.interface.ts b/libs/common/src/lib/interfaces/activities.interface.ts index 8c88cc2cf..b9e64984b 100644 --- a/libs/common/src/lib/interfaces/activities.interface.ts +++ b/libs/common/src/lib/interfaces/activities.interface.ts @@ -8,7 +8,7 @@ export interface Activity extends Order { error?: ActivityError; feeInAssetProfileCurrency: number; feeInBaseCurrency: number; - SymbolProfile?: EnhancedSymbolProfile; + SymbolProfile: EnhancedSymbolProfile; tagIds?: string[]; tags?: Tag[]; unitPriceInAssetProfileCurrency: number; diff --git a/libs/common/src/lib/interfaces/admin-data.interface.ts b/libs/common/src/lib/interfaces/admin-data.interface.ts index 23821a86b..dd25b516d 100644 --- a/libs/common/src/lib/interfaces/admin-data.interface.ts +++ b/libs/common/src/lib/interfaces/admin-data.interface.ts @@ -1,12 +1,12 @@ import { DataProviderInfo } from './data-provider-info.interface'; export interface AdminData { + activitiesCount: number; dataProviders: (DataProviderInfo & { assetProfileCount: number; useForExchangeRates: boolean; })[]; settings: { [key: string]: boolean | object | string | string[] }; - transactionCount: number; userCount: number; version: string; } diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 7cf93691c..ad747d94e 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -34,7 +34,6 @@ import type { PortfolioPerformance } from './portfolio-performance.interface'; import type { PortfolioPosition } from './portfolio-position.interface'; import type { PortfolioReportRule } from './portfolio-report-rule.interface'; import type { PortfolioSummary } from './portfolio-summary.interface'; -import type { Position } from './position.interface'; import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; @@ -172,7 +171,6 @@ export { PortfolioReportResponse, PortfolioReportRule, PortfolioSummary, - Position, Product, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index fe4101197..01897c066 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -1,4 +1,4 @@ -import { Platform, SymbolProfile } from '@prisma/client'; +import { SymbolProfile } from '@prisma/client'; import { Statistics } from './statistics.interface'; import { SubscriptionOffer } from './subscription-offer.interface'; @@ -13,8 +13,6 @@ export interface InfoItem { globalPermissions: string[]; isDataGatheringEnabled?: string; isReadOnlyMode?: boolean; - platforms: Platform[]; statistics: Statistics; - stripePublicKey?: string; subscriptionOffer?: SubscriptionOffer; } diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index e277ba468..620cc00e9 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -7,6 +7,7 @@ import { Holding } from './holding.interface'; import { Sector } from './sector.interface'; export interface PortfolioPosition { + activitiesCount: number; allocationInPercentage: number; assetClass?: AssetClass; assetClassLabel?: string; @@ -38,7 +39,6 @@ export interface PortfolioPosition { sectors: Sector[]; symbol: string; tags?: Tag[]; - transactionCount: number; type?: string; url?: string; valueInBaseCurrency?: number; diff --git a/libs/common/src/lib/interfaces/position.interface.ts b/libs/common/src/lib/interfaces/position.interface.ts deleted file mode 100644 index d1f74380b..000000000 --- a/libs/common/src/lib/interfaces/position.interface.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MarketState } from '@ghostfolio/common/types'; - -import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; - -export interface Position { - assetClass: AssetClass; - assetSubClass: AssetSubClass; - averagePrice: number; - currency: string; - dataSource: DataSource; - firstBuyDate: string; - grossPerformance?: number; - grossPerformancePercentage?: number; - investment: number; - investmentInOriginalCurrency?: number; - marketPrice?: number; - marketState?: MarketState; - name?: string; - netPerformance?: number; - netPerformancePercentage?: number; - netPerformancePercentageWithCurrencyEffect?: number; - netPerformanceWithCurrencyEffect?: number; - quantity: number; - symbol: string; - transactionCount: number; - url?: string; -} diff --git a/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts b/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts index 0a6af978f..90f1303e0 100644 --- a/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts @@ -2,9 +2,9 @@ import { AccountWithValue } from '@ghostfolio/common/types'; export interface AccountsResponse { accounts: AccountWithValue[]; + activitiesCount: number; totalBalanceInBaseCurrency: number; totalDividendInBaseCurrency: number; totalInterestInBaseCurrency: number; totalValueInBaseCurrency: number; - transactionCount: number; } diff --git a/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts index 18c9e4400..8ac1a8279 100644 --- a/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts @@ -1,3 +1,3 @@ export interface CreateStripeCheckoutSessionResponse { - sessionId: string; + sessionUrl: string; } diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index 31f027ee9..76bc7dc02 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -1,5 +1,4 @@ import { - Activity, Benchmark, DataProviderInfo, EnhancedSymbolProfile, @@ -9,15 +8,14 @@ import { import { Tag } from '@prisma/client'; export interface PortfolioHoldingResponse { - activities: Activity[]; activitiesCount: number; averagePrice: number; dataProviderInfo: DataProviderInfo; + dateOfFirstActivity: string; dividendInBaseCurrency: number; dividendYieldPercent: number; dividendYieldPercentWithCurrencyEffect: number; feeInBaseCurrency: number; - firstBuyDate: string; grossPerformance: number; grossPerformancePercent: number; grossPerformancePercentWithCurrencyEffect: number; diff --git a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts index cb06800be..4a087ad16 100644 --- a/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts @@ -39,7 +39,7 @@ export interface PublicPortfolioResponse extends PublicPortfolioResponseV1 { })[]; markets: { [key in Market]: Pick< - PortfolioDetails['markets'][key], + NonNullable[key], 'id' | 'valueInPercentage' >; }; diff --git a/libs/common/src/lib/models/timeline-position.ts b/libs/common/src/lib/models/timeline-position.ts index f683c0951..13f9001d5 100644 --- a/libs/common/src/lib/models/timeline-position.ts +++ b/libs/common/src/lib/models/timeline-position.ts @@ -9,12 +9,15 @@ import { Big } from 'big.js'; import { Transform, Type } from 'class-transformer'; export class TimelinePosition { + activitiesCount: number; + @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) averagePrice: Big; currency: string; dataSource: DataSource; + dateOfFirstActivity: string; @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) @@ -32,8 +35,6 @@ export class TimelinePosition { @Type(() => Big) feeInBaseCurrency: Big; - firstBuyDate: string; - @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) grossPerformance: Big; @@ -50,6 +51,8 @@ export class TimelinePosition { @Type(() => Big) grossPerformanceWithCurrencyEffect: Big; + includeInTotalAssetValue?: boolean; + @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) investment: Big; @@ -90,8 +93,6 @@ export class TimelinePosition { @Type(() => Big) timeWeightedInvestmentWithCurrencyEffect: Big; - transactionCount: number; - @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) valueInBaseCurrency: Big; diff --git a/libs/common/src/lib/routes/interfaces/internal-route.interface.ts b/libs/common/src/lib/routes/interfaces/internal-route.interface.ts index 02f205979..f08cf8b5c 100644 --- a/libs/common/src/lib/routes/interfaces/internal-route.interface.ts +++ b/libs/common/src/lib/routes/interfaces/internal-route.interface.ts @@ -2,7 +2,7 @@ import { User } from '@ghostfolio/common/interfaces'; export interface InternalRoute { excludeFromAssistant?: boolean | ((aUser: User) => boolean); - path: string; + path?: string; routerLink: string[]; subRoutes?: Record; title: string; diff --git a/libs/common/src/lib/routes/routes.ts b/libs/common/src/lib/routes/routes.ts index 9a75f0bc6..53ecd104e 100644 --- a/libs/common/src/lib/routes/routes.ts +++ b/libs/common/src/lib/routes/routes.ts @@ -5,7 +5,7 @@ import { InternalRoute } from './interfaces/internal-route.interface'; import { PublicRoute } from './interfaces/public-route.interface'; if (typeof window !== 'undefined') { - import('@angular/localize/init'); + import('@angular/localize'); } else { (global as any).$localize = ( messageParts: TemplateStringsArray, diff --git a/libs/common/src/lib/types/account-with-value.type.ts b/libs/common/src/lib/types/account-with-value.type.ts index 08af86454..23cb14749 100644 --- a/libs/common/src/lib/types/account-with-value.type.ts +++ b/libs/common/src/lib/types/account-with-value.type.ts @@ -1,12 +1,12 @@ import { Account as AccountModel, Platform } from '@prisma/client'; export type AccountWithValue = AccountModel & { + activitiesCount: number; allocationInPercentage: number; balanceInBaseCurrency: number; dividendInBaseCurrency: number; interestInBaseCurrency: number; platform?: Platform; - transactionCount: number; value: number; valueInBaseCurrency: number; }; diff --git a/libs/common/src/lib/utils/form.util.ts b/libs/common/src/lib/utils/form.util.ts index eff18f8fc..09c9860ed 100644 --- a/libs/common/src/lib/utils/form.util.ts +++ b/libs/common/src/lib/utils/form.util.ts @@ -30,7 +30,7 @@ export async function validateObjectForForm({ if (formControl) { formControl.setErrors({ - validationError: Object.values(constraints)[0] + validationError: Object.values(constraints ?? {})[0] }); } @@ -38,7 +38,7 @@ export async function validateObjectForForm({ if (formControlInCustomCurrency) { formControlInCustomCurrency.setErrors({ - validationError: Object.values(constraints)[0] + validationError: Object.values(constraints ?? {})[0] }); } } diff --git a/libs/common/src/lib/validators/is-currency-code.ts b/libs/common/src/lib/validators/is-currency-code.ts index 76c6f4fe2..52d99816b 100644 --- a/libs/common/src/lib/validators/is-currency-code.ts +++ b/libs/common/src/lib/validators/is-currency-code.ts @@ -9,7 +9,7 @@ import { import { isISO4217CurrencyCode } from 'class-validator'; export function IsCurrencyCode(validationOptions?: ValidationOptions) { - return function (object: Object, propertyName: string) { + return function (object: object, propertyName: string) { registerDecorator({ propertyName, constraints: [], diff --git a/libs/common/tsconfig.json b/libs/common/tsconfig.json index 62ebbd946..2b4603b71 100644 --- a/libs/common/tsconfig.json +++ b/libs/common/tsconfig.json @@ -9,5 +9,10 @@ { "path": "./tsconfig.spec.json" } - ] + ], + "compilerOptions": { + "module": "preserve", + "lib": ["dom", "es2022"], + "strictNullChecks": true + } } diff --git a/libs/common/tsconfig.spec.json b/libs/common/tsconfig.spec.json index 46f9467f3..864945e11 100644 --- a/libs/common/tsconfig.spec.json +++ b/libs/common/tsconfig.spec.json @@ -2,7 +2,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../../dist/out-tsc", - "module": "commonjs", + "module": "preserve", + "isolatedModules": true, "types": ["jest", "node"] }, "include": [ diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.html b/libs/ui/src/lib/accounts-table/accounts-table.component.html index d127b4bf3..15f5bb21f 100644 --- a/libs/ui/src/lib/accounts-table/accounts-table.component.html +++ b/libs/ui/src/lib/accounts-table/accounts-table.component.html @@ -1,4 +1,4 @@ -@if (showActions) { +@if (showActions()) {
      -@if (isLoading) { +@if (isLoading()) { (); - @Output() accountToUpdate = new EventEmitter(); - @Output() transferBalance = new EventEmitter(); - - @ViewChild(MatSort) sort: MatSort; - - public dataSource = new MatTableDataSource(); - public displayedColumns = []; - public isLoading = true; - public routeQueryParams: Subscription; - - private unsubscribeSubject = new Subject(); - - public constructor( - private notificationService: NotificationService, - private router: Router - ) { - addIcons({ - arrowRedoOutline, - createOutline, - documentTextOutline, - ellipsisHorizontal, - eyeOffOutline, - trashOutline, - walletOutline - }); - } - - public ngOnChanges() { - this.displayedColumns = ['status', 'account', 'platform']; - - if (this.showTransactions) { - this.displayedColumns.push('transactions'); +export class GfAccountsTableComponent { + public readonly accounts = input.required(); + public readonly activitiesCount = input(); + public readonly baseCurrency = input(); + public readonly hasPermissionToOpenDetails = input(true); + public readonly locale = input(getLocale()); + public readonly showActions = input(); + public readonly showActivitiesCount = input(true); + public readonly showAllocationInPercentage = input(); + public readonly showBalance = input(true); + public readonly showFooter = input(true); + public readonly showValue = input(true); + public readonly showValueInBaseCurrency = input(false); + public readonly totalBalanceInBaseCurrency = input(); + public readonly totalValueInBaseCurrency = input(); + + public readonly accountDeleted = output(); + public readonly accountToUpdate = output(); + public readonly transferBalance = output(); + + public readonly sort = viewChild.required(MatSort); + + protected readonly dataSource = new MatTableDataSource([]); + + protected readonly displayedColumns = computed(() => { + const columns = ['status', 'account', 'platform']; + + if (this.showActivitiesCount()) { + columns.push('activitiesCount'); } - if (this.showBalance) { - this.displayedColumns.push('balance'); + if (this.showBalance()) { + columns.push('balance'); } - if (this.showValue) { - this.displayedColumns.push('value'); + if (this.showValue()) { + columns.push('value'); } - this.displayedColumns.push('currency'); + columns.push('currency'); - if (this.showValueInBaseCurrency) { - this.displayedColumns.push('valueInBaseCurrency'); + if (this.showValueInBaseCurrency()) { + columns.push('valueInBaseCurrency'); } - if (this.showAllocationInPercentage) { - this.displayedColumns.push('allocation'); + if (this.showAllocationInPercentage()) { + columns.push('allocation'); } - this.displayedColumns.push('comment'); + columns.push('comment'); - if (this.showActions) { - this.displayedColumns.push('actions'); + if (this.showActions()) { + columns.push('actions'); } - this.isLoading = true; + return columns; + }); - this.dataSource = new MatTableDataSource(this.accounts); - this.dataSource.sort = this.sort; - this.dataSource.sortingDataAccessor = get; + protected readonly isLoading = computed(() => !this.accounts()); - if (this.accounts) { - this.isLoading = false; - } + private readonly notificationService = inject(NotificationService); + private readonly router = inject(Router); + + public constructor() { + addIcons({ + arrowRedoOutline, + createOutline, + documentTextOutline, + ellipsisHorizontal, + eyeOffOutline, + trashOutline, + walletOutline + }); + + this.dataSource.sortingDataAccessor = getLowercase; + + // Reactive data update + effect(() => { + this.dataSource.data = this.accounts(); + }); + + // Reactive view connection + effect(() => { + this.dataSource.sort = this.sort(); + }); } - public onDeleteAccount(aId: string) { + protected onDeleteAccount(aId: string) { this.notificationService.confirm({ confirmFn: () => { this.accountDeleted.emit(aId); @@ -151,30 +149,25 @@ export class GfAccountsTableComponent implements OnChanges, OnDestroy { }); } - public onOpenAccountDetailDialog(accountId: string) { - if (this.hasPermissionToOpenDetails) { + protected onOpenAccountDetailDialog(accountId: string) { + if (this.hasPermissionToOpenDetails()) { this.router.navigate([], { queryParams: { accountId, accountDetailDialog: true } }); } } - public onOpenComment(aComment: string) { + protected onOpenComment(aComment: string) { this.notificationService.alert({ title: aComment }); } - public onTransferBalance() { + protected onTransferBalance() { this.transferBalance.emit(); } - public onUpdateAccount(aAccount: Account) { + protected onUpdateAccount(aAccount: Account) { this.accountToUpdate.emit(aAccount); } - - public ngOnDestroy() { - this.unsubscribeSubject.next(); - this.unsubscribeSubject.complete(); - } } diff --git a/libs/ui/src/lib/activities-table/activities-table.component.html b/libs/ui/src/lib/activities-table/activities-table.component.html index b8e1882d4..bdb1e6373 100644 --- a/libs/ui/src/lib/activities-table/activities-table.component.html +++ b/libs/ui/src/lib/activities-table/activities-table.component.html @@ -21,7 +21,7 @@
    @@ -201,7 +201,7 @@
    @@ -225,7 +225,7 @@ @@ -249,7 +249,7 @@ @@ -272,7 +272,7 @@ @@ -304,7 +304,7 @@ @@ -388,7 +388,7 @@ @if (hasPermissionToCreateActivity) {