Browse Source

Merge branch 'bugfix/accounts-in-account-selection-filter-do-not-adapt-in-impersonation-mode' of https://github.com/Anurag9977/ghostfolio into pr/6231

pull/6231/head
Thomas Kaul 3 days ago
parent
commit
794d6ff13d
  1. 45
      CHANGELOG.md
  2. 6
      apps/api/src/app/account/account.controller.ts
  3. 6
      apps/api/src/app/account/account.service.ts
  4. 6
      apps/api/src/app/admin/admin.service.ts
  5. 7
      apps/api/src/app/endpoints/market-data/market-data.controller.ts
  6. 6
      apps/api/src/app/endpoints/market-data/market-data.module.ts
  7. 10
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  8. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts
  9. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
  10. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts
  11. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts
  12. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts
  13. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
  14. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts
  15. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts
  16. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
  17. 4
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
  18. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
  19. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
  20. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts
  21. 7
      apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts
  22. 4
      apps/api/src/app/portfolio/portfolio.controller.ts
  23. 34
      apps/api/src/app/portfolio/portfolio.service.ts
  24. 3
      apps/api/src/app/subscription/subscription.service.ts
  25. 139
      apps/api/src/helper/object.helper.spec.ts
  26. 69
      apps/api/src/helper/object.helper.ts
  27. 42
      apps/api/src/interceptors/redact-values-in-response/redact-values-in-response.interceptor.ts
  28. 19
      apps/api/src/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor.ts
  29. 35
      apps/api/src/services/data-provider/data-enhancer/yahoo-finance/yahoo-finance.service.ts
  30. 6
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  31. 2
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html
  32. 39
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  33. 8
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts
  34. 6
      apps/client/src/app/components/admin-overview/admin-overview.component.ts
  35. 6
      apps/client/src/app/components/admin-overview/admin-overview.html
  36. 58
      apps/client/src/app/components/admin-users/admin-users.component.ts
  37. 20
      apps/client/src/app/components/benchmark-comparator/benchmark-comparator.component.ts
  38. 2
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html
  39. 50
      apps/client/src/app/components/investment-chart/investment-chart.component.ts
  40. 1
      apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts
  41. 25
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
  42. 40
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
  43. 10
      apps/client/src/app/pages/accounts/accounts-page.component.ts
  44. 2
      apps/client/src/app/pages/accounts/accounts-page.html
  45. 9
      apps/client/src/app/pages/pricing/pricing-page.html
  46. 108
      apps/client/src/locales/messages.ca.xlf
  47. 108
      apps/client/src/locales/messages.de.xlf
  48. 286
      apps/client/src/locales/messages.es.xlf
  49. 108
      apps/client/src/locales/messages.fr.xlf
  50. 108
      apps/client/src/locales/messages.it.xlf
  51. 108
      apps/client/src/locales/messages.ko.xlf
  52. 108
      apps/client/src/locales/messages.nl.xlf
  53. 108
      apps/client/src/locales/messages.pl.xlf
  54. 108
      apps/client/src/locales/messages.pt.xlf
  55. 108
      apps/client/src/locales/messages.tr.xlf
  56. 108
      apps/client/src/locales/messages.uk.xlf
  57. 105
      apps/client/src/locales/messages.xlf
  58. 140
      apps/client/src/locales/messages.zh.xlf
  59. 4
      libs/common/eslint.config.cjs
  60. 69
      libs/common/src/lib/chart-helper.ts
  61. 2
      libs/common/src/lib/class-transformer.ts
  62. 52
      libs/common/src/lib/config.ts
  63. 22
      libs/common/src/lib/helper.ts
  64. 2
      libs/common/src/lib/interfaces/admin-data.interface.ts
  65. 4
      libs/common/src/lib/interfaces/portfolio-position.interface.ts
  66. 3
      libs/common/src/lib/interfaces/responses/accounts-response.interface.ts
  67. 3
      libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts
  68. 2
      libs/common/src/lib/interfaces/responses/public-portfolio-response.interface.ts
  69. 6
      libs/common/src/lib/models/timeline-position.ts
  70. 2
      libs/common/src/lib/routes/interfaces/internal-route.interface.ts
  71. 4
      libs/common/src/lib/types/account-with-value.type.ts
  72. 4
      libs/common/src/lib/utils/form.util.ts
  73. 2
      libs/common/src/lib/validators/is-currency-code.ts
  74. 3
      libs/common/tsconfig.json
  75. 10
      libs/ui/src/lib/accounts-table/accounts-table.component.html
  76. 20
      libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts
  77. 8
      libs/ui/src/lib/accounts-table/accounts-table.component.ts
  78. 29
      libs/ui/src/lib/chart/chart.registry.ts
  79. 1
      libs/ui/src/lib/chart/index.ts
  80. 18
      libs/ui/src/lib/fire-calculator/fire-calculator.component.ts
  81. 58
      libs/ui/src/lib/line-chart/line-chart.component.ts
  82. 7
      libs/ui/src/lib/mocks/holdings.ts
  83. 56
      libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts
  84. 2
      libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
  85. 16
      libs/ui/src/lib/treemap-chart/interfaces/interfaces.ts
  86. 49
      libs/ui/src/lib/treemap-chart/treemap-chart.component.ts
  87. 4077
      package-lock.json
  88. 76
      package.json

45
CHANGELOG.md

@ -7,11 +7,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
### Changed
- Removed the `transactionCount` in the portfolio calculator and service
### 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

6
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<AccountBalancesResponse> {
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
});
}

6
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;

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

@ -138,11 +138,11 @@ export class AdminService {
public async get(): Promise<AdminData> {
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
};

7
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

6
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 {}

10
apps/api/src/app/portfolio/calculator/portfolio-calculator.ts

@ -416,7 +416,6 @@ export abstract class PortfolioCalculator {
dividendInBaseCurrency: totalDividendInBaseCurrency,
fee: item.fee,
feeInBaseCurrency: item.feeInBaseCurrency,
firstBuyDate: item.firstBuyDate,
grossPerformance: !hasErrors ? (grossPerformance ?? null) : null,
grossPerformancePercentage: !hasErrors
? (grossPerformancePercentage ?? null)
@ -446,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
)
@ -1004,11 +1002,9 @@ export abstract class PortfolioCalculator {
fee: oldAccumulatedSymbol.fee.plus(fee),
feeInBaseCurrency:
oldAccumulatedSymbol.feeInBaseCurrency.plus(feeInBaseCurrency),
firstBuyDate: oldAccumulatedSymbol.firstBuyDate,
includeInHoldings: oldAccumulatedSymbol.includeInHoldings,
quantity: newQuantity,
tags: oldAccumulatedSymbol.tags.concat(tags),
transactionCount: oldAccumulatedSymbol.transactionCount + 1
tags: oldAccumulatedSymbol.tags.concat(tags)
};
} else {
currentTransactionPointItem = {
@ -1024,11 +1020,9 @@ export abstract class PortfolioCalculator {
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)
};
}

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts

@ -153,7 +153,6 @@ describe('PortfolioCalculator', () => {
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(
@ -179,7 +178,6 @@ describe('PortfolioCalculator', () => {
timeWeightedInvestmentWithCurrencyEffect: new Big(
'474.93846153846153846154'
),
transactionCount: 2,
valueInBaseCurrency: new Big('595.6')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts

@ -169,7 +169,6 @@ describe('PortfolioCalculator', () => {
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(
@ -193,7 +192,6 @@ describe('PortfolioCalculator', () => {
timeWeightedInvestmentWithCurrencyEffect: new Big(
'285.80000000000000396627'
),
transactionCount: 3,
valueInBaseCurrency: new Big('0')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts

@ -153,7 +153,6 @@ describe('PortfolioCalculator', () => {
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(
@ -177,7 +176,6 @@ describe('PortfolioCalculator', () => {
tags: [],
timeWeightedInvestment: new Big('285.8'),
timeWeightedInvestmentWithCurrencyEffect: new Big('285.8'),
transactionCount: 2,
valueInBaseCurrency: new Big('0')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts

@ -143,7 +143,6 @@ describe('PortfolioCalculator', () => {
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(
@ -173,7 +172,6 @@ describe('PortfolioCalculator', () => {
tags: [],
timeWeightedInvestment: new Big('273.2'),
timeWeightedInvestmentWithCurrencyEffect: new Big('273.2'),
transactionCount: 1,
valueInBaseCurrency: new Big('297.8')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts

@ -204,7 +204,6 @@ describe('PortfolioCalculator', () => {
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(
@ -228,7 +227,6 @@ describe('PortfolioCalculator', () => {
tags: [],
timeWeightedInvestment: new Big('44558.42'),
timeWeightedInvestmentWithCurrencyEffect: new Big('44558.42'),
transactionCount: 1,
valueInBaseCurrency: new Big('43099.7')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts

@ -167,7 +167,6 @@ describe('PortfolioCalculator', () => {
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(
@ -195,7 +194,6 @@ describe('PortfolioCalculator', () => {
timeWeightedInvestmentWithCurrencyEffect: new Big(
'636.79389574611155533947'
),
transactionCount: 2,
valueInBaseCurrency: new Big('13298.425356')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts

@ -204,7 +204,6 @@ describe('PortfolioCalculator', () => {
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(
@ -228,7 +227,6 @@ describe('PortfolioCalculator', () => {
tags: [],
timeWeightedInvestment: new Big('44558.42'),
timeWeightedInvestmentWithCurrencyEffect: new Big('44558.42'),
transactionCount: 1,
valueInBaseCurrency: new Big('43099.7')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts

@ -239,7 +239,6 @@ describe('PortfolioCalculator', () => {
dividendInBaseCurrency: new Big(0),
fee: new Big(0),
feeInBaseCurrency: new Big(0),
firstBuyDate: '2023-12-31',
grossPerformance: new Big(0),
grossPerformancePercentage: new Big(0),
grossPerformancePercentageWithCurrencyEffect: new Big(
@ -277,7 +276,6 @@ describe('PortfolioCalculator', () => {
timeWeightedInvestmentWithCurrencyEffect: new Big(
'852.45231607629427792916'
),
transactionCount: 2,
valueInBaseCurrency: new Big(1820)
});

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts

@ -149,7 +149,6 @@ describe('PortfolioCalculator', () => {
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(
@ -173,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')
}
],

4
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts

@ -139,7 +139,6 @@ describe('PortfolioCalculator', () => {
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(
@ -163,8 +162,7 @@ describe('PortfolioCalculator', () => {
},
quantity: new Big('1'),
symbol: 'MSFT',
tags: [],
transactionCount: 2
tags: []
}
],
totalFeesWithCurrencyEffect: new Big('19'),

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts

@ -149,7 +149,6 @@ describe('PortfolioCalculator', () => {
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(
@ -175,7 +174,6 @@ describe('PortfolioCalculator', () => {
timeWeightedInvestmentWithCurrencyEffect: new Big(
'145.10285714285714285714'
),
transactionCount: 2,
valueInBaseCurrency: new Big('87.8')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts

@ -202,7 +202,6 @@ describe('PortfolioCalculator', () => {
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(
@ -226,7 +225,6 @@ describe('PortfolioCalculator', () => {
tags: [],
timeWeightedInvestment: new Big('151.6'),
timeWeightedInvestmentWithCurrencyEffect: new Big('151.6'),
transactionCount: 2,
valueInBaseCurrency: new Big('0')
}
],

2
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts

@ -125,7 +125,6 @@ describe('PortfolioCalculator', () => {
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'),
@ -147,7 +146,6 @@ describe('PortfolioCalculator', () => {
tags: [],
timeWeightedInvestment: new Big('500000'),
timeWeightedInvestmentWithCurrencyEffect: new Big('500000'),
transactionCount: 1,
valueInBaseCurrency: new Big('500000')
}
],

7
apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts

@ -11,17 +11,10 @@ export interface TransactionPointSymbol {
dividend: Big;
fee: Big;
feeInBaseCurrency: Big;
/** @deprecated use dateOfFirstActivity instead */
firstBuyDate: string;
includeInHoldings: boolean;
investment: Big;
quantity: Big;
skipErrors: boolean;
symbol: string;
tags?: Tag[];
/** @deprecated use activitiesCount instead */
transactionCount: number;
}

4
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
});

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

@ -233,7 +233,6 @@ export class PortfolioService {
account.currency,
userCurrency
),
transactionCount: activitiesCount,
value: this.exchangeRateDataService.toCurrency(
valueInBaseCurrency,
userCurrency,
@ -284,7 +283,6 @@ 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;
@ -301,8 +299,6 @@ export class PortfolioService {
totalValueInBaseCurrency = totalValueInBaseCurrency.plus(
account.valueInBaseCurrency
);
transactionCount += account.transactionCount;
}
for (const account of accounts) {
@ -317,7 +313,6 @@ export class PortfolioService {
return {
accounts,
activitiesCount,
transactionCount,
totalBalanceInBaseCurrency: totalBalanceInBaseCurrency.toNumber(),
totalDividendInBaseCurrency: totalDividendInBaseCurrency.toNumber(),
totalInterestInBaseCurrency: totalInterestInBaseCurrency.toNumber(),
@ -325,13 +320,13 @@ export class PortfolioService {
};
}
public async getDividends({
public getDividends({
activities,
groupBy
}: {
activities: Activity[];
groupBy?: GroupBy;
}): Promise<InvestmentItem[]> {
}): InvestmentItem[] {
let dividends = activities.map(({ currency, date, value }) => {
return {
date: format(date, DATE_FORMAT),
@ -576,8 +571,8 @@ export class PortfolioService {
for (const {
activitiesCount,
currency,
dateOfFirstActivity,
dividend,
firstBuyDate,
grossPerformance,
grossPerformanceWithCurrencyEffect,
grossPerformancePercentage,
@ -591,7 +586,6 @@ export class PortfolioService {
quantity,
symbol,
tags,
transactionCount,
valueInBaseCurrency
} of positions) {
if (isFilteredByClosedHoldings === true) {
@ -625,7 +619,6 @@ export class PortfolioService {
marketPrice,
symbol,
tags,
transactionCount,
allocationInPercentage: filteredValueInBaseCurrency.eq(0)
? 0
: valueInBaseCurrency.div(filteredValueInBaseCurrency).toNumber(),
@ -633,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,
@ -801,9 +794,9 @@ export class PortfolioService {
activitiesCount,
averagePrice,
currency,
dateOfFirstActivity,
dividendInBaseCurrency,
feeInBaseCurrency,
firstBuyDate,
grossPerformance,
grossPerformancePercentage,
grossPerformancePercentageWithCurrencyEffect,
@ -828,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)
@ -836,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)
@ -845,7 +844,7 @@ export class PortfolioService {
const historicalData = await this.dataProviderService.getHistorical(
[{ dataSource, symbol }],
'day',
parseISO(firstBuyDate),
parseISO(dateOfFirstActivity),
new Date()
);
@ -910,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
});
@ -924,6 +923,7 @@ export class PortfolioService {
return {
activitiesCount,
dateOfFirstActivity,
marketPrice,
marketPriceMax,
marketPriceMin,
@ -931,7 +931,6 @@ export class PortfolioService {
tags,
averagePrice: averagePrice.toNumber(),
dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0],
dateOfFirstActivity: firstBuyDate,
dividendInBaseCurrency: dividendInBaseCurrency.toNumber(),
dividendYieldPercent: dividendYieldPercent.toNumber(),
dividendYieldPercentWithCurrencyEffect:
@ -1690,7 +1689,6 @@ export class PortfolioService {
sectors: [],
symbol: currency,
tags: [],
transactionCount: 0,
valueInBaseCurrency: balance
};
}

3
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-12-15.clover'
apiVersion: '2026-01-28.clover'
}
);
}
@ -100,7 +100,6 @@ export class SubscriptionService {
);
return {
sessionId: session.id,
sessionUrl: session.url
};
}

139
apps/api/src/helper/object.helper.spec.ts

@ -1,4 +1,6 @@
import { query, 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', () => {
@ -22,46 +24,38 @@ describe('query', () => {
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': {
@ -117,6 +111,7 @@ describe('redactAttributes', () => {
hasError: false,
holdings: {
'AAPL.US': {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -136,7 +131,6 @@ describe('redactAttributes', () => {
marketPrice: 220.79,
symbol: 'AAPL.US',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.044900865255793135,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -169,6 +163,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.0694356974830054
},
'ALV.DE': {
activitiesCount: 2,
currency: 'EUR',
markets: {
UNKNOWN: 0,
@ -188,7 +183,6 @@ describe('redactAttributes', () => {
marketPrice: 296.5,
symbol: 'ALV.DE',
tags: [],
transactionCount: 2,
allocationInPercentage: 0.026912563036519527,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -216,6 +210,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.04161818652826481
},
AMZN: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -235,7 +230,6 @@ describe('redactAttributes', () => {
marketPrice: 187.99,
symbol: 'AMZN',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.07646101417126275,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -268,6 +262,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.11824101426541227
},
bitcoin: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 36985.0332704,
@ -293,7 +288,6 @@ describe('redactAttributes', () => {
userId: null
}
],
transactionCount: 1,
allocationInPercentage: 0.15042891393226654,
assetClass: 'LIQUIDITY',
assetSubClass: 'CRYPTOCURRENCY',
@ -319,6 +313,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.232626620912395
},
BONDORA_GO_AND_GROW: {
activitiesCount: 5,
currency: 'EUR',
markets: {
UNKNOWN: 2231.644722160232,
@ -344,7 +339,6 @@ describe('redactAttributes', () => {
userId: null
}
],
transactionCount: 5,
allocationInPercentage: 0.009076749759365777,
assetClass: 'FIXED_INCOME',
assetSubClass: 'BOND',
@ -370,6 +364,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.014036487867880205
},
FRANKLY95P: {
activitiesCount: 6,
currency: 'CHF',
markets: {
UNKNOWN: 0,
@ -395,7 +390,6 @@ describe('redactAttributes', () => {
userId: null
}
],
transactionCount: 6,
allocationInPercentage: 0.09095764645669335,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -494,6 +488,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.14065892911313693
},
MSFT: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -513,7 +508,6 @@ describe('redactAttributes', () => {
marketPrice: 428.02,
symbol: 'MSFT',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.05222646409742627,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -546,6 +540,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.08076416659271518
},
TSLA: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -565,7 +560,6 @@ describe('redactAttributes', () => {
marketPrice: 260.46,
symbol: 'TSLA',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.1589050142378352,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -598,6 +592,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.2457342510950259
},
VTI: {
activitiesCount: 5,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -617,7 +612,6 @@ describe('redactAttributes', () => {
marketPrice: 282.05,
symbol: 'VTI',
tags: [],
transactionCount: 5,
allocationInPercentage: 0.057358979326040366,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -770,6 +764,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.08870120238725339
},
'VWRL.SW': {
activitiesCount: 5,
currency: 'CHF',
markets: {
UNKNOWN: 0,
@ -789,7 +784,6 @@ describe('redactAttributes', () => {
marketPrice: 117.62,
symbol: 'VWRL.SW',
tags: [],
transactionCount: 5,
allocationInPercentage: 0.09386983901959013,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -1178,6 +1172,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.145162408515095
},
'XDWD.DE': {
activitiesCount: 1,
currency: 'EUR',
markets: {
UNKNOWN: 0,
@ -1197,7 +1192,6 @@ describe('redactAttributes', () => {
marketPrice: 105.72,
symbol: 'XDWD.DE',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.03598477442100562,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -1456,6 +1450,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.055647656152211074
},
USD: {
activitiesCount: 0,
currency: 'USD',
allocationInPercentage: 0.20291717628620132,
assetClass: 'LIQUIDITY',
@ -1478,7 +1473,6 @@ describe('redactAttributes', () => {
sectors: [],
symbol: 'USD',
tags: [],
transactionCount: 0,
valueInBaseCurrency: 49890,
valueInPercentage: 0.3137956381563603
}
@ -1564,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: {
@ -1648,6 +1615,7 @@ describe('redactAttributes', () => {
hasError: false,
holdings: {
'AAPL.US': {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -1667,7 +1635,6 @@ describe('redactAttributes', () => {
marketPrice: 220.79,
symbol: 'AAPL.US',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.044900865255793135,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -1681,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,
@ -1700,6 +1667,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.0694356974830054
},
'ALV.DE': {
activitiesCount: 2,
currency: 'EUR',
markets: {
UNKNOWN: 0,
@ -1719,7 +1687,6 @@ describe('redactAttributes', () => {
marketPrice: 296.5,
symbol: 'ALV.DE',
tags: [],
transactionCount: 2,
allocationInPercentage: 0.026912563036519527,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -1728,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,
@ -1747,6 +1714,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.04161818652826481
},
AMZN: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -1766,7 +1734,6 @@ describe('redactAttributes', () => {
marketPrice: 187.99,
symbol: 'AMZN',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.07646101417126275,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -1780,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,
@ -1799,6 +1766,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.11824101426541227
},
bitcoin: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 36985.0332704,
@ -1824,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,
@ -1850,6 +1817,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.232626620912395
},
BONDORA_GO_AND_GROW: {
activitiesCount: 5,
currency: 'EUR',
markets: {
UNKNOWN: 2231.644722160232,
@ -1875,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,
@ -1901,6 +1868,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.014036487867880205
},
FRANKLY95P: {
activitiesCount: 6,
currency: 'CHF',
markets: {
UNKNOWN: 0,
@ -1926,7 +1894,6 @@ describe('redactAttributes', () => {
userId: null
}
],
transactionCount: 6,
allocationInPercentage: 0.09095764645669335,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -1986,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,
@ -2005,6 +1972,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.14065892911313693
},
MSFT: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -2024,7 +1992,6 @@ describe('redactAttributes', () => {
marketPrice: 428.02,
symbol: 'MSFT',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.05222646409742627,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -2038,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,
@ -2057,6 +2024,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.08076416659271518
},
TSLA: {
activitiesCount: 1,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -2076,7 +2044,6 @@ describe('redactAttributes', () => {
marketPrice: 260.46,
symbol: 'TSLA',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.1589050142378352,
assetClass: 'EQUITY',
assetSubClass: 'STOCK',
@ -2090,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,
@ -2109,6 +2076,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.2457342510950259
},
VTI: {
activitiesCount: 5,
currency: 'USD',
markets: {
UNKNOWN: 0,
@ -2128,7 +2096,6 @@ describe('redactAttributes', () => {
marketPrice: 282.05,
symbol: 'VTI',
tags: [],
transactionCount: 5,
allocationInPercentage: 0.057358979326040366,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -2172,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,
@ -2281,6 +2248,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.08870120238725339
},
'VWRL.SW': {
activitiesCount: 5,
currency: 'CHF',
markets: {
UNKNOWN: 0,
@ -2300,7 +2268,6 @@ describe('redactAttributes', () => {
marketPrice: 117.62,
symbol: 'VWRL.SW',
tags: [],
transactionCount: 5,
allocationInPercentage: 0.09386983901959013,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -2567,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,
@ -2681,6 +2648,7 @@ describe('redactAttributes', () => {
valueInPercentage: 0.145162408515095
},
'XDWD.DE': {
activitiesCount: 1,
currency: 'EUR',
markets: {
UNKNOWN: 0,
@ -2700,7 +2668,6 @@ describe('redactAttributes', () => {
marketPrice: 105.72,
symbol: 'XDWD.DE',
tags: [],
transactionCount: 1,
allocationInPercentage: 0.03598477442100562,
assetClass: 'EQUITY',
assetSubClass: 'ETF',
@ -2846,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,
@ -2959,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,
@ -2981,7 +2949,6 @@ describe('redactAttributes', () => {
sectors: [],
symbol: 'USD',
tags: [],
transactionCount: 0,
valueInBaseCurrency: null,
valueInPercentage: 0.3137956381563603
}

69
apps/api/src/helper/object.helper.ts

@ -1,6 +1,6 @@
import { Big } from 'big.js';
import fastRedact from 'fast-redact';
import jsonpath from 'jsonpath';
import { cloneDeep, isArray, isObject } from 'lodash';
import { cloneDeep, isObject } from 'lodash';
export function hasNotDefinedValuesInObject(aObject: Object): boolean {
for (const key in aObject) {
@ -42,60 +42,29 @@ export function query({
return jsonpath.query(object, pathExpression);
}
export function redactAttributes({
isFirstRun = true,
export function redactPaths({
object,
options
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));
}

42
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<T> 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
});
}

19
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'
]
});
}

35
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

6
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts

@ -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();

2
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.html

@ -82,7 +82,7 @@
>
</div>
<div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="transactionCount"
<gf-value i18n size="medium" [value]="activitiesCount"
>Activities</gf-value
>
</div>

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

@ -63,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';
@ -482,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 });
});
});
}

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

@ -101,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
@ -127,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}`
});

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

@ -73,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;
@ -83,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;
@ -289,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;

6
apps/client/src/app/components/admin-overview/admin-overview.html

@ -20,11 +20,11 @@
<div class="w-50">
<gf-value
[locale]="user?.settings?.locale"
[value]="transactionCount"
[value]="activitiesCount"
/>
@if (transactionCount && userCount) {
@if (activitiesCount && userCount) {
<div>
{{ transactionCount / userCount | number: '1.2-2' }}
{{ activitiesCount / userCount | number: '1.2-2' }}
<span i18n>per User</span>
</div>
}

58
apps/client/src/app/components/admin-users/admin-users.component.ts

@ -57,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: [
@ -139,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');
@ -149,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,
@ -208,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?`
});
}
@ -293,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,
@ -305,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
);
}
});
}
}

20
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<string>();
@ViewChild('chartCanvas') chartCanvas;
@ViewChild('chartCanvas') chartCanvas: ElementRef<HTMLCanvasElement>;
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<TooltipOptions<'line'>> {
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'
};

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

@ -380,10 +380,10 @@
[deviceType]="data.deviceType"
[hasPermissionToOpenDetails]="false"
[locale]="user?.settings?.locale"
[showActivitiesCount]="false"
[showAllocationInPercentage]="user?.settings?.isExperimentalFeatures"
[showBalance]="false"
[showFooter]="false"
[showTransactions]="false"
[showValue]="false"
[showValueInBaseCurrency]="false"
/>

50
apps/client/src/app/components/investment-chart/investment-chart.component.ts

@ -1,6 +1,5 @@
import {
getTooltipOptions,
getTooltipPositionerMapTop,
getVerticalHoverLinePlugin,
transformTickToAbbreviation
} from '@ghostfolio/common/chart-helper';
@ -15,11 +14,13 @@ import {
import { LineChartItem } from '@ghostfolio/common/interfaces';
import { InvestmentItem } from '@ghostfolio/common/interfaces/investment-item.interface';
import { ColorScheme, GroupBy } from '@ghostfolio/common/types';
import { registerChartConfiguration } from '@ghostfolio/ui/chart';
import { CommonModule } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
type ElementRef,
Input,
OnChanges,
OnDestroy,
@ -34,12 +35,15 @@ import {
LineController,
LineElement,
PointElement,
type ScriptableLineSegmentContext,
TimeScale,
Tooltip,
TooltipPosition
type TooltipOptions
} from 'chart.js';
import 'chartjs-adapter-date-fns';
import annotationPlugin from 'chartjs-plugin-annotation';
import annotationPlugin, {
type AnnotationOptions
} from 'chartjs-plugin-annotation';
import { isAfter } from 'date-fns';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
@ -62,7 +66,7 @@ export class GfInvestmentChartComponent implements OnChanges, OnDestroy {
@Input() locale = getLocale();
@Input() savingsRate = 0;
@ViewChild('chartCanvas') chartCanvas;
@ViewChild('chartCanvas') chartCanvas: ElementRef<HTMLCanvasElement>;
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<string, AnnotationOptions<'line'>>;
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<T>(aContext: any, aValue: T) {
private isInFuture<T>(aContext: ScriptableLineSegmentContext, aValue: T) {
return isAfter(new Date(aContext?.p1?.parsed?.x), new Date())
? aValue
: undefined;

1
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;

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

@ -1,6 +1,4 @@
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';
@ -16,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';
@ -25,11 +27,11 @@ import { UserDetailDialogParams } from './interfaces/interfaces';
changeDetection: ChangeDetectionStrategy.OnPush,
host: { class: 'd-flex flex-column h-100' },
imports: [
GfDialogFooterComponent,
GfDialogHeaderComponent,
GfValueComponent,
IonIcon,
MatButtonModule,
MatDialogModule
MatDialogModule,
MatMenuModule
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
selector: 'gf-user-detail-dialog',
@ -46,7 +48,11 @@ export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams,
public dialogRef: MatDialogRef<GfUserDetailDialogComponent>
) {}
) {
addIcons({
ellipsisVertical
});
}
public ngOnInit() {
this.adminService
@ -66,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();
}

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

@ -1,9 +1,28 @@
<gf-dialog-header
position="center"
[deviceType]="data.deviceType"
(closeButtonClicked)="onClose()"
/>
<div class="d-flex justify-content-end">
<button
class="mx-1 no-min-width px-2"
mat-button
type="button"
[matMenuTriggerFor]="userDetailActionsMenu"
(click)="$event.stopPropagation()"
>
<ion-icon name="ellipsis-vertical" />
</button>
<mat-menu
#userDetailActionsMenu="matMenu"
class="no-max-width"
xPosition="before"
>
<button
mat-menu-item
type="button"
[disabled]="this.data.currentUserId === this.data.userId"
(click)="deleteUser()"
>
<ng-container i18n>Delete</ng-container>
</button>
</mat-menu>
</div>
<div class="flex-grow-1" mat-dialog-content>
<div class="container p-0">
<div class="mb-3 row">
@ -103,7 +122,8 @@
</div>
</div>
<gf-dialog-footer
[deviceType]="data.deviceType"
(closeButtonClicked)="onClose()"
/>
<div class="justify-content-end" mat-dialog-actions>
<button mat-button type="button" (click)="onClose()">
<ng-container i18n>Close</ng-container>
</button>
</div>

10
apps/client/src/app/pages/accounts/accounts-page.component.ts

@ -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<void>();
@ -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;
}
}

2
apps/client/src/app/pages/accounts/accounts-page.html

@ -4,6 +4,7 @@
<h1 class="d-none d-sm-block h3 mb-4 text-center" i18n>Accounts</h1>
<gf-accounts-table
[accounts]="accounts"
[activitiesCount]="activitiesCount"
[baseCurrency]="user?.settings?.baseCurrency"
[deviceType]="deviceType"
[locale]="user?.settings?.locale"
@ -14,7 +15,6 @@
"
[totalBalanceInBaseCurrency]="totalBalanceInBaseCurrency"
[totalValueInBaseCurrency]="totalValueInBaseCurrency"
[transactionCount]="transactionCount"
(accountDeleted)="onDeleteAccount($event)"
(accountToUpdate)="onUpdateAccount($event)"
(transferBalance)="onTransferBalance()"

9
apps/client/src/app/pages/pricing/pricing-page.html

@ -195,12 +195,9 @@
</p>
<ul class="list-unstyled mb-3">
<li class="mb-2">
<span
><ng-container i18n>Everything in</ng-container>
<ng-container>&nbsp;</ng-container>
<strong>Basic</strong>,
<ng-container i18n>plus</ng-container>:</span
>
<ng-container i18n
>Everything in <strong>Basic</strong>, plus</ng-container
>:
</li>
<li class="align-items-center d-flex mb-1">
<ion-icon class="mr-1" name="checkmark-circle-outline" />

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

@ -295,7 +295,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="837553826328586238" datatype="html">
@ -358,14 +358,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Realment vol revocar aquest accés?</target>
@ -878,14 +870,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETFs sense País</target>
@ -1659,7 +1643,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -1675,7 +1659,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="5924141452953678982" datatype="html">
@ -2047,7 +2031,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -2123,7 +2107,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -2135,7 +2119,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -2235,7 +2219,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -2255,7 +2239,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -2271,7 +2255,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -2287,7 +2271,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -2299,7 +2283,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -2315,7 +2299,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -2399,7 +2383,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2527,7 +2511,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -3448,7 +3432,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3920,7 +3904,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="4808791512433987109" datatype="html">
@ -4480,7 +4464,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -4544,7 +4528,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -4576,7 +4560,7 @@
<target state="translated">Rendiment absolut dels actius</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -4584,7 +4568,7 @@
<target state="translated">Rendiment de l’actiu</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -4592,7 +4576,7 @@
<target state="translated">Rendiment absolut de la moneda</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -4600,7 +4584,7 @@
<target state="translated">Rendiment de la moneda</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
@ -4608,7 +4592,7 @@
<target state="translated">A dalt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -4616,7 +4600,7 @@
<target state="translated">A baix</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -4624,7 +4608,7 @@
<target state="translated">Evolució de la cartera</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -4632,7 +4616,7 @@
<target state="translated">Cronologia de la inversió</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
@ -4640,7 +4624,7 @@
<target state="translated">Ratxa actual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4648,7 +4632,7 @@
<target state="translated">Ratxa més llarga</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -4656,7 +4640,7 @@
<target state="translated">Cronologia de dividends</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -4832,7 +4816,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -4848,7 +4832,7 @@
<target state="translated">Suport per correu electrònic i xat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
@ -4856,7 +4840,7 @@
<target state="translated">Pagament únic, sense renovació automàtica.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -4876,7 +4860,7 @@
<target state="translated">És gratuït.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -5305,7 +5289,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5593,7 +5577,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -5944,6 +5928,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satèl·lit</target>
@ -6857,7 +6849,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6969,7 +6961,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7379,7 +7371,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="new">with API access for</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -42,7 +42,7 @@
<target state="translated">bitte</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -89,14 +89,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="translated">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Möchtest du diese Zugangsberechtigung wirklich widerrufen?</target>
@ -742,7 +734,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -874,7 +866,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -926,7 +918,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -938,7 +930,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1122,7 +1114,7 @@
<target state="translated">Performance mit Währungseffekt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1262,7 +1254,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -1862,7 +1854,7 @@
<target state="translated">Zeitstrahl der Investitionen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
@ -1870,7 +1862,7 @@
<target state="translated">Gewinner</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -1878,7 +1870,7 @@
<target state="translated">Verlierer</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -2346,7 +2338,7 @@
<target state="translated">kontaktiere uns</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -2762,7 +2754,7 @@
<target state="translated">Portfolio Wertentwicklung</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="8192718423057883427" datatype="html">
@ -3138,7 +3130,7 @@
<target state="translated">Zeitstrahl der Dividenden</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7763941937414903315" datatype="html">
@ -3146,7 +3138,7 @@
<target state="translated">Suchst du nach einem Studentenrabatt?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -3369,6 +3361,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="translated">Alles von <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satellit</target>
@ -3422,7 +3422,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -3438,7 +3438,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -3454,7 +3454,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -3470,7 +3470,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4563965495368336177" datatype="html">
@ -3518,7 +3518,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="195913158506780337" datatype="html">
@ -3602,7 +3602,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -3618,7 +3618,7 @@
<target state="translated">Einmalige Zahlung, keine automatische Erneuerung.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -3638,7 +3638,7 @@
<target state="translated">Es ist kostenlos.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5012084291992448490" datatype="html">
@ -3670,7 +3670,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="6037201184636207208" datatype="html">
@ -3714,7 +3714,7 @@
<target state="translated">E-Mail und Chat Support</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="3298117765569632011" datatype="html">
@ -3766,7 +3766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="8130557161756365658" datatype="html">
@ -3790,7 +3790,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="6962217007874959362" datatype="html">
@ -4034,7 +4034,7 @@
<target state="translated">Aktueller Streak</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4042,7 +4042,7 @@
<target state="translated">Längster Streak</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="4845030128243887325" datatype="html">
@ -4489,14 +4489,6 @@
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="translated">Alles von</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETFs ohne Länder</target>
@ -5396,7 +5388,7 @@
<target state="translated">mit deiner Universitäts-E-Mail-Adresse</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="7029006507527852669" datatype="html">
@ -5580,7 +5572,7 @@
<target state="translated">Fordere ihn an</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5900,7 +5892,7 @@
<target state="translated">hier</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5916,7 +5908,7 @@
<target state="translated">Absolute Anlage Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5924,7 +5916,7 @@
<target state="translated">Anlage Performance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5932,7 +5924,7 @@
<target state="translated">Absolute Währungsperformance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5940,7 +5932,7 @@
<target state="translated">Währungsperformance</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6881,7 +6873,7 @@
<target state="translated">Wenn du die Eröffnung eines Kontos planst bei</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6993,7 +6985,7 @@
<target state="translated">um unseren Empfehlungslink zu verwenden und eine Ghostfolio Premium-Mitgliedschaft für ein Jahr zu erhalten</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7403,7 +7395,7 @@
<target state="translated">Änderung mit Währungseffekt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7567,7 +7559,7 @@
<target state="translated">Gesamtbetrag</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7748,7 +7740,7 @@
<target state="translated">inklusive API-Zugriff für</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="5201942929131534075" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

File diff suppressed because it is too large

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

@ -34,7 +34,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -81,14 +81,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Voulez-vous vraiment révoquer cet accès ?</target>
@ -1142,7 +1134,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1194,7 +1186,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1206,7 +1198,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1354,7 +1346,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1542,7 +1534,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -2394,7 +2386,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -2458,7 +2450,7 @@
<target state="translated">Haut</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -2466,7 +2458,7 @@
<target state="translated">Bas</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -2474,7 +2466,7 @@
<target state="translated">Évolution du Portefeuille</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -2482,7 +2474,7 @@
<target state="translated">Historique des Investissements</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -2490,7 +2482,7 @@
<target state="translated">Historique des Dividendes</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -2594,7 +2586,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -2822,7 +2814,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -3353,6 +3345,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satellite</target>
@ -3406,7 +3406,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -3422,7 +3422,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -3438,7 +3438,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -3454,7 +3454,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4563965495368336177" datatype="html">
@ -3502,7 +3502,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="195913158506780337" datatype="html">
@ -3586,7 +3586,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -3602,7 +3602,7 @@
<target state="translated">Paiement unique, sans auto-renouvellement.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -3622,7 +3622,7 @@
<target state="translated">C’est gratuit.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5012084291992448490" datatype="html">
@ -3654,7 +3654,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="6037201184636207208" datatype="html">
@ -3698,7 +3698,7 @@
<target state="translated">Support par E-mail et Tchat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="3298117765569632011" datatype="html">
@ -3742,7 +3742,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="8130557161756365658" datatype="html">
@ -3766,7 +3766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="6962217007874959362" datatype="html">
@ -4010,7 +4010,7 @@
<target state="translated">Série en cours</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4018,7 +4018,7 @@
<target state="translated">Série la plus longue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="4845030128243887325" datatype="html">
@ -4465,14 +4465,6 @@
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETF sans Pays</target>
@ -5372,7 +5364,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="7029006507527852669" datatype="html">
@ -5556,7 +5548,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5876,7 +5868,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5892,7 +5884,7 @@
<target state="translated">Performance des Actifs en valeur absolue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5900,7 +5892,7 @@
<target state="translated">Performance des Actifs</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5908,7 +5900,7 @@
<target state="translated">Performance des devises en valeur absolue</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5916,7 +5908,7 @@
<target state="translated">Performance des devises</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6857,7 +6849,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6969,7 +6961,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7379,7 +7371,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="translated">avec accès API pour</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -43,7 +43,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -90,14 +90,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Vuoi davvero revocare l’accesso concesso?</target>
@ -727,7 +719,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -859,7 +851,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -911,7 +903,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -923,7 +915,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1107,7 +1099,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1247,7 +1239,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -1847,7 +1839,7 @@
<target state="translated">Cronologia degli investimenti</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
@ -1855,7 +1847,7 @@
<target state="translated">In alto</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -1863,7 +1855,7 @@
<target state="translated">In basso</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -2331,7 +2323,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -2747,7 +2739,7 @@
<target state="translated">Evoluzione del portafoglio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="8192718423057883427" datatype="html">
@ -3123,7 +3115,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -3163,7 +3155,7 @@
<target state="translated">Cronologia dei dividendi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7608037008789240367" datatype="html">
@ -3354,6 +3346,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satellite</target>
@ -3407,7 +3407,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -3423,7 +3423,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -3439,7 +3439,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -3455,7 +3455,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4563965495368336177" datatype="html">
@ -3503,7 +3503,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="195913158506780337" datatype="html">
@ -3587,7 +3587,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -3603,7 +3603,7 @@
<target state="translated">Pagamento una tantum, senza rinnovo automatico.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -3623,7 +3623,7 @@
<target state="translated">È gratuito.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5012084291992448490" datatype="html">
@ -3655,7 +3655,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="6037201184636207208" datatype="html">
@ -3699,7 +3699,7 @@
<target state="translated">Supporto via email e chat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="3298117765569632011" datatype="html">
@ -3743,7 +3743,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="8130557161756365658" datatype="html">
@ -3767,7 +3767,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="6962217007874959362" datatype="html">
@ -4011,7 +4011,7 @@
<target state="translated">Serie attuale</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4019,7 +4019,7 @@
<target state="translated">Serie più lunga</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="4845030128243887325" datatype="html">
@ -4466,14 +4466,6 @@
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETF senza paesi</target>
@ -5373,7 +5365,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="7029006507527852669" datatype="html">
@ -5557,7 +5549,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5877,7 +5869,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5893,7 +5885,7 @@
<target state="translated">Rendimento assoluto dell’Asset</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5901,7 +5893,7 @@
<target state="translated">Rendimento dell’Asset</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5909,7 +5901,7 @@
<target state="translated">Rendimento assoluto della Valuta</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5917,7 +5909,7 @@
<target state="translated">Rendimento della Valuta</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6858,7 +6850,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6970,7 +6962,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7380,7 +7372,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7544,7 +7536,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7725,7 +7717,7 @@
<target state="translated">con accesso API per</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8024,7 +8016,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8036,7 +8028,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -244,7 +244,7 @@
<target state="translated">부탁드립니다</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -291,14 +291,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="translated">추가로</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">이 부여된 접근 권한을 정말로 회수하시겠습니까?</target>
@ -767,14 +759,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="translated">다음 통화 기준으로 모두 표시</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">국가 정보 없는 ETF</target>
@ -1776,7 +1760,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1840,7 +1824,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1852,7 +1836,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1996,7 +1980,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -2016,7 +2000,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -2032,7 +2016,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -2048,7 +2032,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -2060,7 +2044,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -2076,7 +2060,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -2132,7 +2116,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
@ -2188,7 +2172,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2276,7 +2260,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -3116,7 +3100,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3572,7 +3556,7 @@
<target state="translated">대학 이메일 주소로</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="4808791512433987109" datatype="html">
@ -4124,7 +4108,7 @@
<target state="translated">학생 할인을 찾고 계십니까?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -4196,7 +4180,7 @@
<target state="translated">상위</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -4204,7 +4188,7 @@
<target state="translated">하위</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -4212,7 +4196,7 @@
<target state="translated">포트폴리오 진화</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -4220,7 +4204,7 @@
<target state="translated">투자 일정</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
@ -4228,7 +4212,7 @@
<target state="translated">현재 연속</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4236,7 +4220,7 @@
<target state="translated">최장 연속</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -4244,7 +4228,7 @@
<target state="translated">배당 일정</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -4420,7 +4404,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -4436,7 +4420,7 @@
<target state="translated">이메일 및 채팅 지원</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -4452,7 +4436,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
@ -4460,7 +4444,7 @@
<target state="translated">일회성 결제, 자동 갱신 없음.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -4480,7 +4464,7 @@
<target state="translated">무료입니다.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -4901,7 +4885,7 @@
<target state="translated">요청하세요</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5069,7 +5053,7 @@
<target state="translated">저희에게 연락주세요</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -5396,6 +5380,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">위성</target>
@ -5877,7 +5869,7 @@
<target state="translated">절대적인 통화 성과</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5893,7 +5885,7 @@
<target state="translated">절대자산성과</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="8580549503047096056" datatype="html">
@ -5925,7 +5917,7 @@
<target state="translated">여기</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5933,7 +5925,7 @@
<target state="translated">자산 성과</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5941,7 +5933,7 @@
<target state="translated">통화 성과</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -6898,7 +6890,7 @@
<target state="translated">에서 계좌를 개설할 계획이라면</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6986,7 +6978,7 @@
<target state="translated">추천 링크를 사용하고 1년 동안 Ghostfolio 프리미엄 멤버십을 얻으려면</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7404,7 +7396,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7568,7 +7560,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7749,7 +7741,7 @@
<target state="translated">다음에 대한 API 액세스 권한이 있는</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="5201942929131534075" datatype="html">
@ -8024,7 +8016,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8036,7 +8028,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="5643561794785412000" datatype="html">

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

@ -42,7 +42,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -89,14 +89,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Wil je deze verleende toegang echt intrekken?</target>
@ -726,7 +718,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -858,7 +850,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -910,7 +902,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -922,7 +914,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1106,7 +1098,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1246,7 +1238,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -1846,7 +1838,7 @@
<target state="translated">Tijdlijn investeringen</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
@ -1854,7 +1846,7 @@
<target state="translated">Winnaars</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -1862,7 +1854,7 @@
<target state="translated">Verliezers</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -2330,7 +2322,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -2746,7 +2738,7 @@
<target state="translated">Waardeontwikkeling van portefeuille</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="8192718423057883427" datatype="html">
@ -3122,7 +3114,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -3162,7 +3154,7 @@
<target state="translated">Tijdlijn dividend</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7608037008789240367" datatype="html">
@ -3353,6 +3345,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satelliet</target>
@ -3406,7 +3406,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -3422,7 +3422,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -3438,7 +3438,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -3454,7 +3454,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4563965495368336177" datatype="html">
@ -3502,7 +3502,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="195913158506780337" datatype="html">
@ -3586,7 +3586,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -3602,7 +3602,7 @@
<target state="translated">Eenmalige betaling, geen automatische verlenging.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -3622,7 +3622,7 @@
<target state="translated">Het is gratis.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5012084291992448490" datatype="html">
@ -3654,7 +3654,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="6037201184636207208" datatype="html">
@ -3698,7 +3698,7 @@
<target state="translated">Ondersteuning via e-mail en chat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="3298117765569632011" datatype="html">
@ -3742,7 +3742,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="8130557161756365658" datatype="html">
@ -3766,7 +3766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="6962217007874959362" datatype="html">
@ -4010,7 +4010,7 @@
<target state="translated">Huidige reeks</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4018,7 +4018,7 @@
<target state="translated">Langste reeks</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="4845030128243887325" datatype="html">
@ -4465,14 +4465,6 @@
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETF’s zonder Landen</target>
@ -5372,7 +5364,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="7029006507527852669" datatype="html">
@ -5556,7 +5548,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5876,7 +5868,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5892,7 +5884,7 @@
<target state="translated">Absolute Activaprestaties</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5900,7 +5892,7 @@
<target state="translated">Activaprestaties</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5908,7 +5900,7 @@
<target state="translated">Absolute Valutaprestaties</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5916,7 +5908,7 @@
<target state="translated">Valutaprestaties</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6857,7 +6849,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6969,7 +6961,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7379,7 +7371,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="translated">met API toegang tot</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -243,7 +243,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -290,14 +290,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Czy na pewno chcesz cofnąć przyznany dostęp?</target>
@ -758,14 +750,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETF-y bez Krajów</target>
@ -1743,7 +1727,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1807,7 +1791,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1819,7 +1803,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1963,7 +1947,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -1983,7 +1967,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -1999,7 +1983,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -2015,7 +1999,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -2027,7 +2011,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -2043,7 +2027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -2099,7 +2083,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
@ -2155,7 +2139,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2243,7 +2227,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -3083,7 +3067,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3539,7 +3523,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="4808791512433987109" datatype="html">
@ -4091,7 +4075,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -4163,7 +4147,7 @@
<target state="translated">Największe wzrosty</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -4171,7 +4155,7 @@
<target state="translated">Największy spadek</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -4179,7 +4163,7 @@
<target state="translated">Rozwój portfela</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -4187,7 +4171,7 @@
<target state="translated">Oś czasu inwestycji</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
@ -4195,7 +4179,7 @@
<target state="translated">Obecna passa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4203,7 +4187,7 @@
<target state="translated">Najdłuższa passa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -4211,7 +4195,7 @@
<target state="translated">Oś czasu dywidend</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -4387,7 +4371,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -4403,7 +4387,7 @@
<target state="translated">Wsparcie przez E-mail i Czat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -4419,7 +4403,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
@ -4427,7 +4411,7 @@
<target state="translated">Płatność jednorazowa, bez automatycznego odnawiania.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -4447,7 +4431,7 @@
<target state="translated">Jest bezpłatny.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -4856,7 +4840,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5000,7 +4984,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -5327,6 +5311,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satelita</target>
@ -5876,7 +5868,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5892,7 +5884,7 @@
<target state="translated">Łączny wynik aktywów</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5900,7 +5892,7 @@
<target state="translated">Wyniki aktywów</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5908,7 +5900,7 @@
<target state="translated">Łączny wynik walut</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5916,7 +5908,7 @@
<target state="translated">Wynik walut</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6857,7 +6849,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6969,7 +6961,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7379,7 +7371,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="translated">z dostępem API dla</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -34,7 +34,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -81,14 +81,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Pretende realmente revogar este acesso concedido?</target>
@ -1026,7 +1018,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1078,7 +1070,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1090,7 +1082,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1350,7 +1342,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -1538,7 +1530,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -2374,7 +2366,7 @@
<target state="translated">Topo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -2382,7 +2374,7 @@
<target state="translated">Fundo</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -2390,7 +2382,7 @@
<target state="translated">Evolução do Portefólio</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -2398,7 +2390,7 @@
<target state="translated">Cronograma de Investimento</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -2530,7 +2522,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -2722,7 +2714,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -3186,7 +3178,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -3226,7 +3218,7 @@
<target state="translated">Cronograma de Dividendos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="7608037008789240367" datatype="html">
@ -3353,6 +3345,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Satélite</target>
@ -3406,7 +3406,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -3422,7 +3422,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -3438,7 +3438,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -3454,7 +3454,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4563965495368336177" datatype="html">
@ -3502,7 +3502,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="195913158506780337" datatype="html">
@ -3586,7 +3586,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -3602,7 +3602,7 @@
<target state="translated">Pagamento único, sem renovação automática.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -3622,7 +3622,7 @@
<target state="translated">É gratuito.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5012084291992448490" datatype="html">
@ -3654,7 +3654,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="6037201184636207208" datatype="html">
@ -3698,7 +3698,7 @@
<target state="translated">Suporte por Email e Chat</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="3298117765569632011" datatype="html">
@ -3742,7 +3742,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="8130557161756365658" datatype="html">
@ -3766,7 +3766,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="6962217007874959362" datatype="html">
@ -4010,7 +4010,7 @@
<target state="translated">Série Atual</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4018,7 +4018,7 @@
<target state="translated">Série mais Longa</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="4845030128243887325" datatype="html">
@ -4465,14 +4465,6 @@
<context context-type="linenumber">43</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETFs sem países</target>
@ -5372,7 +5364,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="7029006507527852669" datatype="html">
@ -5556,7 +5548,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5876,7 +5868,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5892,7 +5884,7 @@
<target state="translated">Desempenho absoluto de ativos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5900,7 +5892,7 @@
<target state="translated">Desempenho de ativos</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5908,7 +5900,7 @@
<target state="translated">Desempenho absoluto da moeda</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5916,7 +5908,7 @@
<target state="translated">Desempenho da moeda</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6857,7 +6849,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6969,7 +6961,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7379,7 +7371,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="new">with API access for</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -215,7 +215,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -262,14 +262,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Bu erişim iznini geri almayı gerçekten istiyor musunuz?</target>
@ -722,14 +714,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">Ülkesi Olmayan ETF’ler</target>
@ -1611,7 +1595,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1663,7 +1647,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1675,7 +1659,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1831,7 +1815,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -1851,7 +1835,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -1867,7 +1851,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -1883,7 +1867,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -1895,7 +1879,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -1911,7 +1895,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -1967,7 +1951,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
@ -2023,7 +2007,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2659,7 +2643,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3575,7 +3559,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -3647,7 +3631,7 @@
<target state="translated">Üst</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -3655,7 +3639,7 @@
<target state="translated">Alt</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -3663,7 +3647,7 @@
<target state="translated">Portföyün Gelişimi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -3671,7 +3655,7 @@
<target state="translated">Yatırım Zaman Çizelgesi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
@ -3679,7 +3663,7 @@
<target state="translated">Güncel Seri</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -3687,7 +3671,7 @@
<target state="translated">En Uzun Seri</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -3695,7 +3679,7 @@
<target state="translated">Temettü Zaman Çizelgesi</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -3871,7 +3855,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -3887,7 +3871,7 @@
<target state="translated">E-posta ve Sohbet Desteği</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -3903,7 +3887,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
@ -3911,7 +3895,7 @@
<target state="translated">Tek seferlik ödeme, otomatik yenileme yok.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -3931,7 +3915,7 @@
<target state="translated">Ücretsiz.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -4428,7 +4412,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -4696,7 +4680,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -5023,6 +5007,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Uydu</target>
@ -5380,7 +5372,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="7029006507527852669" datatype="html">
@ -5556,7 +5548,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5876,7 +5868,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5892,7 +5884,7 @@
<target state="translated">Mutlak Varlık Performansı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5900,7 +5892,7 @@
<target state="translated">Varlık Performansı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -5908,7 +5900,7 @@
<target state="translated">Mutlak Para Performansı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5916,7 +5908,7 @@
<target state="translated">Para Performansı</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="3105754554141014845" datatype="html">
@ -6857,7 +6849,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6969,7 +6961,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7379,7 +7371,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="translated">API erişimi için</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -295,7 +295,7 @@
<target state="new">please</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="837553826328586238" datatype="html">
@ -374,14 +374,6 @@
<context context-type="linenumber">99</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">Ви дійсно хочете відкликати цей наданий доступ?</target>
@ -858,14 +850,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">ETF без країн</target>
@ -1551,7 +1535,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1771,7 +1755,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -1787,7 +1771,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="5924141452953678982" datatype="html">
@ -1831,7 +1815,7 @@
<target state="new">If you plan to open an account at</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -2215,7 +2199,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -2227,7 +2211,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -2439,7 +2423,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -2459,7 +2443,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -2475,7 +2459,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -2491,7 +2475,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -2503,7 +2487,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -2519,7 +2503,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -2611,7 +2595,7 @@
<target state="new">Performance with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2815,7 +2799,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -3728,7 +3712,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4200,7 +4184,7 @@
<target state="new">with your university e-mail address</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="4808791512433987109" datatype="html">
@ -4796,7 +4780,7 @@
<target state="new">Looking for a student discount?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -4860,7 +4844,7 @@
<target state="new">here</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="6762743264882388498" datatype="html">
@ -4892,7 +4876,7 @@
<target state="translated">Абсолютна прибутковість активів</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -4900,7 +4884,7 @@
<target state="translated">Прибутковість активів</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="3796488546909223546" datatype="html">
@ -4908,7 +4892,7 @@
<target state="translated">Абсолютна прибутковість валюти</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -4916,7 +4900,7 @@
<target state="translated">Прибутковість валюти</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="6293970137138896363" datatype="html">
@ -4924,7 +4908,7 @@
<target state="translated">Топ</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -4932,7 +4916,7 @@
<target state="translated">Низ</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -4940,7 +4924,7 @@
<target state="translated">Еволюція портфеля</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -4948,7 +4932,7 @@
<target state="translated">Інвестиційний графік</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
@ -4956,7 +4940,7 @@
<target state="translated">Поточна серія</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4964,7 +4948,7 @@
<target state="translated">Найдовша серія</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -4972,7 +4956,7 @@
<target state="translated">Графік дивідендів</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -5188,7 +5172,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -5204,7 +5188,7 @@
<target state="translated">Підтримка електронної пошти та чату</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
@ -5212,7 +5196,7 @@
<target state="translated">Разова оплата, без автоматичного поновлення.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -5232,7 +5216,7 @@
<target state="translated">Це безкоштовно.</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -5847,7 +5831,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -6035,7 +6019,7 @@
<target state="new">Request it</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -6323,7 +6307,7 @@
<target state="new">contact us</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -6790,6 +6774,14 @@
<context context-type="linenumber">28</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="new">Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="8050244774979733855" datatype="html">
<source>Satellite</source>
<target state="translated">Супутник</target>
@ -7387,7 +7379,7 @@
<target state="new">Change with currency effect</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7543,7 +7535,7 @@
<target state="new">Total amount</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7724,7 +7716,7 @@
<target state="new">with API access for</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8023,7 +8015,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8035,7 +8027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

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

@ -228,7 +228,7 @@
<source>please</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -271,13 +271,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<context-group purpose="location">
@ -718,13 +711,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<context-group purpose="location">
@ -1631,7 +1617,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1689,7 +1675,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1700,7 +1686,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1829,7 +1815,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -1848,7 +1834,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -1863,7 +1849,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -1878,7 +1864,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -1889,7 +1875,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -1904,7 +1890,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -1957,7 +1943,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
@ -2008,7 +1994,7 @@
<source>Performance with currency effect</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2087,7 +2073,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -2860,7 +2846,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3104,6 +3090,13 @@
<context context-type="linenumber">172</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1018934700505948739" datatype="html">
<source>trading stocks, ETFs or cryptocurrencies on multiple platforms</source>
<context-group purpose="location">
@ -3269,7 +3262,7 @@
<source>with your university e-mail address</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="4808791512433987109" datatype="html">
@ -3766,7 +3759,7 @@
<source>Looking for a student discount?</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -3832,49 +3825,49 @@
<source>Top</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
<source>Bottom</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
<source>Portfolio Evolution</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
<source>Investment Timeline</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
<source>Current Streak</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
<source>Longest Streak</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
<source>Dividend Timeline</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -4034,7 +4027,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -4048,7 +4041,7 @@
<source>Email and Chat Support</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -4063,14 +4056,14 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
<source>One-time payment, no auto-renewal.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
@ -4088,7 +4081,7 @@
<source>It’s free.</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -4470,7 +4463,7 @@
<source>Request it</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -4619,7 +4612,7 @@
<source>contact us</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -5348,7 +5341,7 @@
<source>Absolute Currency Performance</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5362,7 +5355,7 @@
<source>Absolute Asset Performance</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="8580549503047096056" datatype="html">
@ -5392,21 +5385,21 @@
<source>here</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
<source>Asset Performance</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
<source>Currency Performance</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -6267,7 +6260,7 @@
<source>If you plan to open an account at</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6345,7 +6338,7 @@
<source>to use our referral link and get a Ghostfolio Premium membership for one year</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -6723,7 +6716,7 @@
<source>Change with currency effect</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -6869,7 +6862,7 @@
<source>Total amount</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7029,7 +7022,7 @@
<source>with API access for</source>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="5201942929131534075" datatype="html">
@ -7275,7 +7268,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -7286,7 +7279,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="5643561794785412000" datatype="html">

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

@ -244,7 +244,7 @@
<target state="translated">请</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">336</context>
<context context-type="linenumber">333</context>
</context-group>
</trans-unit>
<trans-unit id="8650499415827640724" datatype="html">
@ -291,14 +291,6 @@
<context context-type="linenumber">87</context>
</context-group>
</trans-unit>
<trans-unit id="8261513428977234574" datatype="html">
<source>plus</source>
<target state="new">plus</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">202</context>
</context-group>
</trans-unit>
<trans-unit id="8264698726451826067" datatype="html">
<source>Do you really want to revoke this granted access?</source>
<target state="translated">您真的要撤销此访问权限吗?</target>
@ -767,14 +759,6 @@
<context context-type="linenumber">96</context>
</context-group>
</trans-unit>
<trans-unit id="1802177588180209216" datatype="html">
<source>Everything in</source>
<target state="new">Everything in</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1806977783783486873" datatype="html">
<source>ETFs without Countries</source>
<target state="translated">没有国家的 ETF</target>
@ -1229,7 +1213,7 @@
</trans-unit>
<trans-unit id="8319378030525016917" datatype="html">
<source>Asset profile has been saved</source>
<target state="new">Asset profile has been saved</target>
<target state="translated">资产概况已保存</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">578</context>
@ -1245,7 +1229,7 @@
</trans-unit>
<trans-unit id="7702646444963497962" datatype="html">
<source>By</source>
<target state="new">By</target>
<target state="translated">预计到</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">139</context>
@ -1357,7 +1341,7 @@
</trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</target>
<target state="translated">会员资格不自动续订。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">74</context>
@ -1401,7 +1385,7 @@
</trans-unit>
<trans-unit id="7341990227686441824" datatype="html">
<source>Could not validate form</source>
<target state="new">Could not validate form</target>
<target state="translated">无法验证表单</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">554</context>
@ -1752,7 +1736,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context>
<context context-type="linenumber">326</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1816,7 +1800,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">257</context>
<context context-type="linenumber">259</context>
</context-group>
</trans-unit>
<trans-unit id="3118565567530464051" datatype="html">
@ -1828,7 +1812,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">276</context>
<context context-type="linenumber">278</context>
</context-group>
</trans-unit>
<trans-unit id="4980697492087090765" datatype="html">
@ -1972,7 +1956,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">207</context>
<context context-type="linenumber">204</context>
</context-group>
</trans-unit>
<trans-unit id="296005715452289357" datatype="html">
@ -1992,7 +1976,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">211</context>
<context context-type="linenumber">208</context>
</context-group>
</trans-unit>
<trans-unit id="5777928097698511040" datatype="html">
@ -2008,7 +1992,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">215</context>
<context context-type="linenumber">212</context>
</context-group>
</trans-unit>
<trans-unit id="685453282455108461" datatype="html">
@ -2024,7 +2008,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">219</context>
<context context-type="linenumber">216</context>
</context-group>
</trans-unit>
<trans-unit id="2486744036183712016" datatype="html">
@ -2036,7 +2020,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">223</context>
<context context-type="linenumber">220</context>
</context-group>
</trans-unit>
<trans-unit id="4809229280245558999" datatype="html">
@ -2052,7 +2036,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">246</context>
<context context-type="linenumber">243</context>
</context-group>
</trans-unit>
<trans-unit id="4505804162157040890" datatype="html">
@ -2108,7 +2092,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">284</context>
<context context-type="linenumber">281</context>
</context-group>
</trans-unit>
<trans-unit id="6048892649018070225" datatype="html">
@ -2161,10 +2145,10 @@
</trans-unit>
<trans-unit id="366169681580494481" datatype="html">
<source>Performance with currency effect</source>
<target state="new">Performance with currency effect</target>
<target state="translated">含货币影响的表现</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">134</context>
<context context-type="linenumber">135</context>
</context-group>
</trans-unit>
<trans-unit id="3667949571823271511" datatype="html">
@ -2252,7 +2236,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">268</context>
<context context-type="linenumber">265</context>
</context-group>
</trans-unit>
<trans-unit id="8589730128931685735" datatype="html">
@ -2389,7 +2373,7 @@
</trans-unit>
<trans-unit id="3004519800638083911" datatype="html">
<source>this is projected to increase to</source>
<target state="new">this is projected to increase to</target>
<target state="translated">预计将增至</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">147</context>
@ -2901,7 +2885,7 @@
</trans-unit>
<trans-unit id="5134951682994822188" datatype="html">
<source>Could not parse scraper configuration</source>
<target state="new">Could not parse scraper configuration</target>
<target state="translated">无法解析抓取器配置</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">509</context>
@ -3092,7 +3076,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">363</context>
<context context-type="linenumber">360</context>
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3359,6 +3343,14 @@
<context context-type="linenumber">172</context>
</context-group>
</trans-unit>
<trans-unit id="936060984157466006" datatype="html">
<source>Everything in <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/>, plus</source>
<target state="translated">包含 <x id="START_TAG_STRONG" ctype="x-strong" equiv-text="&lt;strong&gt;"/>Basic<x id="CLOSE_TAG_STRONG" ctype="x-strong" equiv-text="&lt;/strong&gt;"/> 所有功能,以及</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">199</context>
</context-group>
</trans-unit>
<trans-unit id="1018934700505948739" datatype="html">
<source>trading stocks, ETFs or cryptocurrencies on multiple platforms</source>
<target state="translated">在多个平台上交易股票、ETF 或加密货币</target>
@ -3548,7 +3540,7 @@
<target state="translated">使用您的学校电子邮件地址</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">351</context>
<context context-type="linenumber">348</context>
</context-group>
</trans-unit>
<trans-unit id="4808791512433987109" datatype="html">
@ -4100,7 +4092,7 @@
<target state="translated">寻找学生折扣?</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">345</context>
<context context-type="linenumber">342</context>
</context-group>
</trans-unit>
<trans-unit id="7765499580020598783" datatype="html">
@ -4137,7 +4129,7 @@
</trans-unit>
<trans-unit id="5211792611718918888" datatype="html">
<source>annual interest rate</source>
<target state="new">annual interest rate</target>
<target state="translated">年利率</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">185</context>
@ -4172,7 +4164,7 @@
<target state="translated">顶部</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">303</context>
<context context-type="linenumber">305</context>
</context-group>
</trans-unit>
<trans-unit id="3568940932272598597" datatype="html">
@ -4180,7 +4172,7 @@
<target state="translated">底部</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">352</context>
<context context-type="linenumber">354</context>
</context-group>
</trans-unit>
<trans-unit id="5242468862715363747" datatype="html">
@ -4188,7 +4180,7 @@
<target state="translated">投资组合演变</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">405</context>
<context context-type="linenumber">407</context>
</context-group>
</trans-unit>
<trans-unit id="6766448922039123937" datatype="html">
@ -4196,7 +4188,7 @@
<target state="translated">投资时间表</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">432</context>
<context context-type="linenumber">434</context>
</context-group>
</trans-unit>
<trans-unit id="1440519383036502539" datatype="html">
@ -4204,7 +4196,7 @@
<target state="translated">当前连胜</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">453</context>
<context context-type="linenumber">455</context>
</context-group>
</trans-unit>
<trans-unit id="457461496511383061" datatype="html">
@ -4212,7 +4204,7 @@
<target state="translated">最长连续纪录</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">462</context>
<context context-type="linenumber">464</context>
</context-group>
</trans-unit>
<trans-unit id="6854252543786630145" datatype="html">
@ -4220,7 +4212,7 @@
<target state="translated">股息时间表</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">489</context>
<context context-type="linenumber">491</context>
</context-group>
</trans-unit>
<trans-unit id="5857197365507636437" datatype="html">
@ -4369,7 +4361,7 @@
</trans-unit>
<trans-unit id="5891064527381218201" datatype="html">
<source>Free</source>
<target state="translated">自由的</target>
<target state="translated">免费</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">86</context>
@ -4396,7 +4388,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">255</context>
<context context-type="linenumber">252</context>
</context-group>
</trans-unit>
<trans-unit id="332047587746771816" datatype="html">
@ -4412,7 +4404,7 @@
<target state="translated">电子邮件和聊天支持</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">251</context>
<context context-type="linenumber">248</context>
</context-group>
</trans-unit>
<trans-unit id="2030314101752312029" datatype="html">
@ -4428,7 +4420,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">282</context>
<context context-type="linenumber">279</context>
</context-group>
</trans-unit>
<trans-unit id="7478722592449005806" datatype="html">
@ -4436,12 +4428,12 @@
<target state="translated">一次性付款,无自动续订。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">288</context>
<context context-type="linenumber">285</context>
</context-group>
</trans-unit>
<trans-unit id="7498591289549626867" datatype="html">
<source>Could not save asset profile</source>
<target state="new">Could not save asset profile</target>
<target state="translated">无法保存资产概况</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">588</context>
@ -4456,7 +4448,7 @@
<target state="translated">免费。</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context>
<context context-type="linenumber">362</context>
</context-group>
</trans-unit>
<trans-unit id="5342721262799645301" datatype="html">
@ -4877,7 +4869,7 @@
<target state="translated">请求它</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">347</context>
<context context-type="linenumber">344</context>
</context-group>
</trans-unit>
<trans-unit id="5278627882107105833" datatype="html">
@ -5045,7 +5037,7 @@
<target state="translated">联系我们</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">339</context>
<context context-type="linenumber">336</context>
</context-group>
</trans-unit>
<trans-unit id="1533391340482659699" datatype="html">
@ -5450,7 +5442,7 @@
</trans-unit>
<trans-unit id="2145636458848553570" datatype="html">
<source>Sign in with OpenID Connect</source>
<target state="new">Sign in with OpenID Connect</target>
<target state="translated">使用 OpenID Connect 登录</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html</context>
<context context-type="linenumber">55</context>
@ -5562,7 +5554,7 @@
</trans-unit>
<trans-unit id="8966698274727122602" datatype="html">
<source>Authentication</source>
<target state="new">Authentication</target>
<target state="translated">认证</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">35</context>
@ -5853,7 +5845,7 @@
<target state="translated">绝对货币表现</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">209</context>
<context context-type="linenumber">211</context>
</context-group>
</trans-unit>
<trans-unit id="1600023202562292052" datatype="html">
@ -5869,7 +5861,7 @@
<target state="translated">绝对资产回报</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">166</context>
<context context-type="linenumber">168</context>
</context-group>
</trans-unit>
<trans-unit id="8580549503047096056" datatype="html">
@ -5901,7 +5893,7 @@
<target state="translated">这里</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context>
<context context-type="linenumber">347</context>
</context-group>
</trans-unit>
<trans-unit id="775717789032174431" datatype="html">
@ -5909,7 +5901,7 @@
<target state="translated">资产回报</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">188</context>
<context context-type="linenumber">190</context>
</context-group>
</trans-unit>
<trans-unit id="104509087727626192" datatype="html">
@ -5917,7 +5909,7 @@
<target state="translated">货币表现</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">234</context>
<context context-type="linenumber">236</context>
</context-group>
</trans-unit>
<trans-unit id="2593751087640318641" datatype="html">
@ -6699,7 +6691,7 @@
</trans-unit>
<trans-unit id="1355312194390410495" datatype="html">
<source>, based on your total assets of</source>
<target state="new">基于您总资产的</target>
<target state="translated">基于您总资产的</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">96</context>
@ -6858,7 +6850,7 @@
<target state="translated">如果您计划开通账户在</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">315</context>
<context context-type="linenumber">312</context>
</context-group>
</trans-unit>
<trans-unit id="6608617124920241143" datatype="html">
@ -6959,7 +6951,7 @@
</trans-unit>
<trans-unit id="2878377610946588870" datatype="html">
<source>, assuming a</source>
<target state="new">, assuming a</target>
<target state="translated">, 假设一个</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">174</context>
@ -6970,7 +6962,7 @@
<target state="translated">使用我们的推荐链接并获得一年的Ghostfolio Premium会员资格</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context>
<context context-type="linenumber">340</context>
</context-group>
</trans-unit>
<trans-unit id="7530176451725943586" datatype="html">
@ -7377,10 +7369,10 @@
</trans-unit>
<trans-unit id="7825231215382064101" datatype="html">
<source>Change with currency effect</source>
<target state="new">Change with currency effect</target>
<target state="translated">含货币影响的涨跌</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">115</context>
<context context-type="linenumber">116</context>
</context-group>
</trans-unit>
<trans-unit id="7826234236931647519" datatype="html">
@ -7541,10 +7533,10 @@
</trans-unit>
<trans-unit id="5004550577313573215" datatype="html">
<source>Total amount</source>
<target state="new">Total amount</target>
<target state="translated">总金额</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/analysis/analysis-page.html</context>
<context context-type="linenumber">94</context>
<context context-type="linenumber">95</context>
</context-group>
</trans-unit>
<trans-unit id="5004849258025239958" datatype="html">
@ -7725,7 +7717,7 @@
<target state="translated">包含 API 访问权限,适用于</target>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">238</context>
<context context-type="linenumber">235</context>
</context-group>
</trans-unit>
<trans-unit id="4396995010887588291" datatype="html">
@ -8024,7 +8016,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">297</context>
<context context-type="linenumber">294</context>
</context-group>
</trans-unit>
<trans-unit id="2415916442984615985" datatype="html">
@ -8036,7 +8028,7 @@
</context-group>
<context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">300</context>
<context context-type="linenumber">297</context>
</context-group>
</trans-unit>
<trans-unit id="3955868613858648955" datatype="html">

4
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'],

69
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<T extends ChartType>({
colorScheme,
currency = '',
groupBy,
locale = getLocale(),
unit = ''
}: {
colorScheme?: ColorScheme;
colorScheme: ColorScheme;
currency?: string;
groupBy?: GroupBy;
locale?: string;
unit?: string;
} = {}) {
}): Partial<TooltipOptions<T>> {
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<T extends 'line' | 'bar'>(
chartCanvas: ElementRef<HTMLCanvasElement>,
colorScheme: ColorScheme
): Plugin<T, { color: string; width: number }> {
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'
};

2
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;
}

52
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 = [
{

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

@ -144,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, '');
@ -223,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':
@ -232,7 +232,7 @@ export function getDateFormatString(aLocale?: string) {
case 'year':
return 'yyyy';
default:
return object.value;
return value;
}
})
.join('');
@ -271,9 +271,9 @@ export function getLowercase(object: object, path: string) {
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()) {
@ -281,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) {
@ -394,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;
}

2
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;
}

4
libs/common/src/lib/interfaces/portfolio-position.interface.ts

@ -39,10 +39,6 @@ export interface PortfolioPosition {
sectors: Sector[];
symbol: string;
tags?: Tag[];
/** @deprecated use activitiesCount instead */
transactionCount: number;
type?: string;
url?: string;
valueInBaseCurrency?: number;

3
libs/common/src/lib/interfaces/responses/accounts-response.interface.ts

@ -7,7 +7,4 @@ export interface AccountsResponse {
totalDividendInBaseCurrency: number;
totalInterestInBaseCurrency: number;
totalValueInBaseCurrency: number;
/** @deprecated use activitiesCount instead */
transactionCount: number;
}

3
libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts

@ -1,6 +1,3 @@
export interface CreateStripeCheckoutSessionResponse {
/** @deprecated */
sessionId: string;
sessionUrl: string;
}

2
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<PortfolioDetails['markets']>[key],
'id' | 'valueInPercentage'
>;
};

6
libs/common/src/lib/models/timeline-position.ts

@ -35,9 +35,6 @@ export class TimelinePosition {
@Type(() => Big)
feeInBaseCurrency: Big;
/** @deprecated use dateOfFirstActivity instead */
firstBuyDate: string;
@Transform(transformToBig, { toClassOnly: true })
@Type(() => Big)
grossPerformance: Big;
@ -96,9 +93,6 @@ export class TimelinePosition {
@Type(() => Big)
timeWeightedInvestmentWithCurrencyEffect: Big;
/** @deprecated use activitiesCount instead */
transactionCount: number;
@Transform(transformToBig, { toClassOnly: true })
@Type(() => Big)
valueInBaseCurrency: Big;

2
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<string, InternalRoute>;
title: string;

4
libs/common/src/lib/types/account-with-value.type.ts

@ -7,10 +7,6 @@ export type AccountWithValue = AccountModel & {
dividendInBaseCurrency: number;
interestInBaseCurrency: number;
platform?: Platform;
/** @deprecated use activitiesCount instead */
transactionCount: number;
value: number;
valueInBaseCurrency: number;
};

4
libs/common/src/lib/utils/form.util.ts

@ -29,7 +29,7 @@ export async function validateObjectForForm<T>({
if (formControl) {
formControl.setErrors({
validationError: Object.values(constraints)[0]
validationError: Object.values(constraints ?? {})[0]
});
}
@ -37,7 +37,7 @@ export async function validateObjectForForm<T>({
if (formControlInCustomCurrency) {
formControlInCustomCurrency.setErrors({
validationError: Object.values(constraints)[0]
validationError: Object.values(constraints ?? {})[0]
});
}
}

2
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: [],

3
libs/common/tsconfig.json

@ -12,6 +12,7 @@
],
"compilerOptions": {
"module": "preserve",
"lib": ["dom", "es2022"]
"lib": ["dom", "es2022"],
"strictNullChecks": true
}
}

10
libs/ui/src/lib/accounts-table/accounts-table.component.html

@ -115,21 +115,21 @@
></td>
</ng-container>
<ng-container matColumnDef="transactions">
<ng-container matColumnDef="activitiesCount">
<th
*matHeaderCellDef
class="justify-content-end px-1"
mat-header-cell
mat-sort-header="transactionCount"
mat-sort-header="activitiesCount"
>
<span class="d-block d-sm-none">#</span>
<span class="d-none d-sm-block" i18n>Activities</span>
</th>
<td *matCellDef="let element" class="px-1 text-right" mat-cell>
{{ element.transactionCount }}
{{ element.activitiesCount }}
</td>
<td *matFooterCellDef class="px-1 text-right" mat-footer-cell>
{{ transactionCount }}
{{ activitiesCount }}
</td>
</ng-container>
@ -323,7 +323,7 @@
<hr class="m-0" />
<button
mat-menu-item
[disabled]="element.transactionCount > 0"
[disabled]="element.activitiesCount > 0"
(click)="onDeleteAccount(element.id)"
>
<span class="align-items-center d-flex">

20
libs/ui/src/lib/accounts-table/accounts-table.component.stories.ts

@ -16,6 +16,7 @@ import { GfAccountsTableComponent } from './accounts-table.component';
const accounts = [
{
activitiesCount: 0,
allocationInPercentage: null,
balance: 278,
balanceInBaseCurrency: 278,
@ -31,13 +32,13 @@ const accounts = [
url: 'https://www.coinbase.com'
},
platformId: '8dc24b88-bb92-4152-af25-fe6a31643e26',
transactionCount: 0,
updatedAt: new Date('2025-06-01T06:52:49.063Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
value: 278,
valueInBaseCurrency: 278
},
{
activitiesCount: 0,
allocationInPercentage: null,
balance: 12000,
balanceInBaseCurrency: 12000,
@ -53,13 +54,13 @@ const accounts = [
url: 'https://www.jpmorgan.com'
},
platformId: '43e8fcd1-5b79-4100-b678-d2229bd1660d',
transactionCount: 0,
updatedAt: new Date('2025-06-01T06:48:53.055Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
value: 12000,
valueInBaseCurrency: 12000
},
{
activitiesCount: 12,
allocationInPercentage: null,
balance: 150.2,
balanceInBaseCurrency: 150.2,
@ -75,7 +76,6 @@ const accounts = [
url: 'https://interactivebrokers.com'
},
platformId: '9da3a8a7-4795-43e3-a6db-ccb914189737',
transactionCount: 12,
valueInBaseCurrency: 95693.70321466809,
updatedAt: new Date('2025-06-01T06:53:10.569Z'),
userId: '081aa387-487d-4438-83a4-3060eb2a016e',
@ -115,10 +115,10 @@ export const Loading: Story = {
hasPermissionToOpenDetails: false,
locale: 'en-US',
showActions: false,
showActivitiesCount: true,
showAllocationInPercentage: false,
showBalance: true,
showFooter: true,
showTransactions: true,
showValue: true,
showValueInBaseCurrency: true
}
@ -127,39 +127,39 @@ export const Loading: Story = {
export const Default: Story = {
args: {
accounts,
activitiesCount: 12,
baseCurrency: 'USD',
deviceType: 'desktop',
hasPermissionToOpenDetails: false,
locale: 'en-US',
showActions: false,
showActivitiesCount: true,
showAllocationInPercentage: false,
showBalance: true,
showFooter: true,
showTransactions: true,
showValue: true,
showValueInBaseCurrency: true,
totalBalanceInBaseCurrency: 12428.2,
totalValueInBaseCurrency: 107971.70321466809,
transactionCount: 12
totalValueInBaseCurrency: 107971.70321466809
}
};
export const WithoutFooter: Story = {
args: {
accounts,
activitiesCount: 12,
baseCurrency: 'USD',
deviceType: 'desktop',
hasPermissionToOpenDetails: false,
locale: 'en-US',
showActions: false,
showActivitiesCount: true,
showAllocationInPercentage: false,
showBalance: true,
showFooter: false,
showTransactions: true,
showValue: true,
showValueInBaseCurrency: true,
totalBalanceInBaseCurrency: 12428.2,
totalValueInBaseCurrency: 107971.70321466809,
transactionCount: 12
totalValueInBaseCurrency: 107971.70321466809
}
};

8
libs/ui/src/lib/accounts-table/accounts-table.component.ts

@ -55,20 +55,20 @@ import { Subject, Subscription } from 'rxjs';
})
export class GfAccountsTableComponent implements OnChanges, OnDestroy {
@Input() accounts: Account[];
@Input() activitiesCount: number;
@Input() baseCurrency: string;
@Input() deviceType: string;
@Input() hasPermissionToOpenDetails = true;
@Input() locale = getLocale();
@Input() showActions: boolean;
@Input() showActivitiesCount = true;
@Input() showAllocationInPercentage: boolean;
@Input() showBalance = true;
@Input() showFooter = true;
@Input() showTransactions = true;
@Input() showValue = true;
@Input() showValueInBaseCurrency = true;
@Input() totalBalanceInBaseCurrency: number;
@Input() totalValueInBaseCurrency: number;
@Input() transactionCount: number;
@Output() accountDeleted = new EventEmitter<string>();
@Output() accountToUpdate = new EventEmitter<Account>();
@ -101,8 +101,8 @@ export class GfAccountsTableComponent implements OnChanges, OnDestroy {
public ngOnChanges() {
this.displayedColumns = ['status', 'account', 'platform'];
if (this.showTransactions) {
this.displayedColumns.push('transactions');
if (this.showActivitiesCount) {
this.displayedColumns.push('activitiesCount');
}
if (this.showBalance) {

29
libs/ui/src/lib/chart/chart.registry.ts

@ -0,0 +1,29 @@
import { getTooltipPositionerMapTop } from '@ghostfolio/common/chart-helper';
import { Tooltip, TooltipPositionerFunction, ChartType } from 'chart.js';
interface VerticalHoverLinePluginOptions {
color?: string;
width?: number;
}
declare module 'chart.js' {
interface PluginOptionsByType<TType extends ChartType> {
verticalHoverLine: TType extends 'line' | 'bar'
? VerticalHoverLinePluginOptions
: never;
}
interface TooltipPositionerMap {
top: TooltipPositionerFunction<ChartType>;
}
}
export function registerChartConfiguration() {
if (Tooltip.positioners['top']) {
return;
}
Tooltip.positioners.top = function (_elements, eventPosition) {
return getTooltipPositionerMapTop(this.chart, eventPosition);
};
}

1
libs/ui/src/lib/chart/index.ts

@ -0,0 +1 @@
export * from './chart.registry';

18
libs/ui/src/lib/fire-calculator/fire-calculator.component.ts

@ -38,6 +38,8 @@ import {
BarElement,
CategoryScale,
Chart,
type ChartData,
type ChartDataset,
LinearScale,
Tooltip
} from 'chart.js';
@ -270,7 +272,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.chart.update();
} else {
this.chart = new Chart(this.chartCanvas.nativeElement, {
this.chart = new Chart<'bar'>(this.chartCanvas.nativeElement, {
data: chartData,
options: {
plugins: {
@ -280,7 +282,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
callbacks: {
footer: (items) => {
const totalAmount = items.reduce(
(a, b) => a + b.parsed.y,
(a, b) => a + (b.parsed.y ?? 0),
0
);
@ -302,8 +304,6 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
if (context.parsed.y !== null) {
label += new Intl.NumberFormat(this.locale, {
currency: this.currency,
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore: Only supported from ES2020 or later
currencyDisplay: 'code',
style: 'currency'
}).format(context.parsed.y);
@ -345,9 +345,9 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
this.isLoading = false;
}
private getChartData() {
private getChartData(): ChartData<'bar'> {
const currentYear = new Date().getFullYear();
const labels = [];
const labels: number[] = [];
// Principal investment amount
const P: number = this.getP();
@ -371,13 +371,13 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
labels.push(year);
}
const datasetDeposit = {
const datasetDeposit: ChartDataset<'bar'> = {
backgroundColor: `rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`,
data: [],
label: $localize`Deposit`
};
const datasetInterest = {
const datasetInterest: ChartDataset<'bar'> = {
backgroundColor: Color(
`rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`
)
@ -387,7 +387,7 @@ export class GfFireCalculatorComponent implements OnChanges, OnDestroy {
label: $localize`Interest`
};
const datasetSavings = {
const datasetSavings: ChartDataset<'bar'> = {
backgroundColor: Color(
`rgb(${primaryColorRgb.r}, ${primaryColorRgb.g}, ${primaryColorRgb.b})`
)

58
libs/ui/src/lib/line-chart/line-chart.component.ts

@ -1,6 +1,5 @@
import {
getTooltipOptions,
getTooltipPositionerMapTop,
getVerticalHoverLinePlugin
} from '@ghostfolio/common/chart-helper';
import { primaryColorRgb, secondaryColorRgb } from '@ghostfolio/common/config';
@ -19,12 +18,14 @@ import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
type ElementRef,
Input,
OnChanges,
OnDestroy,
ViewChild
} from '@angular/core';
import {
type AnimationsSpec,
Chart,
Filler,
LinearScale,
@ -33,11 +34,13 @@ import {
PointElement,
TimeScale,
Tooltip,
TooltipPosition
type TooltipOptions
} from 'chart.js';
import 'chartjs-adapter-date-fns';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { registerChartConfiguration } from '../chart';
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [CommonModule, NgxSkeletonLoaderModule],
@ -67,7 +70,7 @@ export class GfLineChartComponent
@Input() yMin: number;
@Input() yMinLabel: string;
@ViewChild('chartCanvas') chartCanvas;
@ViewChild('chartCanvas') chartCanvas: ElementRef<HTMLCanvasElement>;
public chart: Chart<'line'>;
public isLoading = true;
@ -85,8 +88,7 @@ export class GfLineChartComponent
Tooltip
);
Tooltip.positioners['top'] = (_elements, position: TooltipPosition) =>
getTooltipPositionerMapTop(this.chart, position);
registerChartConfiguration();
}
public ngAfterViewInit() {
@ -117,9 +119,9 @@ export class GfLineChartComponent
private initialize() {
this.isLoading = true;
const benchmarkPrices = [];
const benchmarkPrices: number[] = [];
const labels: string[] = [];
const marketPrices = [];
const marketPrices: number[] = [];
this.historicalDataItems?.forEach((historicalDataItem, index) => {
benchmarkPrices.push(this.benchmarkDataItems?.[index]?.value);
@ -129,11 +131,14 @@ export class GfLineChartComponent
const gradient = this.chartCanvas?.nativeElement
?.getContext('2d')
.createLinearGradient(
?.createLinearGradient(
0,
0,
0,
(this.chartCanvas.nativeElement.parentNode.offsetHeight * 4) / 5
((this.chartCanvas.nativeElement.parentNode as HTMLElement)
.offsetHeight *
4) /
5
);
if (gradient && this.showGradient) {
@ -169,27 +174,26 @@ export class GfLineChartComponent
};
if (this.chartCanvas) {
const animations = {
x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }),
y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' })
};
if (this.chart) {
this.chart.data = data;
this.chart.options.plugins ??= {};
this.chart.options.plugins.tooltip =
this.getTooltipPluginConfiguration() as unknown;
this.chart.options.animation =
this.isAnimated &&
({
x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }),
y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' })
} as unknown);
this.getTooltipPluginConfiguration();
this.chart.options.animations = this.isAnimated
? animations
: undefined;
this.chart.update();
} else {
this.chart = new Chart(this.chartCanvas.nativeElement, {
data,
options: {
animation:
this.isAnimated &&
({
x: this.getAnimationConfigurationForAxis({ labels, axis: 'x' }),
y: this.getAnimationConfigurationForAxis({ labels, axis: 'y' })
} as unknown),
animations: this.isAnimated ? animations : undefined,
aspectRatio: 16 / 9,
elements: {
point: {
@ -208,7 +212,7 @@ export class GfLineChartComponent
verticalHoverLine: {
color: `rgba(${getTextColor(this.colorScheme)}, 0.1)`
}
} as unknown,
},
scales: {
x: {
border: {
@ -298,7 +302,7 @@ export class GfLineChartComponent
}: {
axis: 'x' | 'y';
labels: string[];
}) {
}): Partial<AnimationsSpec<'line'>[string]> {
const delayBetweenPoints = this.ANIMATION_DURATION / labels.length;
return {
@ -308,7 +312,7 @@ export class GfLineChartComponent
}
context[`${axis}Started`] = true;
return context.index * delayBetweenPoints;
return context.dataIndex * delayBetweenPoints;
},
duration: delayBetweenPoints,
easing: 'linear',
@ -317,7 +321,7 @@ export class GfLineChartComponent
};
}
private getTooltipPluginConfiguration() {
private getTooltipPluginConfiguration(): Partial<TooltipOptions<'line'>> {
return {
...getTooltipOptions({
colorScheme: this.colorScheme,
@ -326,7 +330,7 @@ export class GfLineChartComponent
unit: this.unit
}),
mode: 'index',
position: 'top' as unknown,
position: 'top',
xAlign: 'center',
yAlign: 'bottom'
};

7
libs/ui/src/lib/mocks/holdings.ts

@ -41,7 +41,6 @@ export const holdings: PortfolioPosition[] = [
],
symbol: 'AAPL',
tags: [],
transactionCount: 1,
url: 'https://www.apple.com',
valueInBaseCurrency: 12230
},
@ -85,7 +84,6 @@ export const holdings: PortfolioPosition[] = [
],
symbol: 'ALV.DE',
tags: [],
transactionCount: 2,
url: 'https://www.allianz.com',
valueInBaseCurrency: 6763.224181360202
},
@ -129,7 +127,6 @@ export const holdings: PortfolioPosition[] = [
],
symbol: 'AMZN',
tags: [],
transactionCount: 1,
url: 'https://www.aboutamazon.com',
valueInBaseCurrency: 22868
},
@ -161,7 +158,6 @@ export const holdings: PortfolioPosition[] = [
sectors: [],
symbol: 'bitcoin',
tags: [],
transactionCount: 1,
url: null,
valueInBaseCurrency: 54666.7898248
},
@ -205,7 +201,6 @@ export const holdings: PortfolioPosition[] = [
],
symbol: 'MSFT',
tags: [],
transactionCount: 1,
url: 'https://www.microsoft.com',
valueInBaseCurrency: 12252.9
},
@ -249,7 +244,6 @@ export const holdings: PortfolioPosition[] = [
],
symbol: 'TSLA',
tags: [],
transactionCount: 1,
url: 'https://www.tesla.com',
valueInBaseCurrency: 53376
},
@ -293,7 +287,6 @@ export const holdings: PortfolioPosition[] = [
],
symbol: 'VTI',
tags: [],
transactionCount: 5,
url: 'https://www.vanguard.com',
valueInBaseCurrency: 15092
}

56
libs/ui/src/lib/portfolio-proportion-chart/portfolio-proportion-chart.component.ts

@ -22,11 +22,16 @@ import {
} from '@angular/core';
import { DataSource } from '@prisma/client';
import { Big } from 'big.js';
import { ChartConfiguration, Tooltip } from 'chart.js';
import { LinearScale } from 'chart.js';
import { ArcElement } from 'chart.js';
import { DoughnutController } from 'chart.js';
import { Chart } from 'chart.js';
import {
ArcElement,
Chart,
type ChartData,
type ChartDataset,
DoughnutController,
LinearScale,
Tooltip,
type TooltipOptions
} from 'chart.js';
import ChartDataLabels from 'chartjs-plugin-datalabels';
import { isUUID } from 'class-validator';
import Color from 'color';
@ -286,7 +291,7 @@ export class GfPortfolioProportionChartComponent
});
});
const datasets: ChartConfiguration<'doughnut'>['data']['datasets'] = [
const datasets: ChartDataset<'doughnut'>[] = [
{
backgroundColor: chartDataSorted.map(([, item]) => {
return item.color;
@ -324,7 +329,7 @@ export class GfPortfolioProportionChartComponent
datasets[1].data[1] = Number.MAX_SAFE_INTEGER;
}
const data: ChartConfiguration<'doughnut'>['data'] = {
const data: ChartData<'doughnut'> = {
datasets,
labels
};
@ -332,9 +337,10 @@ export class GfPortfolioProportionChartComponent
if (this.chartCanvas) {
if (this.chart) {
this.chart.data = data;
this.chart.options.plugins.tooltip = this.getTooltipPluginConfiguration(
data
) as unknown;
this.chart.options.plugins ??= {};
this.chart.options.plugins.tooltip =
this.getTooltipPluginConfiguration(data);
this.chart.update();
} else {
this.chart = new Chart<'doughnut'>(this.chartCanvas.nativeElement, {
@ -345,21 +351,22 @@ export class GfPortfolioProportionChartComponent
layout: {
padding: this.showLabels === true ? 100 : 0
},
onClick: (event, activeElements) => {
onClick: (_, activeElements, chart) => {
try {
const dataIndex = activeElements[0].index;
const symbol: string = event.chart.data.labels[dataIndex];
const symbol = chart.data.labels?.[dataIndex] as string;
const dataSource = this.data[symbol]?.dataSource;
const dataSource = this.data[symbol].dataSource;
this.proportionChartClicked.emit({ dataSource, symbol });
if (dataSource) {
this.proportionChartClicked.emit({ dataSource, symbol });
}
} catch {}
},
onHover: (event, chartElement) => {
if (this.cursor) {
event.native.target.style.cursor = chartElement[0]
? this.cursor
: 'default';
(event.native?.target as HTMLElement).style.cursor =
chartElement[0] ? this.cursor : 'default';
}
},
plugins: {
@ -392,7 +399,7 @@ export class GfPortfolioProportionChartComponent
legend: { display: false },
tooltip: this.getTooltipPluginConfiguration(data)
}
} as unknown,
},
plugins: [ChartDataLabels],
type: 'doughnut'
});
@ -419,19 +426,24 @@ export class GfPortfolioProportionChartComponent
];
}
private getTooltipPluginConfiguration(data: ChartConfiguration['data']) {
private getTooltipPluginConfiguration(
data: ChartData<'doughnut'>
): Partial<TooltipOptions<'doughnut'>> {
return {
...getTooltipOptions({
colorScheme: this.colorScheme,
currency: this.baseCurrency,
locale: this.locale
}),
// @ts-expect-error: no need to set all attributes in callbacks
callbacks: {
label: (context) => {
const labelIndex =
(data.datasets[context.datasetIndex - 1]?.data?.length ?? 0) +
context.dataIndex;
let symbol = context.chart.data.labels?.[labelIndex] ?? '';
let symbol =
(context.chart.data.labels?.[labelIndex] as string) ?? '';
if (symbol === this.OTHER_KEY) {
symbol = $localize`Other`;
@ -439,9 +451,10 @@ export class GfPortfolioProportionChartComponent
symbol = $localize`No data available`;
}
const name = translate(this.data[symbol as string]?.name);
const name = translate(this.data[symbol]?.name);
let sum = 0;
for (const item of context.dataset.data) {
sum += item;
}
@ -454,6 +467,7 @@ export class GfPortfolioProportionChartComponent
return [`${name ?? symbol}`, `${percentage.toFixed(2)}%`];
} else {
const value = context.raw as number;
return [
`${name ?? symbol}`,
`${value.toLocaleString(this.locale, {

2
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts

@ -121,7 +121,7 @@ export class GfSymbolAutocompleteComponent
this.control.valueChanges
.pipe(
filter((query) => {
if (query.length === 0) {
if (query?.length === 0) {
this.showDefaultOptions();
return false;

16
libs/ui/src/lib/treemap-chart/interfaces/interfaces.ts

@ -1,5 +1,21 @@
import { PortfolioPosition } from '@ghostfolio/common/interfaces';
import { ScriptableContext, TooltipItem } from 'chart.js';
import { TreemapDataPoint } from 'chartjs-chart-treemap';
export interface GetColorParams {
annualizedNetPerformancePercent: number;
negativeNetPerformancePercentsRange: { max: number; min: number };
positiveNetPerformancePercentsRange: { max: number; min: number };
}
interface GfTreemapDataPoint extends TreemapDataPoint {
_data: PortfolioPosition;
}
export interface GfTreemapScriptableContext extends ScriptableContext<'treemap'> {
raw: GfTreemapDataPoint;
}
export interface GfTreemapTooltipItem extends TooltipItem<'treemap'> {
raw: GfTreemapDataPoint;
}

49
libs/ui/src/lib/treemap-chart/treemap-chart.component.ts

@ -25,7 +25,7 @@ import {
} from '@angular/core';
import { DataSource } from '@prisma/client';
import { Big } from 'big.js';
import { ChartConfiguration } from 'chart.js';
import type { TooltipOptions, ChartData } from 'chart.js';
import { LinearScale } from 'chart.js';
import { Chart, Tooltip } from 'chart.js';
import { TreemapController, TreemapElement } from 'chartjs-chart-treemap';
@ -35,7 +35,11 @@ import { orderBy } from 'lodash';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import OpenColor from 'open-color';
import { GetColorParams } from './interfaces/interfaces';
import type {
GetColorParams,
GfTreemapScriptableContext,
GfTreemapTooltipItem
} from './interfaces/interfaces';
const { gray, green, red } = OpenColor;
@ -198,10 +202,10 @@ export class GfTreemapChartComponent
min: Math.min(...negativeNetPerformancePercents)
};
const data: ChartConfiguration<'treemap'>['data'] = {
const data: ChartData<'treemap'> = {
datasets: [
{
backgroundColor: (context) => {
backgroundColor: (context: GfTreemapScriptableContext) => {
let annualizedNetPerformancePercent =
getAnnualizedPerformancePercent({
daysInMarket: differenceInDays(
@ -232,7 +236,7 @@ export class GfTreemapChartComponent
key: 'allocationInPercentage',
labels: {
align: 'left',
color: (context) => {
color: (context: GfTreemapScriptableContext) => {
let annualizedNetPerformancePercent =
getAnnualizedPerformancePercent({
daysInMarket: differenceInDays(
@ -261,7 +265,7 @@ export class GfTreemapChartComponent
},
display: true,
font: [{ size: 16 }, { lineHeight: 1.5, size: 14 }],
formatter: ({ raw }) => {
formatter: ({ raw }: GfTreemapScriptableContext) => {
// Round to 4 decimal places
let netPerformancePercentWithCurrencyEffect =
Math.round(
@ -286,32 +290,35 @@ export class GfTreemapChartComponent
position: 'top'
},
spacing: 1,
// @ts-expect-error: should be PortfolioPosition[]
tree: this.holdings
}
]
} as any;
};
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, {
this.chart = new Chart<'treemap'>(this.chartCanvas.nativeElement, {
data,
options: {
animation: false,
onClick: (event, activeElements) => {
onClick: (_, activeElements, chart: Chart<'treemap'>) => {
try {
const dataIndex = activeElements[0].index;
const datasetIndex = activeElements[0].datasetIndex;
const dataset = orderBy(
event.chart.data.datasets[datasetIndex].tree,
chart.data.datasets[datasetIndex].tree,
['allocationInPercentage'],
['desc']
);
) as PortfolioPosition[];
const dataSource: DataSource = dataset[dataIndex].dataSource;
const symbol: string = dataset[dataIndex].symbol;
@ -321,15 +328,14 @@ export class GfTreemapChartComponent
},
onHover: (event, chartElement) => {
if (this.cursor) {
event.native.target.style.cursor = chartElement[0]
? this.cursor
: 'default';
(event.native?.target as HTMLElement).style.cursor =
chartElement[0] ? this.cursor : 'default';
}
},
plugins: {
tooltip: this.getTooltipPluginConfiguration()
}
} as unknown,
},
type: 'treemap'
});
}
@ -338,16 +344,17 @@ export class GfTreemapChartComponent
this.isLoading = false;
}
private getTooltipPluginConfiguration() {
private getTooltipPluginConfiguration(): Partial<TooltipOptions<'treemap'>> {
return {
...getTooltipOptions({
colorScheme: this.colorScheme,
currency: this.baseCurrency,
locale: this.locale
}),
// @ts-expect-error: no need to set all attributes in callbacks
callbacks: {
label: ({ raw }) => {
const allocationInPercentage = `${((raw._data.allocationInPercentage as number) * 100).toFixed(2)}%`;
label: ({ raw }: GfTreemapTooltipItem) => {
const allocationInPercentage = `${(raw._data.allocationInPercentage * 100).toFixed(2)}%`;
const name = raw._data.name;
const sign =
raw._data.netPerformancePercentWithCurrencyEffect > 0 ? '+' : '';
@ -356,11 +363,11 @@ export class GfTreemapChartComponent
const netPerformanceInPercentageWithSign = `${sign}${(raw._data.netPerformancePercentWithCurrencyEffect * 100).toFixed(2)}%`;
if (raw._data.valueInBaseCurrency !== null) {
const value = raw._data.valueInBaseCurrency as number;
const value = raw._data.valueInBaseCurrency;
return [
`${name ?? symbol} (${allocationInPercentage})`,
`${value.toLocaleString(this.locale, {
`${value?.toLocaleString(this.locale, {
maximumFractionDigits: 2,
minimumFractionDigits: 2
})} ${this.baseCurrency}`,

4077
package-lock.json

File diff suppressed because it is too large

76
package.json

@ -1,6 +1,6 @@
{
"name": "ghostfolio",
"version": "2.233.0",
"version": "2.236.0",
"homepage": "https://ghostfol.io",
"license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio",
@ -54,17 +54,17 @@
"workspace-generator": "nx workspace-generator"
},
"dependencies": {
"@angular/animations": "21.0.6",
"@angular/cdk": "21.0.5",
"@angular/common": "21.0.6",
"@angular/compiler": "21.0.6",
"@angular/core": "21.0.6",
"@angular/forms": "21.0.6",
"@angular/material": "21.0.5",
"@angular/platform-browser": "21.0.6",
"@angular/platform-browser-dynamic": "21.0.6",
"@angular/router": "21.0.6",
"@angular/service-worker": "21.0.6",
"@angular/animations": "21.1.1",
"@angular/cdk": "21.1.1",
"@angular/common": "21.1.1",
"@angular/compiler": "21.1.1",
"@angular/core": "21.1.1",
"@angular/forms": "21.1.1",
"@angular/material": "21.1.1",
"@angular/platform-browser": "21.1.1",
"@angular/platform-browser-dynamic": "21.1.1",
"@angular/router": "21.1.1",
"@angular/service-worker": "21.1.1",
"@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.5",
@ -106,13 +106,14 @@
"dotenv": "17.2.3",
"dotenv-expand": "12.0.3",
"envalid": "8.1.1",
"fast-redact": "3.5.0",
"fuse.js": "7.1.0",
"google-spreadsheet": "3.2.0",
"helmet": "7.0.0",
"http-status-codes": "2.3.0",
"ionicons": "8.0.13",
"jsonpath": "1.1.1",
"lodash": "4.17.21",
"lodash": "4.17.23",
"marked": "17.0.1",
"ms": "3.0.0-canary.1",
"ng-extract-i18n-merge": "3.2.1",
@ -128,48 +129,49 @@
"passport-openidconnect": "0.1.2",
"reflect-metadata": "0.2.2",
"rxjs": "7.8.1",
"stripe": "20.1.0",
"stripe": "20.3.0",
"svgmap": "2.14.0",
"tablemark": "4.1.0",
"twitter-api-v2": "1.27.0",
"yahoo-finance2": "3.11.2",
"yahoo-finance2": "3.13.0",
"zone.js": "0.16.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "21.0.4",
"@angular-devkit/core": "21.0.4",
"@angular-devkit/schematics": "21.0.4",
"@angular-devkit/build-angular": "21.1.1",
"@angular-devkit/core": "21.1.1",
"@angular-devkit/schematics": "21.1.1",
"@angular-eslint/eslint-plugin": "21.1.0",
"@angular-eslint/eslint-plugin-template": "21.1.0",
"@angular-eslint/template-parser": "21.1.0",
"@angular/cli": "21.0.4",
"@angular/compiler-cli": "21.0.6",
"@angular/language-service": "21.0.6",
"@angular/localize": "21.0.6",
"@angular/pwa": "21.0.4",
"@angular/cli": "21.1.1",
"@angular/compiler-cli": "21.1.1",
"@angular/language-service": "21.1.1",
"@angular/localize": "21.1.1",
"@angular/pwa": "21.1.1",
"@eslint/eslintrc": "3.3.1",
"@eslint/js": "9.35.0",
"@nestjs/schematics": "11.0.9",
"@nestjs/testing": "11.1.8",
"@nx/angular": "22.3.3",
"@nx/eslint-plugin": "22.3.3",
"@nx/jest": "22.3.3",
"@nx/js": "22.3.3",
"@nx/module-federation": "22.3.3",
"@nx/nest": "22.3.3",
"@nx/node": "22.3.3",
"@nx/storybook": "22.3.3",
"@nx/web": "22.3.3",
"@nx/workspace": "22.3.3",
"@schematics/angular": "21.0.4",
"@nx/angular": "22.4.1",
"@nx/eslint-plugin": "22.4.1",
"@nx/jest": "22.4.1",
"@nx/js": "22.4.1",
"@nx/module-federation": "22.4.1",
"@nx/nest": "22.4.1",
"@nx/node": "22.4.1",
"@nx/storybook": "22.4.1",
"@nx/web": "22.4.1",
"@nx/workspace": "22.4.1",
"@schematics/angular": "21.1.1",
"@storybook/addon-docs": "10.1.10",
"@storybook/angular": "10.1.10",
"@trivago/prettier-plugin-sort-imports": "5.2.2",
"@types/big.js": "6.2.2",
"@types/fast-redact": "3.0.4",
"@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0",
"@types/jsonpath": "0.2.4",
"@types/lodash": "4.17.21",
"@types/lodash": "4.17.23",
"@types/node": "22.15.17",
"@types/papaparse": "5.3.7",
"@types/passport-google-oauth20": "2.0.16",
@ -184,8 +186,8 @@
"jest": "30.2.0",
"jest-environment-jsdom": "30.2.0",
"jest-preset-angular": "16.0.0",
"nx": "22.3.3",
"prettier": "3.8.0",
"nx": "22.4.1",
"prettier": "3.8.1",
"prettier-plugin-organize-attributes": "1.0.0",
"prisma": "6.19.0",
"react": "18.2.0",

Loading…
Cancel
Save