Browse Source

Merge remote-tracking branch 'origin/main' into feature/extend-holdings-endpoint-for-cash

pull/5650/head
KenTandrian 1 month ago
parent
commit
7559ae611a
  1. 16
      CHANGELOG.md
  2. 8
      apps/api/src/app/account/account.controller.ts
  3. 2
      apps/api/src/app/endpoints/data-providers/ghostfolio/ghostfolio.service.ts
  4. 2
      apps/api/src/app/exchange-rate/exchange-rate.controller.ts
  5. 19
      apps/api/src/app/import/import.service.ts
  6. 12
      apps/api/src/app/info/info.service.ts
  7. 7
      apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts
  8. 2
      apps/api/src/app/portfolio/calculator/portfolio-calculator.ts
  9. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts
  10. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts
  11. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts
  12. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts
  13. 3
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts
  14. 3
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts
  15. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts
  16. 3
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-short.spec.ts
  17. 3
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts
  18. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-fee.spec.ts
  19. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts
  20. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-liability.spec.ts
  21. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-and-sell.spec.ts
  22. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts
  23. 3
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts
  24. 3
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts
  25. 2
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts
  26. 2
      apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts
  27. 143
      apps/api/src/app/portfolio/portfolio.service.ts
  28. 8
      apps/api/src/app/symbol/symbol.controller.ts
  29. 11
      apps/api/src/app/symbol/symbol.service.ts
  30. 3
      apps/api/src/services/configuration/configuration.service.ts
  31. 6
      apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts
  32. 6
      apps/api/src/services/data-provider/coingecko/coingecko.service.ts
  33. 6
      apps/api/src/services/data-provider/data-provider.service.ts
  34. 6
      apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts
  35. 6
      apps/api/src/services/data-provider/financial-modeling-prep/financial-modeling-prep.service.ts
  36. 6
      apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts
  37. 6
      apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts
  38. 4
      apps/api/src/services/data-provider/interfaces/data-provider.interface.ts
  39. 6
      apps/api/src/services/data-provider/manual/manual.service.ts
  40. 6
      apps/api/src/services/data-provider/rapid-api/rapid-api.service.ts
  41. 6
      apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts
  42. 3
      apps/api/src/services/interfaces/environment.interface.ts
  43. 20
      apps/api/src/services/interfaces/interfaces.ts
  44. 12
      apps/client/src/app/app.component.ts
  45. 3
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  46. 1
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  47. 1
      apps/client/src/app/components/admin-platform/admin-platform.component.ts
  48. 1
      apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts
  49. 1
      apps/client/src/app/components/admin-tag/admin-tag.component.ts
  50. 1
      apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts
  51. 30
      apps/client/src/app/components/admin-users/admin-users.component.ts
  52. 16
      apps/client/src/app/components/header/header.component.ts
  53. 3
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  54. 3
      apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts
  55. 11
      apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
  56. 1
      apps/client/src/app/components/rule/rule.component.ts
  57. 1
      apps/client/src/app/components/rules/rules.component.ts
  58. 1
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
  59. 1
      apps/client/src/app/components/user-account-access/user-account-access.component.ts
  60. 9
      apps/client/src/app/components/user-account-membership/user-account-membership.html
  61. 4
      apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts
  62. 33
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
  63. 39
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html
  64. 1
      apps/client/src/app/pages/accounts/accounts-page.component.ts
  65. 1
      apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
  66. 1
      apps/client/src/app/pages/accounts/transfer-balance/transfer-balance-dialog.component.ts
  67. 6
      apps/client/src/app/pages/features/features-page.component.ts
  68. 2
      apps/client/src/app/pages/features/features-page.html
  69. 1
      apps/client/src/app/pages/landing/landing-page.component.ts
  70. 8
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  71. 1
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  72. 3
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts
  73. 4
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  74. 1
      apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts
  75. 12
      apps/client/src/app/pages/pricing/pricing-page.component.ts
  76. 3
      apps/client/src/app/pages/pricing/pricing-page.html
  77. 12
      apps/client/src/app/pages/register/register-page.component.ts
  78. 6
      apps/client/src/app/pages/register/register-page.html
  79. 10
      apps/client/src/app/services/admin.service.ts
  80. 9
      apps/client/src/app/services/data.service.ts
  81. 3
      apps/client/src/app/services/import-activities.service.ts
  82. 1
      apps/client/src/app/services/web-authn.service.ts
  83. 52
      apps/client/src/locales/messages.ca.xlf
  84. 52
      apps/client/src/locales/messages.de.xlf
  85. 52
      apps/client/src/locales/messages.es.xlf
  86. 52
      apps/client/src/locales/messages.fr.xlf
  87. 52
      apps/client/src/locales/messages.it.xlf
  88. 52
      apps/client/src/locales/messages.nl.xlf
  89. 52
      apps/client/src/locales/messages.pl.xlf
  90. 52
      apps/client/src/locales/messages.pt.xlf
  91. 52
      apps/client/src/locales/messages.tr.xlf
  92. 52
      apps/client/src/locales/messages.uk.xlf
  93. 50
      apps/client/src/locales/messages.xlf
  94. 170
      apps/client/src/locales/messages.zh.xlf
  95. 9
      apps/client/src/styles.scss
  96. 2
      apps/client/src/styles/variables.scss
  97. 9
      eslint.config.cjs
  98. 0
      libs/common/src/lib/interfaces/activities.interface.ts
  99. 15
      libs/common/src/lib/interfaces/index.ts
  100. 3
      libs/common/src/lib/interfaces/responses/account-response.interface.ts

16
CHANGELOG.md

@ -13,7 +13,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Refactored the get holding functionality in the portfolio service
- Changed the user data loading in the user detail dialog of the admin control panel’s users section to fetch data on demand
- Exposed the authentication with access token as an environment variable (`ENABLE_FEATURE_AUTH_TOKEN`)
- Improved the language localization for German (`de`)
- Upgraded `prisma` from version `6.18.0` to `6.19.0`
### Todo
- Rename the environment variable from `ENABLE_FEATURE_SOCIAL_LOGIN` to `ENABLE_FEATURE_AUTH_GOOGLE`
## 2.216.0 - 2025-11-10
### Changed
- Improved the language localization for Chinese (`zh`)
- Upgraded `chart.js` from version `4.5.0` to `4.5.1` - Upgraded `chart.js` from version `4.5.0` to `4.5.1`
- Upgraded `svgmap` from version `2.12.2` to `2.14.0`
## 2.215.0 - 2025-11-06 ## 2.215.0 - 2025-11-06

8
apps/api/src/app/account/account.controller.ts

@ -9,13 +9,11 @@ import { ImpersonationService } from '@ghostfolio/api/services/impersonation/imp
import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config'; import { HEADER_KEY_IMPERSONATION } from '@ghostfolio/common/config';
import { import {
AccountBalancesResponse, AccountBalancesResponse,
AccountResponse,
AccountsResponse AccountsResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { permissions } from '@ghostfolio/common/permissions'; import { permissions } from '@ghostfolio/common/permissions';
import type { import type { RequestWithUser } from '@ghostfolio/common/types';
AccountWithValue,
RequestWithUser
} from '@ghostfolio/common/types';
import { import {
Body, Body,
@ -114,7 +112,7 @@ export class AccountController {
public async getAccountById( public async getAccountById(
@Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string, @Headers(HEADER_KEY_IMPERSONATION.toLowerCase()) impersonationId: string,
@Param('id') id: string @Param('id') id: string
): Promise<AccountWithValue> { ): Promise<AccountResponse> {
const impersonationUserId = const impersonationUserId =
await this.impersonationService.validateImpersonationId(impersonationId); await this.impersonationService.validateImpersonationId(impersonationId);

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

@ -8,7 +8,6 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { import {
@ -18,6 +17,7 @@ import {
import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config'; import { PROPERTY_DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER_MAX_REQUESTS } from '@ghostfolio/common/config';
import { import {
DataProviderGhostfolioAssetProfileResponse, DataProviderGhostfolioAssetProfileResponse,
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DividendsResponse, DividendsResponse,
HistoricalResponse, HistoricalResponse,

2
apps/api/src/app/exchange-rate/exchange-rate.controller.ts

@ -1,5 +1,5 @@
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard';
import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import { DataProviderHistoricalResponse } from '@ghostfolio/common/interfaces';
import { import {
Controller, Controller,

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

@ -1,10 +1,6 @@
import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto';
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import {
Activity,
ActivityError
} from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service';
@ -19,7 +15,11 @@ import {
getAssetProfileIdentifier, getAssetProfileIdentifier,
parseDate parseDate
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces'; import {
Activity,
ActivityError,
AssetProfileIdentifier
} from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { import {
AccountWithPlatform, AccountWithPlatform,
@ -58,14 +58,19 @@ export class ImportService {
userId userId
}: AssetProfileIdentifier & { userId: string }): Promise<Activity[]> { }: AssetProfileIdentifier & { userId: string }): Promise<Activity[]> {
try { try {
const { activities, firstBuyDate, historicalData } = const holding = await this.portfolioService.getHolding({
await this.portfolioService.getHolding({
dataSource, dataSource,
symbol, symbol,
userId, userId,
impersonationId: undefined impersonationId: undefined
}); });
if (!holding) {
return [];
}
const { activities, firstBuyDate, historicalData } = holding;
const [[assetProfile], dividends] = await Promise.all([ const [[assetProfile], dividends] = await Promise.all([
this.symbolProfileService.getSymbolProfiles([ this.symbolProfileService.getSymbolProfiles([
{ {

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

@ -51,6 +51,14 @@ export class InfoService {
const globalPermissions: string[] = []; const globalPermissions: string[] = [];
if (this.configurationService.get('ENABLE_FEATURE_AUTH_GOOGLE')) {
globalPermissions.push(permissions.enableAuthGoogle);
}
if (this.configurationService.get('ENABLE_FEATURE_AUTH_TOKEN')) {
globalPermissions.push(permissions.enableAuthToken);
}
if (this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX')) { if (this.configurationService.get('ENABLE_FEATURE_FEAR_AND_GREED_INDEX')) {
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
info.fearAndGreedDataSource = encodeDataSource( info.fearAndGreedDataSource = encodeDataSource(
@ -70,10 +78,6 @@ export class InfoService {
); );
} }
if (this.configurationService.get('ENABLE_FEATURE_SOCIAL_LOGIN')) {
globalPermissions.push(permissions.enableSocialLogin);
}
if (this.configurationService.get('ENABLE_FEATURE_STATISTICS')) { if (this.configurationService.get('ENABLE_FEATURE_STATISTICS')) {
globalPermissions.push(permissions.enableStatistics); globalPermissions.push(permissions.enableStatistics);
} }

7
apps/api/src/app/portfolio/calculator/portfolio-calculator.factory.ts

@ -1,10 +1,13 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service'; import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.service';
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { Filter, HistoricalDataItem } from '@ghostfolio/common/interfaces'; import {
Activity,
Filter,
HistoricalDataItem
} from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service'; import { CurrentRateService } from '@ghostfolio/api/app/portfolio/current-rate.service';
import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface'; import { PortfolioOrder } from '@ghostfolio/api/app/portfolio/interfaces/portfolio-order.interface';
import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface'; import { PortfolioSnapshotValue } from '@ghostfolio/api/app/portfolio/interfaces/snapshot-value.interface';
@ -26,6 +25,7 @@ import {
resetHours resetHours
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { import {
Activity,
AssetProfileIdentifier, AssetProfileIdentifier,
DataProviderInfo, DataProviderInfo,
Filter, Filter,

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

3
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur-in-base-currency-eur.spec.ts

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
loadExportFile, loadExportFile,
@ -16,7 +15,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
loadExportFile, loadExportFile,
@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -15,6 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
loadExportFile, loadExportFile,
@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
loadExportFile, loadExportFile,
@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -15,6 +14,7 @@ import { ExchangeRateDataServiceMock } from '@ghostfolio/api/services/exchange-r
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
loadExportFile, loadExportFile,
@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
loadExportFile, loadExportFile,
@ -15,7 +14,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { ExportResponse } from '@ghostfolio/common/interfaces'; import { Activity, ExportResponse } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

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

@ -1,4 +1,3 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { import {
activityDummyData, activityDummyData,
symbolProfileDummyData, symbolProfileDummyData,
@ -14,6 +13,7 @@ import { ExchangeRateDataService } from '@ghostfolio/api/services/exchange-rate-
import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service'; import { PortfolioSnapshotService } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service';
import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock'; import { PortfolioSnapshotServiceMock } from '@ghostfolio/api/services/queues/portfolio-snapshot/portfolio-snapshot.service.mock';
import { parseDate } from '@ghostfolio/common/helper'; import { parseDate } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { Big } from 'big.js'; import { Big } from 'big.js';

2
apps/api/src/app/portfolio/interfaces/portfolio-order.interface.ts

@ -1,4 +1,4 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { Activity } from '@ghostfolio/common/interfaces';
export interface PortfolioOrder extends Pick<Activity, 'tags' | 'type'> { export interface PortfolioOrder extends Pick<Activity, 'tags' | 'type'> {
date: string; date: string;

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

@ -1,7 +1,6 @@
import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service'; import { AccountBalanceService } from '@ghostfolio/api/app/account-balance/account-balance.service';
import { AccountService } from '@ghostfolio/api/app/account/account.service'; import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface'; import { CashDetails } from '@ghostfolio/api/app/account/interfaces/cash-details.interface';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { UserService } from '@ghostfolio/api/app/user/user.service'; import { UserService } from '@ghostfolio/api/app/user/user.service';
import { getFactor } from '@ghostfolio/api/helper/portfolio.helper'; import { getFactor } from '@ghostfolio/api/helper/portfolio.helper';
@ -40,6 +39,7 @@ import {
import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper'; import { DATE_FORMAT, getSum, parseDate } from '@ghostfolio/common/helper';
import { import {
AccountsResponse, AccountsResponse,
Activity,
EnhancedSymbolProfile, EnhancedSymbolProfile,
Filter, Filter,
HistoricalDataItem, HistoricalDataItem,
@ -88,7 +88,6 @@ import {
parseISO, parseISO,
set set
} from 'date-fns'; } from 'date-fns';
import { isEmpty } from 'lodash';
import { PortfolioCalculator } from './calculator/portfolio-calculator'; import { PortfolioCalculator } from './calculator/portfolio-calculator';
import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory'; import { PortfolioCalculatorFactory } from './calculator/portfolio-calculator.factory';
@ -870,35 +869,7 @@ export class PortfolioService {
}); });
if (activities.length === 0) { if (activities.length === 0) {
return { return undefined;
activities: [],
activitiesCount: 0,
averagePrice: undefined,
dataProviderInfo: undefined,
dividendInBaseCurrency: undefined,
dividendYieldPercent: undefined,
dividendYieldPercentWithCurrencyEffect: undefined,
feeInBaseCurrency: undefined,
firstBuyDate: undefined,
grossPerformance: undefined,
grossPerformancePercent: undefined,
grossPerformancePercentWithCurrencyEffect: undefined,
grossPerformanceWithCurrencyEffect: undefined,
historicalData: [],
investmentInBaseCurrencyWithCurrencyEffect: undefined,
marketPrice: undefined,
marketPriceMax: undefined,
marketPriceMin: undefined,
netPerformance: undefined,
netPerformancePercent: undefined,
netPerformancePercentWithCurrencyEffect: undefined,
netPerformanceWithCurrencyEffect: undefined,
performances: undefined,
quantity: undefined,
SymbolProfile: undefined,
tags: [],
value: undefined
};
} }
const [SymbolProfile] = await this.symbolProfileService.getSymbolProfiles([ const [SymbolProfile] = await this.symbolProfileService.getSymbolProfiles([
@ -912,7 +883,6 @@ export class PortfolioService {
currency: userCurrency currency: userCurrency
}); });
const portfolioStart = portfolioCalculator.getStartDate();
const transactionPoints = portfolioCalculator.getTransactionPoints(); const transactionPoints = portfolioCalculator.getTransactionPoints();
const { positions } = await portfolioCalculator.getSnapshot(); const { positions } = await portfolioCalculator.getSnapshot();
@ -921,7 +891,10 @@ export class PortfolioService {
return position.dataSource === dataSource && position.symbol === symbol; return position.dataSource === dataSource && position.symbol === symbol;
}); });
if (holding) { if (!holding) {
return undefined;
}
const { const {
averagePrice, averagePrice,
currency, currency,
@ -962,13 +935,9 @@ export class PortfolioService {
const dividendYieldPercentWithCurrencyEffect = const dividendYieldPercentWithCurrencyEffect =
getAnnualizedPerformancePercent({ getAnnualizedPerformancePercent({
daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)), daysInMarket: differenceInDays(new Date(), parseDate(firstBuyDate)),
netPerformancePercentage: timeWeightedInvestmentWithCurrencyEffect.eq( netPerformancePercentage: timeWeightedInvestmentWithCurrencyEffect.eq(0)
0
)
? new Big(0) ? new Big(0)
: dividendInBaseCurrency.div( : dividendInBaseCurrency.div(timeWeightedInvestmentWithCurrencyEffect)
timeWeightedInvestmentWithCurrencyEffect
)
}); });
const historicalData = await this.dataProviderService.getHistorical( const historicalData = await this.dataProviderService.getHistorical(
@ -1022,9 +991,7 @@ export class PortfolioService {
date, date,
averagePrice: currentAveragePrice, averagePrice: currentAveragePrice,
marketPrice: marketPrice:
historicalDataArray.length > 0 historicalDataArray.length > 0 ? marketPrice : currentAveragePrice,
? marketPrice
: currentAveragePrice,
quantity: currentQuantity quantity: currentQuantity
}); });
@ -1101,98 +1068,6 @@ export class PortfolioService {
userCurrency userCurrency
) )
}; };
} else {
const currentData = await this.dataProviderService.getQuotes({
user,
items: [{ symbol, dataSource: DataSource.YAHOO }]
});
const marketPrice = currentData[symbol]?.marketPrice;
let historicalData = await this.dataProviderService.getHistorical(
[{ symbol, dataSource: DataSource.YAHOO }],
'day',
portfolioStart,
new Date()
);
if (isEmpty(historicalData)) {
try {
historicalData = await this.dataProviderService.getHistoricalRaw({
assetProfileIdentifiers: [{ symbol, dataSource: DataSource.YAHOO }],
from: portfolioStart,
to: new Date()
});
} catch {
historicalData = {
[symbol]: {}
};
}
}
const historicalDataArray: HistoricalDataItem[] = [];
let marketPriceMax = marketPrice;
let marketPriceMaxDate = new Date();
let marketPriceMin = marketPrice;
for (const [date, { marketPrice }] of Object.entries(
historicalData[symbol]
)) {
historicalDataArray.push({
date,
value: marketPrice
});
if (marketPrice > marketPriceMax) {
marketPriceMax = marketPrice;
marketPriceMaxDate = parseISO(date);
}
marketPriceMin = Math.min(
marketPrice ?? Number.MAX_SAFE_INTEGER,
marketPriceMin
);
}
const performancePercent =
this.benchmarkService.calculateChangeInPercentage(
marketPriceMax,
marketPrice
);
return {
marketPrice,
marketPriceMax,
marketPriceMin,
SymbolProfile,
activities: [],
activitiesCount: 0,
averagePrice: 0,
dataProviderInfo: undefined,
dividendInBaseCurrency: 0,
dividendYieldPercent: 0,
dividendYieldPercentWithCurrencyEffect: 0,
feeInBaseCurrency: 0,
firstBuyDate: undefined,
grossPerformance: undefined,
grossPerformancePercent: undefined,
grossPerformancePercentWithCurrencyEffect: undefined,
grossPerformanceWithCurrencyEffect: undefined,
historicalData: historicalDataArray,
investmentInBaseCurrencyWithCurrencyEffect: 0,
netPerformance: undefined,
netPerformancePercent: undefined,
netPerformancePercentWithCurrencyEffect: undefined,
netPerformanceWithCurrencyEffect: undefined,
performances: {
allTimeHigh: {
performancePercent,
date: marketPriceMaxDate
}
},
quantity: 0,
tags: [],
value: 0
};
}
} }
public async getPerformance({ public async getPerformance({

8
apps/api/src/app/symbol/symbol.controller.ts

@ -1,8 +1,11 @@
import { HasPermissionGuard } from '@ghostfolio/api/guards/has-permission.guard'; 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 { 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 { TransformDataSourceInResponseInterceptor } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.interceptor';
import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces'; import {
import { LookupResponse } from '@ghostfolio/common/interfaces'; DataProviderHistoricalResponse,
LookupResponse,
SymbolItem
} from '@ghostfolio/common/interfaces';
import type { RequestWithUser } from '@ghostfolio/common/types'; import type { RequestWithUser } from '@ghostfolio/common/types';
import { import {
@ -22,7 +25,6 @@ import { parseISO } from 'date-fns';
import { StatusCodes, getReasonPhrase } from 'http-status-codes'; import { StatusCodes, getReasonPhrase } from 'http-status-codes';
import { isDate, isEmpty } from 'lodash'; import { isDate, isEmpty } from 'lodash';
import { SymbolItem } from './interfaces/symbol-item.interface';
import { SymbolService } from './symbol.service'; import { SymbolService } from './symbol.service';
@Controller('symbol') @Controller('symbol')

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

@ -1,21 +1,18 @@
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { import { DataGatheringItem } from '@ghostfolio/api/services/interfaces/interfaces';
DataGatheringItem,
DataProviderHistoricalResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
HistoricalDataItem, HistoricalDataItem,
LookupResponse LookupResponse,
SymbolItem
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { UserWithSettings } from '@ghostfolio/common/types'; import { UserWithSettings } from '@ghostfolio/common/types';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { format, subDays } from 'date-fns'; import { format, subDays } from 'date-fns';
import { SymbolItem } from './interfaces/symbol-item.interface';
@Injectable() @Injectable()
export class SymbolService { export class SymbolService {
public constructor( public constructor(

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

@ -40,9 +40,10 @@ export class ConfigurationService {
DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: json({ DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: json({
default: [] default: []
}), }),
ENABLE_FEATURE_AUTH_GOOGLE: bool({ default: false }),
ENABLE_FEATURE_AUTH_TOKEN: bool({ default: true }),
ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }), ENABLE_FEATURE_FEAR_AND_GREED_INDEX: bool({ default: false }),
ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }), ENABLE_FEATURE_READ_ONLY_MODE: bool({ default: false }),
ENABLE_FEATURE_SOCIAL_LOGIN: bool({ default: false }),
ENABLE_FEATURE_STATISTICS: bool({ default: false }), ENABLE_FEATURE_STATISTICS: bool({ default: false }),
ENABLE_FEATURE_SUBSCRIPTION: bool({ default: false }), ENABLE_FEATURE_SUBSCRIPTION: bool({ default: false }),
ENABLE_FEATURE_SYSTEM_MESSAGE: bool({ default: false }), ENABLE_FEATURE_SYSTEM_MESSAGE: bool({ default: false }),

6
apps/api/src/services/data-provider/alpha-vantage/alpha-vantage.service.ts

@ -7,14 +7,12 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

6
apps/api/src/services/data-provider/coingecko/coingecko.service.ts

@ -7,14 +7,12 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupItem, LookupItem,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

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

@ -1,10 +1,6 @@
import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service'; import { RedisCacheService } from '@ghostfolio/api/app/redis-cache/redis-cache.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; import { DataProviderInterface } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
@ -23,6 +19,8 @@ import {
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { import {
AssetProfileIdentifier, AssetProfileIdentifier,
DataProviderHistoricalResponse,
DataProviderResponse,
LookupItem, LookupItem,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

6
apps/api/src/services/data-provider/eod-historical-data/eod-historical-data.service.ts

@ -7,10 +7,6 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,
@ -18,7 +14,9 @@ import {
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper'; import { DATE_FORMAT, isCurrency } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupItem, LookupItem,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

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

@ -8,10 +8,6 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,
@ -19,7 +15,9 @@ import {
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, isCurrency, parseDate } from '@ghostfolio/common/helper'; import { DATE_FORMAT, isCurrency, parseDate } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupItem, LookupItem,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

6
apps/api/src/services/data-provider/ghostfolio/ghostfolio.service.ts

@ -8,10 +8,6 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { import {
HEADER_KEY_TOKEN, HEADER_KEY_TOKEN,
@ -20,7 +16,9 @@ import {
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
DataProviderGhostfolioAssetProfileResponse, DataProviderGhostfolioAssetProfileResponse,
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
DividendsResponse, DividendsResponse,
HistoricalResponse, HistoricalResponse,
LookupResponse, LookupResponse,

6
apps/api/src/services/data-provider/google-sheets/google-sheets.service.ts

@ -7,15 +7,13 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper'; import { DATE_FORMAT, parseDate } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

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

@ -1,9 +1,7 @@
import { import {
DataProviderHistoricalResponse, DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import {
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { Granularity } from '@ghostfolio/common/types'; import { Granularity } from '@ghostfolio/common/types';

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

@ -7,10 +7,6 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service'; import { PrismaService } from '@ghostfolio/api/services/prisma/prisma.service';
import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service'; import { SymbolProfileService } from '@ghostfolio/api/services/symbol-profile/symbol-profile.service';
import { import {
@ -19,7 +15,9 @@ import {
getYesterday getYesterday
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupResponse, LookupResponse,
ScraperConfiguration ScraperConfiguration
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

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

@ -7,17 +7,15 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { import {
ghostfolioFearAndGreedIndexSymbol, ghostfolioFearAndGreedIndexSymbol,
ghostfolioFearAndGreedIndexSymbolStocks ghostfolioFearAndGreedIndexSymbolStocks
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper'; import { DATE_FORMAT, getYesterday } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

6
apps/api/src/services/data-provider/yahoo-finance/yahoo-finance.service.ts

@ -9,14 +9,12 @@ import {
GetQuotesParams, GetQuotesParams,
GetSearchParams GetSearchParams
} from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface'; } from '@ghostfolio/api/services/data-provider/interfaces/data-provider.interface';
import {
DataProviderHistoricalResponse,
DataProviderResponse
} from '@ghostfolio/api/services/interfaces/interfaces';
import { DEFAULT_CURRENCY } from '@ghostfolio/common/config'; import { DEFAULT_CURRENCY } from '@ghostfolio/common/config';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
LookupItem, LookupItem,
LookupResponse LookupResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';

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

@ -16,9 +16,10 @@ export interface Environment extends CleanedEnvAccessors {
DATA_SOURCE_IMPORT: string; DATA_SOURCE_IMPORT: string;
DATA_SOURCES: string[]; DATA_SOURCES: string[];
DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: string[]; DATA_SOURCES_GHOSTFOLIO_DATA_PROVIDER: string[];
ENABLE_FEATURE_AUTH_GOOGLE: boolean;
ENABLE_FEATURE_AUTH_TOKEN: boolean;
ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean; ENABLE_FEATURE_FEAR_AND_GREED_INDEX: boolean;
ENABLE_FEATURE_READ_ONLY_MODE: boolean; ENABLE_FEATURE_READ_ONLY_MODE: boolean;
ENABLE_FEATURE_SOCIAL_LOGIN: boolean;
ENABLE_FEATURE_STATISTICS: boolean; ENABLE_FEATURE_STATISTICS: boolean;
ENABLE_FEATURE_SUBSCRIPTION: boolean; ENABLE_FEATURE_SUBSCRIPTION: boolean;
ENABLE_FEATURE_SYSTEM_MESSAGE: boolean; ENABLE_FEATURE_SYSTEM_MESSAGE: boolean;

20
apps/api/src/services/interfaces/interfaces.ts

@ -1,22 +1,4 @@
import { import { AssetProfileIdentifier } from '@ghostfolio/common/interfaces';
AssetProfileIdentifier,
DataProviderInfo
} from '@ghostfolio/common/interfaces';
import { MarketState } from '@ghostfolio/common/types';
import { DataSource } from '@prisma/client';
export interface DataProviderHistoricalResponse {
marketPrice: number;
}
export interface DataProviderResponse {
currency: string;
dataProviderInfo?: DataProviderInfo;
dataSource: DataSource;
marketPrice: number;
marketState: MarketState;
}
export interface DataGatheringItem extends AssetProfileIdentifier { export interface DataGatheringItem extends AssetProfileIdentifier {
date?: Date; date?: Date;

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

@ -110,10 +110,6 @@ export class GfAppComponent implements OnDestroy, OnInit {
this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.deviceType = this.deviceService.getDeviceInfo().deviceType;
this.info = this.dataService.fetchInfo(); this.info = this.dataService.fetchInfo();
this.hasPromotion =
!!this.info?.subscriptionOffer?.coupon ||
!!this.info?.subscriptionOffer?.durationExtension;
this.impersonationStorageService this.impersonationStorageService
.onChangeHasImpersonation() .onChangeHasImpersonation()
.pipe(takeUntil(this.unsubscribeSubject)) .pipe(takeUntil(this.unsubscribeSubject))
@ -217,9 +213,11 @@ export class GfAppComponent implements OnDestroy, OnInit {
this.hasInfoMessage = this.hasInfoMessage =
this.canCreateAccount || !!this.user?.systemMessage; this.canCreateAccount || !!this.user?.systemMessage;
this.hasPromotion = this.hasPromotion = this.user
!!this.user?.subscription?.offer?.coupon || ? !!this.user.subscription?.offer?.coupon ||
!!this.user?.subscription?.offer?.durationExtension; !!this.user.subscription?.offer?.durationExtension
: !!this.info?.subscriptionOffer?.coupon ||
!!this.info?.subscriptionOffer?.durationExtension;
this.initializeTheme(this.user?.settings.colorScheme); this.initializeTheme(this.user?.settings.colorScheme);

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

@ -1,5 +1,5 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component';
@ -9,6 +9,7 @@ import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/conf
import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper';
import { import {
AccountBalancesResponse, AccountBalancesResponse,
Activity,
HistoricalDataItem, HistoricalDataItem,
PortfolioPosition, PortfolioPosition,
User User

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

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto';
import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';

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

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto';
import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';

1
apps/client/src/app/components/admin-platform/create-or-update-platform-dialog/create-or-update-platform-dialog.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto';
import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto';
import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util';

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

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto';
import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';

1
apps/client/src/app/components/admin-tag/create-or-update-tag-dialog/create-or-update-tag-dialog.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto';
import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'; import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto';
import { validateObjectForForm } from '@ghostfolio/client/util/form.util'; import { validateObjectForForm } from '@ghostfolio/client/util/form.util';

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

@ -1,4 +1,12 @@
import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces';
import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config';
import { import {
getDateFnsLocale, getDateFnsLocale,
@ -51,15 +59,6 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { ConfirmationDialogType } from '../../core/notification/confirmation-dialog/confirmation-dialog.type';
import { NotificationService } from '../../core/notification/notification.service';
import { AdminService } from '../../services/admin.service';
import { DataService } from '../../services/data.service';
import { ImpersonationStorageService } from '../../services/impersonation-storage.service';
import { UserService } from '../../services/user/user.service';
import { UserDetailDialogParams } from '../user-detail-dialog/interfaces/interfaces';
import { GfUserDetailDialogComponent } from '../user-detail-dialog/user-detail-dialog.component';
@Component({ @Component({
imports: [ imports: [
CommonModule, CommonModule,
@ -283,25 +282,16 @@ export class GfAdminUsersComponent implements OnDestroy, OnInit {
} }
private openUserDetailDialog(aUserId: string) { private openUserDetailDialog(aUserId: string) {
const userData = this.dataSource.data.find(({ id }) => {
return id === aUserId;
});
if (!userData) {
this.router.navigate(['.'], { relativeTo: this.route });
return;
}
const dialogRef = this.dialog.open< const dialogRef = this.dialog.open<
GfUserDetailDialogComponent, GfUserDetailDialogComponent,
UserDetailDialogParams UserDetailDialogParams
>(GfUserDetailDialogComponent, { >(GfUserDetailDialogComponent, {
autoFocus: false, autoFocus: false,
data: { data: {
userData,
deviceType: this.deviceType, deviceType: this.deviceType,
hasPermissionForSubscription: this.hasPermissionForSubscription, hasPermissionForSubscription: this.hasPermissionForSubscription,
locale: this.user?.settings?.locale locale: this.user?.settings?.locale,
userId: aUserId
}, },
height: this.deviceType === 'mobile' ? '98vh' : '60vh', height: this.deviceType === 'mobile' ? '98vh' : '60vh',
width: this.deviceType === 'mobile' ? '100vw' : '50rem' width: this.deviceType === 'mobile' ? '100vw' : '50rem'

16
apps/client/src/app/components/header/header.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces'; import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces';
import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component'; import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component';
@ -104,7 +105,8 @@ export class GfHeaderComponent implements OnChanges {
public hasFilters: boolean; public hasFilters: boolean;
public hasImpersonationId: boolean; public hasImpersonationId: boolean;
public hasPermissionForSocialLogin: boolean; public hasPermissionForAuthGoogle: boolean;
public hasPermissionForAuthToken: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToAccessAdminControl: boolean; public hasPermissionToAccessAdminControl: boolean;
public hasPermissionToAccessAssistant: boolean; public hasPermissionToAccessAssistant: boolean;
@ -164,9 +166,14 @@ export class GfHeaderComponent implements OnChanges {
public ngOnChanges() { public ngOnChanges() {
this.hasFilters = this.userService.hasFilters(); this.hasFilters = this.userService.hasFilters();
this.hasPermissionForSocialLogin = hasPermission( this.hasPermissionForAuthGoogle = hasPermission(
this.info?.globalPermissions, this.info?.globalPermissions,
permissions.enableSocialLogin permissions.enableAuthGoogle
);
this.hasPermissionForAuthToken = hasPermission(
this.info?.globalPermissions,
permissions.enableAuthToken
); );
this.hasPermissionForSubscription = hasPermission( this.hasPermissionForSubscription = hasPermission(
@ -279,7 +286,8 @@ export class GfHeaderComponent implements OnChanges {
autoFocus: false, autoFocus: false,
data: { data: {
accessToken: '', accessToken: '',
hasPermissionToUseSocialLogin: this.hasPermissionForSocialLogin, hasPermissionToUseAuthGoogle: this.hasPermissionForAuthGoogle,
hasPermissionToUseAuthToken: this.hasPermissionForAuthToken,
title: $localize`Sign in` title: $localize`Sign in`
}, },
width: '30rem' width: '30rem'

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

@ -1,5 +1,5 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
@ -11,6 +11,7 @@ import {
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper'; import { DATE_FORMAT, downloadAsFile } from '@ghostfolio/common/helper';
import { import {
Activity,
DataProviderInfo, DataProviderInfo,
EnhancedSymbolProfile, EnhancedSymbolProfile,
Filter, Filter,

3
apps/client/src/app/components/login-with-access-token-dialog/interfaces/interfaces.ts

@ -1,5 +1,6 @@
export interface LoginWithAccessTokenDialogParams { export interface LoginWithAccessTokenDialogParams {
accessToken: string; accessToken: string;
hasPermissionToUseSocialLogin: boolean; hasPermissionToUseAuthGoogle: boolean;
hasPermissionToUseAuthToken: boolean;
title: string; title: string;
} }

11
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html

@ -3,6 +3,7 @@
<div class="py-3" mat-dialog-content> <div class="py-3" mat-dialog-content>
<div class="align-items-center d-flex flex-column"> <div class="align-items-center d-flex flex-column">
<form class="w-100"> <form class="w-100">
@if (data.hasPermissionToUseAuthToken) {
<mat-form-field appearance="outline" class="without-hint w-100"> <mat-form-field appearance="outline" class="without-hint w-100">
<mat-label i18n>Security Token</mat-label> <mat-label i18n>Security Token</mat-label>
<input <input
@ -22,9 +23,15 @@
/> />
</button> </button>
</mat-form-field> </mat-form-field>
}
@if (data.hasPermissionToUseSocialLogin) { @if (
data.hasPermissionToUseAuthGoogle && data.hasPermissionToUseAuthToken
) {
<div class="my-3 text-center text-muted" i18n>or</div> <div class="my-3 text-center text-muted" i18n>or</div>
}
@if (data.hasPermissionToUseAuthGoogle) {
<div class="d-flex flex-column"> <div class="d-flex flex-column">
<a <a
class="px-4 rounded-pill" class="px-4 rounded-pill"
@ -49,6 +56,7 @@
> >
</div> </div>
<div> <div>
@if (data.hasPermissionToUseAuthToken) {
<button <button
color="primary" color="primary"
mat-flat-button mat-flat-button
@ -59,5 +67,6 @@
> >
<ng-container i18n>Sign in</ng-container> <ng-container i18n>Sign in</ng-container>
</button> </button>
}
</div> </div>
</div> </div>

1
apps/client/src/app/components/rule/rule.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface'; import { RuleSettings } from '@ghostfolio/api/models/interfaces/rule-settings.interface';
import { import {

1
apps/client/src/app/components/rules/rules.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { GfRuleComponent } from '@ghostfolio/client/components/rule/rule.component'; import { GfRuleComponent } from '@ghostfolio/client/components/rule/rule.component';
import { import {

1
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto';
import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto'; import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto';
import { NotificationService } from '@ghostfolio/client/core/notification/notification.service'; import { NotificationService } from '@ghostfolio/client/core/notification/notification.service';

1
apps/client/src/app/components/user-account-access/user-account-access.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto';
import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component'; import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component';
import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type'; import { ConfirmationDialogType } from '@ghostfolio/client/core/notification/confirmation-dialog/confirmation-dialog.type';

9
apps/client/src/app/components/user-account-membership/user-account-membership.html

@ -37,8 +37,11 @@
<div <div
class="badge badge-pill badge-warning font-weight-normal px-2 py-1" class="badge badge-pill badge-warning font-weight-normal px-2 py-1"
> >
<strong>Limited Offer!</strong> Get <strong i18n>Limited Offer!</strong>
{{ durationExtension }} extra <ng-container>&nbsp;</ng-container>
<ng-container i18n
>Get {{ durationExtension }} extra</ng-container
>
</div> </div>
</div> </div>
} }
@ -67,7 +70,7 @@
</div> </div>
} @else { } @else {
<div class="mt-3 text-muted"> <div class="mt-3 text-muted">
<small i18n>No auto-renewal.</small> <small i18n>No auto-renewal on membership.</small>
</div> </div>
} }
</div> </div>

4
apps/client/src/app/components/user-detail-dialog/interfaces/interfaces.ts

@ -1,8 +1,6 @@
import { AdminUsersResponse } from '@ghostfolio/common/interfaces';
export interface UserDetailDialogParams { export interface UserDetailDialogParams {
deviceType: string; deviceType: string;
hasPermissionForSubscription: boolean; hasPermissionForSubscription: boolean;
locale: string; locale: string;
userData: AdminUsersResponse['users'][0]; userId: string;
} }

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

@ -1,19 +1,24 @@
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { AdminUserResponse } from '@ghostfolio/common/interfaces';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
ChangeDetectorRef,
Component, Component,
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,
Inject, Inject,
OnDestroy OnDestroy,
OnInit
} from '@angular/core'; } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { MatDialogModule } from '@angular/material/dialog'; import { MatDialogModule } from '@angular/material/dialog';
import { Subject } from 'rxjs'; import { EMPTY, Subject } from 'rxjs';
import { catchError, takeUntil } from 'rxjs/operators';
import { UserDetailDialogParams } from './interfaces/interfaces'; import { UserDetailDialogParams } from './interfaces/interfaces';
@ -33,14 +38,36 @@ import { UserDetailDialogParams } from './interfaces/interfaces';
styleUrls: ['./user-detail-dialog.component.scss'], styleUrls: ['./user-detail-dialog.component.scss'],
templateUrl: './user-detail-dialog.html' templateUrl: './user-detail-dialog.html'
}) })
export class GfUserDetailDialogComponent implements OnDestroy { export class GfUserDetailDialogComponent implements OnDestroy, OnInit {
public user: AdminUserResponse;
private unsubscribeSubject = new Subject<void>(); private unsubscribeSubject = new Subject<void>();
public constructor( public constructor(
private adminService: AdminService,
private changeDetectorRef: ChangeDetectorRef,
@Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams, @Inject(MAT_DIALOG_DATA) public data: UserDetailDialogParams,
public dialogRef: MatDialogRef<GfUserDetailDialogComponent> public dialogRef: MatDialogRef<GfUserDetailDialogComponent>
) {} ) {}
public ngOnInit() {
this.adminService
.fetchUserById(this.data.userId)
.pipe(
takeUntil(this.unsubscribeSubject),
catchError(() => {
this.dialogRef.close();
return EMPTY;
})
)
.subscribe((user) => {
this.user = user;
this.changeDetectorRef.markForCheck();
});
}
public onClose() { public onClose() {
this.dialogRef.close(); this.dialogRef.close();
} }

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

@ -8,9 +8,7 @@
<div class="container p-0"> <div class="container p-0">
<div class="mb-3 row"> <div class="mb-3 row">
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.id"> <gf-value i18n size="medium" [value]="user?.id">User ID</gf-value>
User ID
</gf-value>
</div> </div>
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value <gf-value
@ -18,24 +16,21 @@
size="medium" size="medium"
[isDate]="true" [isDate]="true"
[locale]="data.locale" [locale]="data.locale"
[value]="data.userData.createdAt" [value]="user?.createdAt"
>Registration Date</gf-value
> >
Registration Date
</gf-value>
</div> </div>
</div> </div>
<div class="mb-3 row"> <div class="mb-3 row">
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.role"> <gf-value i18n size="medium" [value]="user?.role">Role</gf-value>
Role
</gf-value>
</div> </div>
@if (data.hasPermissionForSubscription) { @if (data.hasPermissionForSubscription) {
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value i18n size="medium" [value]="data.userData.country"> <gf-value i18n size="medium" [value]="user?.country"
Country >Country</gf-value
</gf-value> >
</div> </div>
} }
</div> </div>
@ -46,20 +41,18 @@
i18n i18n
size="medium" size="medium"
[locale]="data.locale" [locale]="data.locale"
[value]="data.userData.accountCount" [value]="user?.accountCount"
>Accounts</gf-value
> >
Accounts
</gf-value>
</div> </div>
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value <gf-value
i18n i18n
size="medium" size="medium"
[locale]="data.locale" [locale]="data.locale"
[value]="data.userData.activityCount" [value]="user?.activityCount"
>Activities</gf-value
> >
Activities
</gf-value>
</div> </div>
</div> </div>
@ -71,20 +64,18 @@
size="medium" size="medium"
[locale]="data.locale" [locale]="data.locale"
[precision]="0" [precision]="0"
[value]="data.userData.engagement" [value]="user?.engagement"
>Engagement per Day</gf-value
> >
Engagement per Day
</gf-value>
</div> </div>
<div class="col-6 mb-3"> <div class="col-6 mb-3">
<gf-value <gf-value
i18n i18n
size="medium" size="medium"
[locale]="data.locale" [locale]="data.locale"
[value]="data.userData.dailyApiRequests" [value]="user?.dailyApiRequests"
>API Requests Today</gf-value
> >
API Requests Today
</gf-value>
</div> </div>
</div> </div>
} }

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

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto';
import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto';
import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto';

1
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto'; import { CreateAccountDto } from '@ghostfolio/api/app/account/create-account.dto';
import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto'; import { UpdateAccountDto } from '@ghostfolio/api/app/account/update-account.dto';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';

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

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto'; import { TransferBalanceDto } from '@ghostfolio/api/app/account/transfer-balance.dto';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';

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

@ -25,6 +25,7 @@ import { Subject, takeUntil } from 'rxjs';
}) })
export class GfFeaturesPageComponent implements OnDestroy { export class GfFeaturesPageComponent implements OnDestroy {
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean;
public info: InfoItem; public info: InfoItem;
public routerLinkRegister = publicRoutes.register.routerLink; public routerLinkRegister = publicRoutes.register.routerLink;
public routerLinkResources = publicRoutes.resources.routerLink; public routerLinkResources = publicRoutes.resources.routerLink;
@ -55,6 +56,11 @@ export class GfFeaturesPageComponent implements OnDestroy {
this.info?.globalPermissions, this.info?.globalPermissions,
permissions.enableSubscription permissions.enableSubscription
); );
this.hasPermissionToCreateUser = hasPermission(
this.info?.globalPermissions,
permissions.createUserAccount
);
} }
public ngOnDestroy() { public ngOnDestroy() {

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

@ -309,7 +309,7 @@
</div> </div>
</div> </div>
</div> </div>
@if (!user) { @if (hasPermissionToCreateUser && !user) {
<div class="row"> <div class="row">
<div class="col mt-3 text-center"> <div class="col mt-3 text-center">
<a <a

1
apps/client/src/app/pages/landing/landing-page.component.ts

@ -127,6 +127,7 @@ export class GfLandingPageComponent implements OnDestroy, OnInit {
} }
this.hasPermissionForDemo = !!demoAuthToken; this.hasPermissionForDemo = !!demoAuthToken;
this.hasPermissionForStatistics = hasPermission( this.hasPermissionForStatistics = hasPermission(
globalPermissions, globalPermissions,
permissions.enableStatistics permissions.enableStatistics

8
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -1,5 +1,5 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { IcsService } from '@ghostfolio/client/services/ics/ics.service'; import { IcsService } from '@ghostfolio/client/services/ics/ics.service';
@ -7,7 +7,11 @@ import { ImpersonationStorageService } from '@ghostfolio/client/services/imperso
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config';
import { downloadAsFile } from '@ghostfolio/common/helper'; import { downloadAsFile } from '@ghostfolio/common/helper';
import { AssetProfileIdentifier, User } from '@ghostfolio/common/interfaces'; import {
Activity,
AssetProfileIdentifier,
User
} from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';

1
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';

3
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/interfaces/interfaces.ts

@ -1,5 +1,4 @@
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface'; import { Activity, User } from '@ghostfolio/common/interfaces';
import { User } from '@ghostfolio/common/interfaces';
import { Account } from '@prisma/client'; import { Account } from '@prisma/client';

4
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -1,14 +1,14 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto';
import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto';
import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component'; import { GfDialogFooterComponent } from '@ghostfolio/client/components/dialog-footer/dialog-footer.component';
import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component'; import { GfDialogHeaderComponent } from '@ghostfolio/client/components/dialog-header/dialog-header.component';
import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive';
import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe'; import { GfSymbolPipe } from '@ghostfolio/client/pipes/symbol/symbol.pipe';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service';
import { PortfolioPosition } from '@ghostfolio/common/interfaces'; import { Activity, PortfolioPosition } from '@ghostfolio/common/interfaces';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { import {

1
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component'; import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component';
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/client/services/data.service';

12
apps/client/src/app/pages/pricing/pricing-page.component.ts

@ -52,6 +52,7 @@ export class GfPricingPageComponent implements OnDestroy, OnInit {
public coupon: number; public coupon: number;
public couponId: string; public couponId: string;
public durationExtension: StringValue; public durationExtension: StringValue;
public hasPermissionToCreateUser: boolean;
public hasPermissionToUpdateUserSettings: boolean; public hasPermissionToUpdateUserSettings: boolean;
public importAndExportTooltipBasic = translate( public importAndExportTooltipBasic = translate(
'DATA_IMPORT_AND_EXPORT_TOOLTIP_BASIC' 'DATA_IMPORT_AND_EXPORT_TOOLTIP_BASIC'
@ -100,11 +101,18 @@ export class GfPricingPageComponent implements OnDestroy, OnInit {
} }
public ngOnInit() { public ngOnInit() {
const { baseCurrency, subscriptionOffer } = this.dataService.fetchInfo(); const { baseCurrency, globalPermissions, subscriptionOffer } =
this.baseCurrency = baseCurrency; this.dataService.fetchInfo();
this.baseCurrency = baseCurrency;
this.coupon = subscriptionOffer?.coupon; this.coupon = subscriptionOffer?.coupon;
this.durationExtension = subscriptionOffer?.durationExtension; this.durationExtension = subscriptionOffer?.durationExtension;
this.hasPermissionToCreateUser = hasPermission(
globalPermissions,
permissions.createUserAccount
);
this.label = subscriptionOffer?.label; this.label = subscriptionOffer?.label;
this.price = subscriptionOffer?.price; this.price = subscriptionOffer?.price;

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

@ -310,6 +310,7 @@
class="badge badge-warning font-weight-normal line-height-1 p-3 w-100" class="badge badge-warning font-weight-normal line-height-1 p-3 w-100"
> >
<strong i18n>Limited Offer!</strong> <strong i18n>Limited Offer!</strong>
<ng-container>&nbsp;</ng-container>
<ng-container i18n <ng-container i18n
>Get {{ durationExtension }} extra</ng-container >Get {{ durationExtension }} extra</ng-container
> >
@ -366,7 +367,7 @@
</p> </p>
</div> </div>
</div> </div>
} @else if (!user) { } @else if (hasPermissionToCreateUser && !user) {
<div class="row"> <div class="row">
<div class="col mt-3 text-center"> <div class="col mt-3 text-center">
<a <a

12
apps/client/src/app/pages/register/register-page.component.ts

@ -30,7 +30,8 @@ import { GfUserAccountRegistrationDialogComponent } from './user-account-registr
}) })
export class GfRegisterPageComponent implements OnDestroy, OnInit { export class GfRegisterPageComponent implements OnDestroy, OnInit {
public deviceType: string; public deviceType: string;
public hasPermissionForSocialLogin: boolean; public hasPermissionForAuthGoogle: boolean;
public hasPermissionForAuthToken: boolean;
public hasPermissionForSubscription: boolean; public hasPermissionForSubscription: boolean;
public hasPermissionToCreateUser: boolean; public hasPermissionToCreateUser: boolean;
public historicalDataItems: LineChartItem[]; public historicalDataItems: LineChartItem[];
@ -55,9 +56,14 @@ export class GfRegisterPageComponent implements OnDestroy, OnInit {
this.deviceType = this.deviceService.getDeviceInfo().deviceType; this.deviceType = this.deviceService.getDeviceInfo().deviceType;
this.hasPermissionForSocialLogin = hasPermission( this.hasPermissionForAuthGoogle = hasPermission(
globalPermissions, globalPermissions,
permissions.enableSocialLogin permissions.enableAuthGoogle
);
this.hasPermissionForAuthToken = hasPermission(
globalPermissions,
permissions.enableAuthToken
); );
this.hasPermissionForSubscription = hasPermission( this.hasPermissionForSubscription = hasPermission(

6
apps/client/src/app/pages/register/register-page.html

@ -18,6 +18,7 @@
<div class="button-container row"> <div class="button-container row">
<div class="align-items-center col d-flex justify-content-center"> <div class="align-items-center col d-flex justify-content-center">
<div class="py-5 text-center"> <div class="py-5 text-center">
@if (hasPermissionForAuthToken) {
<button <button
class="d-inline-block" class="d-inline-block"
color="primary" color="primary"
@ -26,8 +27,11 @@
> >
<ng-container i18n>Create Account</ng-container> <ng-container i18n>Create Account</ng-container>
</button> </button>
@if (hasPermissionForSocialLogin) { }
@if (hasPermissionForAuthToken && hasPermissionForAuthGoogle) {
<div class="my-3 text-muted" i18n>or</div> <div class="my-3 text-muted" i18n>or</div>
}
@if (hasPermissionForAuthGoogle) {
<a <a
class="px-4 rounded-pill w-100" class="px-4 rounded-pill w-100"
href="../api/v1/auth/google" href="../api/v1/auth/google"

10
apps/client/src/app/services/admin.service.ts

@ -1,19 +1,21 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto'; import { UpdateAssetProfileDto } from '@ghostfolio/api/app/admin/update-asset-profile.dto';
import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto'; import { CreatePlatformDto } from '@ghostfolio/api/app/platform/create-platform.dto';
import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto'; import { UpdatePlatformDto } from '@ghostfolio/api/app/platform/update-platform.dto';
import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import { import {
HEADER_KEY_SKIP_INTERCEPTOR, HEADER_KEY_SKIP_INTERCEPTOR,
HEADER_KEY_TOKEN HEADER_KEY_TOKEN
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config'; import { DEFAULT_PAGE_SIZE } from '@ghostfolio/common/config';
import { import {
AssetProfileIdentifier,
AdminData, AdminData,
AdminJobs, AdminJobs,
AdminMarketData, AdminMarketData,
AdminUserResponse,
AdminUsersResponse, AdminUsersResponse,
AssetProfileIdentifier,
DataProviderGhostfolioStatusResponse, DataProviderGhostfolioStatusResponse,
DataProviderHistoricalResponse,
EnhancedSymbolProfile, EnhancedSymbolProfile,
Filter Filter
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
@ -142,6 +144,10 @@ export class AdminService {
return this.http.get<Platform[]>('/api/v1/platform'); return this.http.get<Platform[]>('/api/v1/platform');
} }
public fetchUserById(id: string) {
return this.http.get<AdminUserResponse>(`/api/v1/admin/user/${id}`);
}
public fetchUsers({ public fetchUsers({
skip, skip,
take = DEFAULT_PAGE_SIZE take = DEFAULT_PAGE_SIZE

9
apps/client/src/app/services/data.service.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto'; import { CreateAccessDto } from '@ghostfolio/api/app/access/create-access.dto';
import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto'; import { UpdateAccessDto } from '@ghostfolio/api/app/access/update-access.dto';
import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto'; import { CreateAccountBalanceDto } from '@ghostfolio/api/app/account-balance/create-account-balance.dto';
@ -10,18 +11,17 @@ import { UpdateTagDto } from '@ghostfolio/api/app/endpoints/tags/update-tag.dto'
import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto'; import { CreateWatchlistItemDto } from '@ghostfolio/api/app/endpoints/watchlist/create-watchlist-item.dto';
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto'; import { UpdateOrderDto } from '@ghostfolio/api/app/order/update-order.dto';
import { SymbolItem } from '@ghostfolio/api/app/symbol/interfaces/symbol-item.interface';
import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto'; import { DeleteOwnUserDto } from '@ghostfolio/api/app/user/delete-own-user.dto';
import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface'; import { UserItem } from '@ghostfolio/api/app/user/interfaces/user-item.interface';
import { UpdateOwnAccessTokenDto } from '@ghostfolio/api/app/user/update-own-access-token.dto'; import { UpdateOwnAccessTokenDto } from '@ghostfolio/api/app/user/update-own-access-token.dto';
import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto'; import { UpdateUserSettingDto } from '@ghostfolio/api/app/user/update-user-setting.dto';
import { DataProviderHistoricalResponse } from '@ghostfolio/api/services/interfaces/interfaces';
import { PropertyDto } from '@ghostfolio/api/services/property/property.dto'; import { PropertyDto } from '@ghostfolio/api/services/property/property.dto';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
Access, Access,
AccessTokenResponse, AccessTokenResponse,
AccountBalancesResponse, AccountBalancesResponse,
AccountResponse,
AccountsResponse, AccountsResponse,
ActivitiesResponse, ActivitiesResponse,
ActivityResponse, ActivityResponse,
@ -33,6 +33,7 @@ import {
BenchmarkResponse, BenchmarkResponse,
CreateStripeCheckoutSessionResponse, CreateStripeCheckoutSessionResponse,
DataProviderHealthResponse, DataProviderHealthResponse,
DataProviderHistoricalResponse,
ExportResponse, ExportResponse,
Filter, Filter,
ImportResponse, ImportResponse,
@ -49,12 +50,12 @@ import {
PortfolioPerformanceResponse, PortfolioPerformanceResponse,
PortfolioReportResponse, PortfolioReportResponse,
PublicPortfolioResponse, PublicPortfolioResponse,
SymbolItem,
User, User,
WatchlistResponse WatchlistResponse
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions';
import type { import type {
AccountWithValue,
AiPromptMode, AiPromptMode,
DateRange, DateRange,
GroupBy GroupBy
@ -186,7 +187,7 @@ export class DataService {
} }
public fetchAccount(aAccountId: string) { public fetchAccount(aAccountId: string) {
return this.http.get<AccountWithValue>(`/api/v1/account/${aAccountId}`); return this.http.get<AccountResponse>(`/api/v1/account/${aAccountId}`);
} }
public fetchAccountBalances(aAccountId: string) { public fetchAccountBalances(aAccountId: string) {

3
apps/client/src/app/services/import-activities.service.ts

@ -1,9 +1,10 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto'; import { CreateTagDto } from '@ghostfolio/api/app/endpoints/tags/create-tag.dto';
import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto'; import { CreateAccountWithBalancesDto } from '@ghostfolio/api/app/import/create-account-with-balances.dto';
import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto'; import { CreateAssetProfileWithMarketDataDto } from '@ghostfolio/api/app/import/create-asset-profile-with-market-data.dto';
import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto'; import { CreateOrderDto } from '@ghostfolio/api/app/order/create-order.dto';
import { Activity } from '@ghostfolio/api/app/order/interfaces/activities.interface';
import { parseDate as parseDateHelper } from '@ghostfolio/common/helper'; import { parseDate as parseDateHelper } from '@ghostfolio/common/helper';
import { Activity } from '@ghostfolio/common/interfaces';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';

1
apps/client/src/app/services/web-authn.service.ts

@ -1,3 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto'; import { AuthDeviceDto } from '@ghostfolio/api/app/auth-device/auth-device.dto';
import { import {
PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialCreationOptionsJSON,

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

@ -295,7 +295,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="837553826328586238" datatype="html"> <trans-unit id="837553826328586238" datatype="html">
@ -1486,6 +1486,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Implicació per Dia</target> <target state="translated">Implicació per Dia</target>
@ -1995,7 +2003,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -2459,7 +2467,7 @@
<target state="translated">Prova Premium</target> <target state="translated">Prova Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -2467,7 +2475,7 @@
<target state="translated">Bescanviar el cupó</target> <target state="translated">Bescanviar el cupó</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="616064537937996961" datatype="html"> <trans-unit id="616064537937996961" datatype="html">
@ -3344,7 +3352,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3816,7 +3824,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4808791512433987109" datatype="html"> <trans-unit id="4808791512433987109" datatype="html">
@ -4372,7 +4380,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -4436,7 +4444,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6762743264882388498" datatype="html"> <trans-unit id="6762743264882388498" datatype="html">
@ -4788,7 +4796,7 @@
<target state="translated">És gratuït.</target> <target state="translated">És gratuït.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -5217,7 +5225,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5505,7 +5513,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -6745,7 +6753,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6788,14 +6796,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="new">No auto-renewal.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="new">This year</target> <target state="new">This year</target>
@ -6857,7 +6857,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="new">Limited Offer!</target> <target state="new">Limited Offer!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -42,7 +42,7 @@
<target state="translated">bitte</target> <target state="translated">bitte</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -669,6 +669,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="translated">Keine automatische Erneuerung der Mitgliedschaft.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Engagement pro Tag</target> <target state="translated">Engagement pro Tag</target>
@ -726,7 +734,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -854,7 +862,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1230,7 +1238,7 @@
<target state="translated">Premium ausprobieren</target> <target state="translated">Premium ausprobieren</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -1238,7 +1246,7 @@
<target state="translated">Gutschein einlösen</target> <target state="translated">Gutschein einlösen</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -2290,7 +2298,7 @@
<target state="translated">kontaktiere uns</target> <target state="translated">kontaktiere uns</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -3058,7 +3066,7 @@
<target state="translated">Suchst du nach einem Studentenrabatt?</target> <target state="translated">Suchst du nach einem Studentenrabatt?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3550,7 +3558,7 @@
<target state="translated">Es ist kostenlos.</target> <target state="translated">Es ist kostenlos.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5012084291992448490" datatype="html"> <trans-unit id="5012084291992448490" datatype="html">
@ -5264,7 +5272,7 @@
<target state="translated">mit deiner Universitäts-E-Mail-Adresse</target> <target state="translated">mit deiner Universitäts-E-Mail-Adresse</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5444,7 +5452,7 @@
<target state="translated">Fordere ihn an</target> <target state="translated">Fordere ihn an</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5768,7 +5776,7 @@
<target state="translated">hier</target> <target state="translated">hier</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6769,7 +6777,7 @@
<target state="translated">Wenn du die Eröffnung eines Kontos planst bei</target> <target state="translated">Wenn du die Eröffnung eines Kontos planst bei</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6812,14 +6820,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Keine automatische Erneuerung.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Dieses Jahr</target> <target state="translated">Dieses Jahr</target>
@ -6881,7 +6881,7 @@
<target state="translated">um unseren Empfehlungslink zu verwenden und ein Ghostfolio Premium-Abonnement für ein Jahr zu erhalten</target> <target state="translated">um unseren Empfehlungslink zu verwenden und ein Ghostfolio Premium-Abonnement für ein Jahr zu erhalten</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">Begrenztes Angebot!</target> <target state="translated">Begrenztes Angebot!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="translated">Erhalte <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="translated">Erhalte <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -43,7 +43,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -654,6 +654,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Contratación diaria</target> <target state="translated">Contratación diaria</target>
@ -711,7 +719,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -839,7 +847,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1215,7 +1223,7 @@
<target state="translated">Prueba Premium</target> <target state="translated">Prueba Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -1223,7 +1231,7 @@
<target state="translated">Canjea el cupón</target> <target state="translated">Canjea el cupón</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -2275,7 +2283,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -3035,7 +3043,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3535,7 +3543,7 @@
<target state="translated">Es gratis.</target> <target state="translated">Es gratis.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5012084291992448490" datatype="html"> <trans-unit id="5012084291992448490" datatype="html">
@ -5241,7 +5249,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5421,7 +5429,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5745,7 +5753,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6746,7 +6754,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6789,14 +6797,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Sin renovación automática.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Este año</target> <target state="translated">Este año</target>
@ -6858,7 +6858,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7910,6 +7910,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">¡Oferta limitada!</target> <target state="translated">¡Oferta limitada!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7918,9 +7922,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="translated">Obtén <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="translated">Obtén <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -34,7 +34,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -861,6 +861,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Engagement par Jour</target> <target state="translated">Engagement par Jour</target>
@ -1106,7 +1114,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1494,7 +1502,7 @@
<target state="translated">Essayer Premium</target> <target state="translated">Essayer Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -1502,7 +1510,7 @@
<target state="translated">Utiliser un Code Promotionnel</target> <target state="translated">Utiliser un Code Promotionnel</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -2322,7 +2330,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -2514,7 +2522,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -2742,7 +2750,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -3534,7 +3542,7 @@
<target state="translated">C’est gratuit.</target> <target state="translated">C’est gratuit.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5012084291992448490" datatype="html"> <trans-unit id="5012084291992448490" datatype="html">
@ -5240,7 +5248,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5420,7 +5428,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5744,7 +5752,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6745,7 +6753,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6788,14 +6796,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Pas de renouvellement automatique.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Cette année</target> <target state="translated">Cette année</target>
@ -6857,7 +6857,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">Offre Limitée !</target> <target state="translated">Offre Limitée !</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="translated">Obtenez <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> supplémentaires</target> <target state="translated">Obtenez <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> supplémentaires</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -43,7 +43,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -654,6 +654,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Partecipazione giornaliera</target> <target state="translated">Partecipazione giornaliera</target>
@ -711,7 +719,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -839,7 +847,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1215,7 +1223,7 @@
<target state="translated">Prova Premium</target> <target state="translated">Prova Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -1223,7 +1231,7 @@
<target state="translated">Riscatta il buono</target> <target state="translated">Riscatta il buono</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -2275,7 +2283,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -3035,7 +3043,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3535,7 +3543,7 @@
<target state="translated">È gratuito.</target> <target state="translated">È gratuito.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5012084291992448490" datatype="html"> <trans-unit id="5012084291992448490" datatype="html">
@ -5241,7 +5249,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5421,7 +5429,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5745,7 +5753,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6746,7 +6754,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6789,14 +6797,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">No rinnovo automatico.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Anno corrente</target> <target state="translated">Anno corrente</target>
@ -6858,7 +6858,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7910,6 +7910,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">Offerta limitata!</target> <target state="translated">Offerta limitata!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7918,9 +7922,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -42,7 +42,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -653,6 +653,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Betrokkenheid per dag</target> <target state="translated">Betrokkenheid per dag</target>
@ -710,7 +718,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -838,7 +846,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1214,7 +1222,7 @@
<target state="translated">Probeer Premium</target> <target state="translated">Probeer Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -1222,7 +1230,7 @@
<target state="translated">Coupon inwisselen</target> <target state="translated">Coupon inwisselen</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -2274,7 +2282,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -3034,7 +3042,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3534,7 +3542,7 @@
<target state="translated">Het is gratis.</target> <target state="translated">Het is gratis.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5012084291992448490" datatype="html"> <trans-unit id="5012084291992448490" datatype="html">
@ -5240,7 +5248,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5420,7 +5428,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5744,7 +5752,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6745,7 +6753,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6788,14 +6796,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Geen automatische verlenging.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Dit jaar</target> <target state="translated">Dit jaar</target>
@ -6857,7 +6857,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">Beperkt aanbod!</target> <target state="translated">Beperkt aanbod!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="translated">Krijg <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="translated">Krijg <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -243,7 +243,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -1314,6 +1314,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Zaangażowanie na Dzień</target> <target state="translated">Zaangażowanie na Dzień</target>
@ -1691,7 +1699,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -2179,7 +2187,7 @@
<target state="translated">Wypróbuj Premium</target> <target state="translated">Wypróbuj Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -2187,7 +2195,7 @@
<target state="translated">Wykorzystaj kupon</target> <target state="translated">Wykorzystaj kupon</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="616064537937996961" datatype="html"> <trans-unit id="616064537937996961" datatype="html">
@ -2979,7 +2987,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3435,7 +3443,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4808791512433987109" datatype="html"> <trans-unit id="4808791512433987109" datatype="html">
@ -3983,7 +3991,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -4335,7 +4343,7 @@
<target state="translated">Jest bezpłatny.</target> <target state="translated">Jest bezpłatny.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -4744,7 +4752,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -4888,7 +4896,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -5744,7 +5752,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6745,7 +6753,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6788,14 +6796,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Bez automatycznego odnawiania.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">W tym roku</target> <target state="translated">W tym roku</target>
@ -6857,7 +6857,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">Oferta ograniczona czasowo!</target> <target state="translated">Oferta ograniczona czasowo!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="translated">Uzyskaj <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> dodatkowo</target> <target state="translated">Uzyskaj <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> dodatkowo</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -34,7 +34,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -733,6 +733,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Envolvimento por Dia</target> <target state="translated">Envolvimento por Dia</target>
@ -986,7 +994,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1482,7 +1490,7 @@
<target state="translated">Experimentar Premium</target> <target state="translated">Experimentar Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -1490,7 +1498,7 @@
<target state="translated">Resgatar Cupão</target> <target state="translated">Resgatar Cupão</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -2450,7 +2458,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -2642,7 +2650,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -3098,7 +3106,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3534,7 +3542,7 @@
<target state="translated">É gratuito.</target> <target state="translated">É gratuito.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5012084291992448490" datatype="html"> <trans-unit id="5012084291992448490" datatype="html">
@ -5240,7 +5248,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5420,7 +5428,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5744,7 +5752,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6745,7 +6753,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6788,14 +6796,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Sem renovação automática.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Este ano</target> <target state="translated">Este ano</target>
@ -6857,7 +6857,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="new">Limited Offer!</target> <target state="new">Limited Offer!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -215,7 +215,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -1182,6 +1182,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">Günlük etkileşim</target> <target state="translated">Günlük etkileşim</target>
@ -1551,7 +1559,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -2563,7 +2571,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3475,7 +3483,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3827,7 +3835,7 @@
<target state="translated">Ücretsiz.</target> <target state="translated">Ücretsiz.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -4336,7 +4344,7 @@
<target state="translated">Premium’u Deneyin</target> <target state="translated">Premium’u Deneyin</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -4344,7 +4352,7 @@
<target state="translated">Kupon Kullan</target> <target state="translated">Kupon Kullan</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="385370743150031888" datatype="html"> <trans-unit id="385370743150031888" datatype="html">
@ -4584,7 +4592,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -5248,7 +5256,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7029006507527852669" datatype="html"> <trans-unit id="7029006507527852669" datatype="html">
@ -5420,7 +5428,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -5744,7 +5752,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
@ -6745,7 +6753,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6788,14 +6796,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<target state="translated">Otomatik yenileme yok.</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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">Bu yıl</target> <target state="translated">Bu yıl</target>
@ -6857,7 +6857,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">Sınırlı Teklif!</target> <target state="translated">Sınırlı Teklif!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -295,7 +295,7 @@
<target state="new">please</target> <target state="new">please</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="837553826328586238" datatype="html"> <trans-unit id="837553826328586238" datatype="html">
@ -1527,7 +1527,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -1558,6 +1558,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="6013411263593168734" datatype="html"> <trans-unit id="6013411263593168734" datatype="html">
<source>Do you really want to delete this tag?</source> <source>Do you really want to delete this tag?</source>
<target state="translated">Ви дійсно хочете видалити цей тег?</target> <target state="translated">Ви дійсно хочете видалити цей тег?</target>
@ -1783,7 +1791,7 @@
<target state="new">If you plan to open an account at</target> <target state="new">If you plan to open an account at</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -2751,7 +2759,7 @@
<target state="translated">Спробуйте Premium</target> <target state="translated">Спробуйте Premium</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -2759,15 +2767,7 @@
<target state="translated">Обміняти купон</target> <target state="translated">Обміняти купон</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group>
</trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<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">70</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="616064537937996961" datatype="html"> <trans-unit id="616064537937996961" datatype="html">
@ -3636,7 +3636,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -4108,7 +4108,7 @@
<target state="new">with your university e-mail address</target> <target state="new">with your university e-mail address</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4808791512433987109" datatype="html"> <trans-unit id="4808791512433987109" datatype="html">
@ -4700,7 +4700,7 @@
<target state="new">Looking for a student discount?</target> <target state="new">Looking for a student discount?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -4764,7 +4764,7 @@
<target state="new">here</target> <target state="new">here</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6762743264882388498" datatype="html"> <trans-unit id="6762743264882388498" datatype="html">
@ -5156,7 +5156,7 @@
<target state="translated">Це безкоштовно.</target> <target state="translated">Це безкоштовно.</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -5763,7 +5763,7 @@
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -5955,7 +5955,7 @@
<target state="new">Request it</target> <target state="new">Request it</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -6243,7 +6243,7 @@
<target state="new">contact us</target> <target state="new">contact us</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -7909,6 +7909,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="new">Limited Offer!</target> <target state="new">Limited Offer!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7917,9 +7921,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</target> <target state="new">Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">

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

@ -228,7 +228,7 @@
<source>please</source> <source>please</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -1239,6 +1239,13 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<context-group purpose="location"> <context-group purpose="location">
@ -1583,7 +1590,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -2027,14 +2034,14 @@
<source>Try Premium</source> <source>Try Premium</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
<source>Redeem Coupon</source> <source>Redeem Coupon</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="616064537937996961" datatype="html"> <trans-unit id="616064537937996961" datatype="html">
@ -2763,7 +2770,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3172,7 +3179,7 @@
<source>with your university e-mail address</source> <source>with your university e-mail address</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4808791512433987109" datatype="html"> <trans-unit id="4808791512433987109" datatype="html">
@ -3665,7 +3672,7 @@
<source>Looking for a student discount?</source> <source>Looking for a student discount?</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -3985,7 +3992,7 @@
<source>It’s free.</source> <source>It’s free.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -4366,7 +4373,7 @@
<source>Request it</source> <source>Request it</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -4515,7 +4522,7 @@
<source>contact us</source> <source>contact us</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -5277,7 +5284,7 @@
<source>here</source> <source>here</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1501828122056907560" datatype="html"> <trans-unit id="1501828122056907560" datatype="html">
@ -6155,7 +6162,7 @@
<source>If you plan to open an account at</source> <source>If you plan to open an account at</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6186,13 +6193,6 @@
<context context-type="linenumber">63</context> <context context-type="linenumber">63</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<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">70</context>
</context-group>
</trans-unit>
<trans-unit id="6351408992301482473" datatype="html"> <trans-unit id="6351408992301482473" datatype="html">
<source>From the beginning</source> <source>From the beginning</source>
<context-group purpose="location"> <context-group purpose="location">
@ -6240,7 +6240,7 @@
<source>to use our referral link and get a Ghostfolio Premium membership for one year</source> <source>to use our referral link and get a Ghostfolio Premium membership for one year</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -7167,6 +7167,10 @@
</trans-unit> </trans-unit>
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7174,9 +7178,13 @@
</trans-unit> </trans-unit>
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5643561794785412000" datatype="html"> <trans-unit id="5643561794785412000" datatype="html">

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

@ -241,10 +241,10 @@
</trans-unit> </trans-unit>
<trans-unit id="9153520284278555926" datatype="html"> <trans-unit id="9153520284278555926" datatype="html">
<source>please</source> <source>please</source>
<target state="new">please</target> <target state="translated">请</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">350</context> <context context-type="linenumber">351</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="8650499415827640724" datatype="html"> <trans-unit id="8650499415827640724" datatype="html">
@ -285,7 +285,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1351814922314683865" datatype="html"> <trans-unit id="1351814922314683865" datatype="html">
<source>with</source> <source>with</source>
<target state="new">with</target> <target state="translated">和</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">87</context> <context context-type="linenumber">87</context>
@ -665,7 +665,7 @@
</trans-unit> </trans-unit>
<trans-unit id="5611965261696422586" datatype="html"> <trans-unit id="5611965261696422586" datatype="html">
<source>and is driven by the efforts of its <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio/graphs/contributors&quot; title=&quot;Contributors to Ghostfolio&quot; &gt;"/>contributors<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></source> <source>and is driven by the efforts of its <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio/graphs/contributors&quot; title=&quot;Contributors to Ghostfolio&quot; &gt;"/>contributors<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></source>
<target state="new">and is driven by the efforts of its <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio/graphs/contributors&quot; title=&quot;Contributors to Ghostfolio&quot; &gt;"/>contributors<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target> <target state="translated">并且得益于其 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio/graphs/contributors&quot; title=&quot;Contributors to Ghostfolio&quot; &gt;"/>贡献者<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">49</context>
@ -965,7 +965,7 @@
</trans-unit> </trans-unit>
<trans-unit id="577204259483334667" datatype="html"> <trans-unit id="577204259483334667" datatype="html">
<source>and we share aggregated <x id="START_LINK" ctype="x-a" equiv-text="&lt;a title=&quot;Open Startup&quot; [routerLink]=&quot;routerLinkOpenStartup&quot; &gt;"/>key metrics<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> of the platform’s performance</source> <source>and we share aggregated <x id="START_LINK" ctype="x-a" equiv-text="&lt;a title=&quot;Open Startup&quot; [routerLink]=&quot;routerLinkOpenStartup&quot; &gt;"/>key metrics<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> of the platform’s performance</source>
<target state="new">and we share aggregated <x id="START_LINK" ctype="x-a" equiv-text="&lt;a title=&quot;Open Startup&quot; [routerLink]=&quot;routerLinkOpenStartup&quot; &gt;"/>key metrics<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> of the platform’s performance</target> <target state="translated">并且我们分享平台性能的聚合 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a title=&quot;Open Startup&quot; [routerLink]=&quot;routerLinkOpenStartup&quot; &gt;"/>关键指标<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">32</context> <context context-type="linenumber">32</context>
@ -1181,7 +1181,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8119836022359386797" datatype="html"> <trans-unit id="8119836022359386797" datatype="html">
<source>Activities</source> <source>Activities</source>
<target state="new">Activities</target> <target state="translated">活动</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">61</context> <context context-type="linenumber">61</context>
@ -1233,7 +1233,7 @@
</trans-unit> </trans-unit>
<trans-unit id="4340477809050781416" datatype="html"> <trans-unit id="4340477809050781416" datatype="html">
<source>Current year</source> <source>Current year</source>
<target state="new">Current year</target> <target state="translated">当前年份</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">204</context> <context context-type="linenumber">204</context>
@ -1323,6 +1323,14 @@
<context context-type="linenumber">231</context> <context context-type="linenumber">231</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2395205455607568422" datatype="html">
<source>No auto-renewal on membership.</source>
<target state="new">No auto-renewal on membership.</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">73</context>
</context-group>
</trans-unit>
<trans-unit id="5209005842640458222" datatype="html"> <trans-unit id="5209005842640458222" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="translated">每天的参与度</target> <target state="translated">每天的参与度</target>
@ -1545,7 +1553,7 @@
</trans-unit> </trans-unit>
<trans-unit id="5289957034780335504" datatype="html"> <trans-unit id="5289957034780335504" datatype="html">
<source>The source code is fully available as <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot; title=&quot;Find Ghostfolio on GitHub&quot; &gt;"/>open source software<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> (OSS) under the <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://www.gnu.org/licenses/agpl-3.0.html&quot; title=&quot;GNU Affero General Public License&quot; &gt;"/>AGPL-3.0 license<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></source> <source>The source code is fully available as <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot; title=&quot;Find Ghostfolio on GitHub&quot; &gt;"/>open source software<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> (OSS) under the <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://www.gnu.org/licenses/agpl-3.0.html&quot; title=&quot;GNU Affero General Public License&quot; &gt;"/>AGPL-3.0 license<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></source>
<target state="new">The source code is fully available as <x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot; title=&quot;Find Ghostfolio on GitHub&quot; &gt;"/>open source software<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> (OSS) under the <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://www.gnu.org/licenses/agpl-3.0.html&quot; title=&quot;GNU Affero General Public License&quot; &gt;"/>AGPL-3.0 license<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target> <target state="translated">源代码完全可用,作为<x id="START_LINK" ctype="x-a" equiv-text="&lt;a href=&quot;https://github.com/ghostfolio/ghostfolio&quot; title=&quot;Find Ghostfolio on GitHub&quot; &gt;"/>开源软件<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> (OSS),遵循<x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://www.gnu.org/licenses/agpl-3.0.html&quot; title=&quot;GNU Affero General Public License&quot; &gt;"/>AGPL-3.0许可证<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">16</context> <context context-type="linenumber">16</context>
@ -1609,7 +1617,7 @@
</trans-unit> </trans-unit>
<trans-unit id="6004588582437169024" datatype="html"> <trans-unit id="6004588582437169024" datatype="html">
<source>Current week</source> <source>Current week</source>
<target state="new">Current week</target> <target state="translated">当前周</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">196</context> <context context-type="linenumber">196</context>
@ -1700,7 +1708,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">343</context> <context context-type="linenumber">344</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/register/register-page.html</context>
@ -2188,7 +2196,7 @@
<target state="translated">尝试高级版</target> <target state="translated">尝试高级版</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">49</context> <context context-type="linenumber">52</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5779112962677150663" datatype="html"> <trans-unit id="5779112962677150663" datatype="html">
@ -2196,7 +2204,7 @@
<target state="translated">兑换优惠券</target> <target state="translated">兑换优惠券</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-membership/user-account-membership.html</context>
<context context-type="linenumber">63</context> <context context-type="linenumber">66</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="616064537937996961" datatype="html"> <trans-unit id="616064537937996961" datatype="html">
@ -2517,7 +2525,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8553460997100418147" datatype="html"> <trans-unit id="8553460997100418147" datatype="html">
<source>for</source> <source>for</source>
<target state="new">for</target> <target state="translated">用于</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">128</context> <context context-type="linenumber">128</context>
@ -2953,7 +2961,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3556628518893194463" datatype="html"> <trans-unit id="3556628518893194463" datatype="html">
<source>per week</source> <source>per week</source>
<target state="new">per week</target> <target state="translated">每周</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">130</context> <context context-type="linenumber">130</context>
@ -2988,7 +2996,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">377</context> <context context-type="linenumber">378</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
@ -3129,7 +3137,7 @@
</trans-unit> </trans-unit>
<trans-unit id="9187635907883145155" datatype="html"> <trans-unit id="9187635907883145155" datatype="html">
<source>Edit access</source> <source>Edit access</source>
<target state="new">Edit access</target> <target state="translated">编辑权限</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.html</context>
<context context-type="linenumber">11</context> <context context-type="linenumber">11</context>
@ -3233,7 +3241,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8984201769958269296" datatype="html"> <trans-unit id="8984201769958269296" datatype="html">
<source>Get access to 80’000+ tickers from over 50 exchanges</source> <source>Get access to 80’000+ tickers from over 50 exchanges</source>
<target state="new">Get access to 80’000+ tickers from over 50 exchanges</target> <target state="translated">获取来自 50 多个交易所的 80,000 多个行情的访问权限</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">84</context> <context context-type="linenumber">84</context>
@ -3369,7 +3377,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8014012170270529279" datatype="html"> <trans-unit id="8014012170270529279" datatype="html">
<source>less than</source> <source>less than</source>
<target state="new">less than</target> <target state="translated">少于</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/subscription-interstitial-dialog/subscription-interstitial-dialog.html</context>
<context context-type="linenumber">129</context> <context context-type="linenumber">129</context>
@ -3433,7 +3441,7 @@
</trans-unit> </trans-unit>
<trans-unit id="4257439615478050183" datatype="html"> <trans-unit id="4257439615478050183" datatype="html">
<source>Ghostfolio Status</source> <source>Ghostfolio Status</source>
<target state="new">Ghostfolio Status</target> <target state="translated">Ghostfolio 状态</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">62</context> <context context-type="linenumber">62</context>
@ -3441,10 +3449,10 @@
</trans-unit> </trans-unit>
<trans-unit id="4275978599610634089" datatype="html"> <trans-unit id="4275978599610634089" datatype="html">
<source>with your university e-mail address</source> <source>with your university e-mail address</source>
<target state="new">with your university e-mail address</target> <target state="translated">使用您的学校电子邮件地址</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">365</context> <context context-type="linenumber">366</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="4808791512433987109" datatype="html"> <trans-unit id="4808791512433987109" datatype="html">
@ -3473,7 +3481,7 @@
</trans-unit> </trans-unit>
<trans-unit id="70768492340592330" datatype="html"> <trans-unit id="70768492340592330" datatype="html">
<source>and a safe withdrawal rate (SWR) of</source> <source>and a safe withdrawal rate (SWR) of</source>
<target state="new">and a safe withdrawal rate (SWR) of</target> <target state="translated">和安全取款率 (SWR) 为</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">107</context> <context context-type="linenumber">107</context>
@ -3497,7 +3505,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3627006945295714424" datatype="html"> <trans-unit id="3627006945295714424" datatype="html">
<source>Job ID</source> <source>Job ID</source>
<target state="new">Job ID</target> <target state="translated">作业 ID</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context> <context context-type="sourcefile">apps/client/src/app/components/admin-jobs/admin-jobs.html</context>
<context context-type="linenumber">34</context> <context context-type="linenumber">34</context>
@ -3709,7 +3717,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7500665368930738879" datatype="html"> <trans-unit id="7500665368930738879" datatype="html">
<source>or start a discussion at</source> <source>or start a discussion at</source>
<target state="new">or start a discussion at</target> <target state="translated">或在以下位置开始讨论</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">94</context> <context context-type="linenumber">94</context>
@ -3897,7 +3905,7 @@
</trans-unit> </trans-unit>
<trans-unit id="79310201207169632" datatype="html"> <trans-unit id="79310201207169632" datatype="html">
<source>Exclude from Analysis</source> <source>Exclude from Analysis</source>
<target state="new">Exclude from Analysis</target> <target state="translated">排除在分析之外</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.html</context>
<context context-type="linenumber">90</context> <context context-type="linenumber">90</context>
@ -3921,7 +3929,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7934616470747135563" datatype="html"> <trans-unit id="7934616470747135563" datatype="html">
<source>Latest activities</source> <source>Latest activities</source>
<target state="new">Latest activities</target> <target state="translated">最新活动</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/public/public-page.html</context>
<context context-type="linenumber">211</context> <context context-type="linenumber">211</context>
@ -3989,10 +3997,10 @@
</trans-unit> </trans-unit>
<trans-unit id="7763941937414903315" datatype="html"> <trans-unit id="7763941937414903315" datatype="html">
<source>Looking for a student discount?</source> <source>Looking for a student discount?</source>
<target state="new">Looking for a student discount?</target> <target state="translated">寻找学生折扣?</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">359</context> <context context-type="linenumber">360</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7765499580020598783" datatype="html"> <trans-unit id="7765499580020598783" datatype="html">
@ -4165,7 +4173,7 @@
</trans-unit> </trans-unit>
<trans-unit id="6962217007874959362" datatype="html"> <trans-unit id="6962217007874959362" datatype="html">
<source>Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover operational costs for the hosting infrastructure and professional data providers, and to fund ongoing development.</source> <source>Our official Ghostfolio Premium cloud offering is the easiest way to get started. Due to the time it saves, this will be the best option for most people. Revenue is used to cover operational costs for the hosting infrastructure and professional data providers, and to fund ongoing development.</source>
<target state="new">我们的官方 Ghostfolio Premium 云产品是最简单的入门方法。由于它节省了时间,这对于大多数人来说将是最佳选择。收入用于支付托管基础设施的成本和资助持续开发。</target> <target state="translated">我们的官方 Ghostfolio Premium 云产品是最简单的入门方法。由于它节省了时间,这对于大多数人来说将是最佳选择。收入用于支付托管基础设施的成本和资助持续开发。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">7</context> <context context-type="linenumber">7</context>
@ -4344,7 +4352,7 @@
<target state="translated">免费。</target> <target state="translated">免费。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">379</context> <context context-type="linenumber">380</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5342721262799645301" datatype="html"> <trans-unit id="5342721262799645301" datatype="html">
@ -4365,7 +4373,7 @@
</trans-unit> </trans-unit>
<trans-unit id="2003818202621229370" datatype="html"> <trans-unit id="2003818202621229370" datatype="html">
<source>Sustainable retirement income</source> <source>Sustainable retirement income</source>
<target state="new">Sustainable retirement income</target> <target state="translated">可持续的退休收入</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">40</context> <context context-type="linenumber">40</context>
@ -4498,7 +4506,7 @@
</trans-unit> </trans-unit>
<trans-unit id="4905798562247431262" datatype="html"> <trans-unit id="4905798562247431262" datatype="html">
<source>per month</source> <source>per month</source>
<target state="new">per month</target> <target state="translated">每月</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">92</context> <context context-type="linenumber">92</context>
@ -4514,7 +4522,7 @@
</trans-unit> </trans-unit>
<trans-unit id="5271053765919315173" datatype="html"> <trans-unit id="5271053765919315173" datatype="html">
<source>Website of Thomas Kaul</source> <source>Website of Thomas Kaul</source>
<target state="new">Website of Thomas Kaul</target> <target state="translated">Thomas Kaul 的网站</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">44</context> <context context-type="linenumber">44</context>
@ -4642,7 +4650,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1434671461968858301" datatype="html"> <trans-unit id="1434671461968858301" datatype="html">
<source>User ID</source> <source>User ID</source>
<target state="new">User ID</target> <target state="translated">用户 ID</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">12</context> <context context-type="linenumber">12</context>
@ -4762,10 +4770,10 @@
</trans-unit> </trans-unit>
<trans-unit id="5276907121760788823" datatype="html"> <trans-unit id="5276907121760788823" datatype="html">
<source>Request it</source> <source>Request it</source>
<target state="new">Request it</target> <target state="translated">请求它</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">361</context> <context context-type="linenumber">362</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="5278627882107105833" datatype="html"> <trans-unit id="5278627882107105833" datatype="html">
@ -4906,7 +4914,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3302046820145091217" datatype="html"> <trans-unit id="3302046820145091217" datatype="html">
<source>,</source> <source>,</source>
<target state="new">,</target> <target state="translated">,</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">93</context> <context context-type="linenumber">93</context>
@ -4930,10 +4938,10 @@
</trans-unit> </trans-unit>
<trans-unit id="1531212547408073567" datatype="html"> <trans-unit id="1531212547408073567" datatype="html">
<source>contact us</source> <source>contact us</source>
<target state="new">contact us</target> <target state="translated">联系我们</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">353</context> <context context-type="linenumber">354</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1533391340482659699" datatype="html"> <trans-unit id="1533391340482659699" datatype="html">
@ -5318,7 +5326,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1468015720862673946" datatype="html"> <trans-unit id="1468015720862673946" datatype="html">
<source>View Details</source> <source>View Details</source>
<target state="new">View Details</target> <target state="translated">查看详细信息</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-users/admin-users.html</context> <context context-type="sourcefile">apps/client/src/app/components/admin-users/admin-users.html</context>
<context context-type="linenumber">225</context> <context context-type="linenumber">225</context>
@ -5526,7 +5534,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3227075298129844075" datatype="html"> <trans-unit id="3227075298129844075" datatype="html">
<source>If you retire today, you would be able to withdraw</source> <source>If you retire today, you would be able to withdraw</source>
<target state="new">If you retire today, you would be able to withdraw</target> <target state="translated">如果您今天退休,您将能够提取</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">66</context> <context context-type="linenumber">66</context>
@ -5662,7 +5670,7 @@
</trans-unit> </trans-unit>
<trans-unit id="2575998129003872734" datatype="html"> <trans-unit id="2575998129003872734" datatype="html">
<source>Argentina</source> <source>Argentina</source>
<target state="new">Argentina</target> <target state="translated">阿根廷</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">78</context> <context context-type="linenumber">78</context>
@ -5734,7 +5742,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1600023202562292052" datatype="html"> <trans-unit id="1600023202562292052" datatype="html">
<source>Close Holding</source> <source>Close Holding</source>
<target state="new">Close Holding</target> <target state="translated">关闭持仓</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html</context>
<context context-type="linenumber">442</context> <context context-type="linenumber">442</context>
@ -5774,10 +5782,10 @@
</trans-unit> </trans-unit>
<trans-unit id="858192247408211331" datatype="html"> <trans-unit id="858192247408211331" datatype="html">
<source>here</source> <source>here</source>
<target state="new">here</target> <target state="translated">这里</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">364</context> <context context-type="linenumber">365</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1501828122056907560" datatype="html"> <trans-unit id="1501828122056907560" datatype="html">
@ -6011,7 +6019,7 @@
</trans-unit> </trans-unit>
<trans-unit id="5303806780432428245" datatype="html"> <trans-unit id="5303806780432428245" datatype="html">
<source>Indonesia</source> <source>Indonesia</source>
<target state="new">Indonesia</target> <target state="translated">印度尼西亚</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context> <context context-type="sourcefile">libs/ui/src/lib/i18n.ts</context>
<context context-type="linenumber">90</context> <context context-type="linenumber">90</context>
@ -6147,7 +6155,7 @@
</trans-unit> </trans-unit>
<trans-unit id="5707368132268957392" datatype="html"> <trans-unit id="5707368132268957392" datatype="html">
<source>Include in</source> <source>Include in</source>
<target state="new">Include in</target> <target state="translated">包含在</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.html</context>
<context context-type="linenumber">369</context> <context context-type="linenumber">369</context>
@ -6427,7 +6435,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3477953895055172777" datatype="html"> <trans-unit id="3477953895055172777" datatype="html">
<source>View Holding</source> <source>View Holding</source>
<target state="new">View Holding</target> <target state="translated">查看持仓</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context> <context context-type="sourcefile">libs/ui/src/lib/activities-table/activities-table.component.html</context>
<context context-type="linenumber">444</context> <context context-type="linenumber">444</context>
@ -6571,7 +6579,7 @@
</trans-unit> </trans-unit>
<trans-unit id="4762855117875399861" datatype="html"> <trans-unit id="4762855117875399861" datatype="html">
<source>Oops! Could not update access.</source> <source>Oops! Could not update access.</source>
<target state="new">Oops! Could not update access.</target> <target state="translated">哎呀!无法更新访问权限。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts</context>
<context context-type="linenumber">179</context> <context context-type="linenumber">179</context>
@ -6579,7 +6587,7 @@
</trans-unit> </trans-unit>
<trans-unit id="184247710717595241" datatype="html"> <trans-unit id="184247710717595241" datatype="html">
<source>based on your total assets of</source> <source>based on your total assets of</source>
<target state="new">based on your total assets of</target> <target state="translated">基于您总资产的</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/portfolio/fire/fire-page.html</context>
<context context-type="linenumber">95</context> <context context-type="linenumber">95</context>
@ -6695,7 +6703,7 @@
</trans-unit> </trans-unit>
<trans-unit id="2803298218425845065" datatype="html"> <trans-unit id="2803298218425845065" datatype="html">
<source>Role</source> <source>Role</source>
<target state="new">Role</target> <target state="translated">角色</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">31</context> <context context-type="linenumber">31</context>
@ -6711,7 +6719,7 @@
</trans-unit> </trans-unit>
<trans-unit id="6574710269679413520" datatype="html"> <trans-unit id="6574710269679413520" datatype="html">
<source>Accounts</source> <source>Accounts</source>
<target state="new">Accounts</target> <target state="translated">账户</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">51</context> <context context-type="linenumber">51</context>
@ -6743,10 +6751,10 @@
</trans-unit> </trans-unit>
<trans-unit id="6602358241522477056" datatype="html"> <trans-unit id="6602358241522477056" datatype="html">
<source>If you plan to open an account at</source> <source>If you plan to open an account at</source>
<target state="new">If you plan to open an account at</target> <target state="translated">如果您计划开通账户在</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">329</context> <context context-type="linenumber">330</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6608617124920241143" datatype="html"> <trans-unit id="6608617124920241143" datatype="html">
@ -6775,7 +6783,7 @@
</trans-unit> </trans-unit>
<trans-unit id="6664504469290651320" datatype="html"> <trans-unit id="6664504469290651320" datatype="html">
<source>send an e-mail to</source> <source>send an e-mail to</source>
<target state="new">send an e-mail to</target> <target state="translated">发送电子邮件至</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">87</context> <context context-type="linenumber">87</context>
@ -6789,14 +6797,6 @@
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="1442341407847672405" datatype="html">
<source>No auto-renewal.</source>
<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">70</context>
</context-group>
</trans-unit>
<trans-unit id="8462417627724236320" datatype="html"> <trans-unit id="8462417627724236320" datatype="html">
<source>This year</source> <source>This year</source>
<target state="translated">今年</target> <target state="translated">今年</target>
@ -6855,10 +6855,10 @@
</trans-unit> </trans-unit>
<trans-unit id="7522916136412124285" datatype="html"> <trans-unit id="7522916136412124285" datatype="html">
<source>to use our referral link and get a Ghostfolio Premium membership for one year</source> <source>to use our referral link and get a Ghostfolio Premium membership for one year</source>
<target state="new">to use our referral link and get a Ghostfolio Premium membership for one year</target> <target state="translated">使用我们的推荐链接并获得一年的Ghostfolio Premium会员资格</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">357</context> <context context-type="linenumber">358</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="7530176451725943586" datatype="html"> <trans-unit id="7530176451725943586" datatype="html">
@ -6935,7 +6935,7 @@
</trans-unit> </trans-unit>
<trans-unit id="3528767106831563012" datatype="html"> <trans-unit id="3528767106831563012" datatype="html">
<source>Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.</source> <source>Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.</source>
<target state="new">Ghostfolio is a lightweight wealth management application for individuals to keep track of stocks, ETFs or cryptocurrencies and make solid, data-driven investment decisions.</target> <target state="translated">Ghostfolio 是一款轻量级的财富管理应用程序,旨在帮助个人跟踪股票、ETF 或加密货币,并做出基于数据的稳健投资决策。</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">10</context> <context context-type="linenumber">10</context>
@ -7007,7 +7007,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7417020438124538834" datatype="html"> <trans-unit id="7417020438124538834" datatype="html">
<source>Engagement per Day</source> <source>Engagement per Day</source>
<target state="new">Engagement per Day</target> <target state="translated">每日参与度</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">76</context> <context context-type="linenumber">76</context>
@ -7153,7 +7153,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8514765519764380399" datatype="html"> <trans-unit id="8514765519764380399" datatype="html">
<source>Country</source> <source>Country</source>
<target state="new">Country</target> <target state="translated">国家</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">37</context> <context context-type="linenumber">37</context>
@ -7261,7 +7261,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1789421195684815451" datatype="html"> <trans-unit id="1789421195684815451" datatype="html">
<source>Check the system status at</source> <source>Check the system status at</source>
<target state="new">Check the system status at</target> <target state="translated">检查系统状态</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">57</context> <context context-type="linenumber">57</context>
@ -7309,7 +7309,7 @@
</trans-unit> </trans-unit>
<trans-unit id="8214324091109908102" datatype="html"> <trans-unit id="8214324091109908102" datatype="html">
<source>API Requests Today</source> <source>API Requests Today</source>
<target state="new">API Requests Today</target> <target state="translated">今日 API 请求</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">86</context> <context context-type="linenumber">86</context>
@ -7417,7 +7417,7 @@
</trans-unit> </trans-unit>
<trans-unit id="1325095699053123251" datatype="html"> <trans-unit id="1325095699053123251" datatype="html">
<source>The project has been initiated by</source> <source>The project has been initiated by</source>
<target state="new">The project has been initiated by</target> <target state="translated">该项目发起于</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">40</context> <context context-type="linenumber">40</context>
@ -7525,7 +7525,7 @@
</trans-unit> </trans-unit>
<trans-unit id="6752851341939241310" datatype="html"> <trans-unit id="6752851341939241310" datatype="html">
<source>Find account, holding or page...</source> <source>Find account, holding or page...</source>
<target state="new">Find account, holding or page...</target> <target state="translated">查找账户、持仓或页面...</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context> <context context-type="sourcefile">libs/ui/src/lib/assistant/assistant.component.ts</context>
<context context-type="linenumber">152</context> <context context-type="linenumber">152</context>
@ -7910,6 +7910,10 @@
<trans-unit id="5743832581969115624" datatype="html"> <trans-unit id="5743832581969115624" datatype="html">
<source>Limited Offer!</source> <source>Limited Offer!</source>
<target state="translated">限时优惠!</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">40</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">312</context> <context context-type="linenumber">312</context>
@ -7918,9 +7922,13 @@
<trans-unit id="2415916442984615985" datatype="html"> <trans-unit id="2415916442984615985" datatype="html">
<source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source> <source>Get <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/> extra</source>
<target state="translated">获取额外 <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/></target> <target state="translated">获取额外 <x id="INTERPOLATION" equiv-text="{{ durationExtension }}"/></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">43</context>
</context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/pricing/pricing-page.html</context>
<context context-type="linenumber">314</context> <context context-type="linenumber">315</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3955868613858648955" datatype="html"> <trans-unit id="3955868613858648955" datatype="html">
@ -7941,7 +7949,7 @@
</trans-unit> </trans-unit>
<trans-unit id="7383756232563820625" datatype="html"> <trans-unit id="7383756232563820625" datatype="html">
<source>Current month</source> <source>Current month</source>
<target state="new">Current month</target> <target state="translated">当前月份</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context> <context context-type="sourcefile">apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts</context>
<context context-type="linenumber">200</context> <context context-type="linenumber">200</context>
@ -8126,7 +8134,7 @@
</trans-unit> </trans-unit>
<trans-unit id="5199695670214400859" datatype="html"> <trans-unit id="5199695670214400859" datatype="html">
<source>If you encounter a bug, would like to suggest an improvement or a new <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot;&gt;"/>feature<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, please join the Ghostfolio <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg&quot; title=&quot;Join the Ghostfolio Slack community&quot; &gt;"/>Slack<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> community, post to <x id="START_LINK_2" equiv-text="&lt;a href=&quot;https://x.com/ghostfolio_&quot; title=&quot;Post to Ghostfolio on X (formerly Twitter)&quot; &gt;"/>@ghostfolio_<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></source> <source>If you encounter a bug, would like to suggest an improvement or a new <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot;&gt;"/>feature<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, please join the Ghostfolio <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg&quot; title=&quot;Join the Ghostfolio Slack community&quot; &gt;"/>Slack<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> community, post to <x id="START_LINK_2" equiv-text="&lt;a href=&quot;https://x.com/ghostfolio_&quot; title=&quot;Post to Ghostfolio on X (formerly Twitter)&quot; &gt;"/>@ghostfolio_<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></source>
<target state="new">If you encounter a bug, would like to suggest an improvement or a new <x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot;&gt;"/>feature<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>, please join the Ghostfolio <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg&quot; title=&quot;Join the Ghostfolio Slack community&quot; &gt;"/>Slack<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> community, post to <x id="START_LINK_2" equiv-text="&lt;a href=&quot;https://x.com/ghostfolio_&quot; title=&quot;Post to Ghostfolio on X (formerly Twitter)&quot; &gt;"/>@ghostfolio_<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target> <target state="translated">如果您遇到错误,想要建议改进或新<x id="START_LINK" ctype="x-a" equiv-text="&lt;a [routerLink]=&quot;routerLinkFeatures&quot;&gt;"/>功能<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/>,请加入 Ghostfolio <x id="START_LINK_1" equiv-text="&lt;a href=&quot;https://join.slack.com/t/ghostfolio/shared_invite/zt-vsaan64h-F_I0fEo5M0P88lP9ibCxFg&quot; title=&quot;Join the Ghostfolio Slack community&quot; &gt;"/>Slack<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/> 社区,发布到 <x id="START_LINK_2" equiv-text="&lt;a href=&quot;https://x.com/ghostfolio_&quot; title=&quot;Post to Ghostfolio on X (formerly Twitter)&quot; &gt;"/>@ghostfolio_<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a &gt;"/></target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/about/overview/about-overview-page.html</context>
<context context-type="linenumber">69</context> <context context-type="linenumber">69</context>
@ -8250,7 +8258,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.liquidity.category" datatype="html"> <trans-unit id="rule.liquidity.category" datatype="html">
<source>Liquidity</source> <source>Liquidity</source>
<target state="new">Liquidity</target> <target state="translated">流动性</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">70</context> <context context-type="linenumber">70</context>
@ -8258,7 +8266,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.liquidityBuyingPower" datatype="html"> <trans-unit id="rule.liquidityBuyingPower" datatype="html">
<source>Buying Power</source> <source>Buying Power</source>
<target state="new">Buying Power</target> <target state="translated">购买力</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">71</context> <context context-type="linenumber">71</context>
@ -8266,7 +8274,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.liquidityBuyingPower.false.min" datatype="html"> <trans-unit id="rule.liquidityBuyingPower.false.min" datatype="html">
<source>Your buying power is below ${thresholdMin} ${baseCurrency}</source> <source>Your buying power is below ${thresholdMin} ${baseCurrency}</source>
<target state="new">Your buying power is below ${thresholdMin} ${baseCurrency}</target> <target state="translated">您的购买力低于 ${thresholdMin} ${baseCurrency}</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">73</context> <context context-type="linenumber">73</context>
@ -8274,7 +8282,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.liquidityBuyingPower.false.zero" datatype="html"> <trans-unit id="rule.liquidityBuyingPower.false.zero" datatype="html">
<source>Your buying power is 0 ${baseCurrency}</source> <source>Your buying power is 0 ${baseCurrency}</source>
<target state="new">Your buying power is 0 ${baseCurrency}</target> <target state="translated">您的购买力为 0 ${baseCurrency}</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">77</context> <context context-type="linenumber">77</context>
@ -8282,7 +8290,7 @@
</trans-unit> </trans-unit>
<trans-unit id="rule.liquidityBuyingPower.true" datatype="html"> <trans-unit id="rule.liquidityBuyingPower.true" datatype="html">
<source>Your buying power exceeds ${thresholdMin} ${baseCurrency}</source> <source>Your buying power exceeds ${thresholdMin} ${baseCurrency}</source>
<target state="new">Your buying power exceeds ${thresholdMin} ${baseCurrency}</target> <target state="translated">您的购买力超过了 ${thresholdMin} ${baseCurrency}</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context> <context context-type="sourcefile">apps/client/src/app/pages/i18n/i18n-page.html</context>
<context context-type="linenumber">80</context> <context context-type="linenumber">80</context>
@ -8586,7 +8594,7 @@
</trans-unit> </trans-unit>
<trans-unit id="889243574476657449" datatype="html"> <trans-unit id="889243574476657449" datatype="html">
<source>Registration Date</source> <source>Registration Date</source>
<target state="new">Registration Date</target> <target state="translated">注册日期</target>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context> <context context-type="sourcefile">apps/client/src/app/components/user-detail-dialog/user-detail-dialog.html</context>
<context context-type="linenumber">23</context> <context context-type="linenumber">23</context>

9
apps/client/src/styles.scss

@ -1,5 +1,6 @@
@import './styles/bootstrap'; @import './styles/bootstrap';
@import './styles/table'; @import './styles/table';
@import './styles/variables';
@import 'svgmap/dist/svgMap'; @import 'svgmap/dist/svgMap';
@ -8,14 +9,18 @@
--font-family-sans-serif: 'Inter', Roboto, 'Helvetica Neue', sans-serif; --font-family-sans-serif: 'Inter', Roboto, 'Helvetica Neue', sans-serif;
--light-background: rgb(255, 255, 255); --light-background: rgb(255, 255, 255);
--dark-primary-text: 0, 0, 0, 0.87; --dark-primary-text:
#{red($dark-primary-text)}, #{green($dark-primary-text)},
#{blue($dark-primary-text)}, #{alpha($dark-primary-text)};
--dark-secondary-text: 0, 0, 0, 0.54; --dark-secondary-text: 0, 0, 0, 0.54;
--dark-accent-text: 0, 0, 0, 0.87; --dark-accent-text: 0, 0, 0, 0.87;
--dark-warn-text: 0, 0, 0, 0.87; --dark-warn-text: 0, 0, 0, 0.87;
--dark-disabled-text: 0, 0, 0, 0.38; --dark-disabled-text: 0, 0, 0, 0.38;
--dark-dividers: 0, 0, 0, 0.12; --dark-dividers: 0, 0, 0, 0.12;
--dark-focused: 0, 0, 0, 0.12; --dark-focused: 0, 0, 0, 0.12;
--light-primary-text: 255, 255, 255, 1; --light-primary-text:
#{red($light-primary-text)}, #{green($light-primary-text)},
#{blue($light-primary-text)}, #{alpha($light-primary-text)};
--light-secondary-text: 255, 255, 255, 0.7; --light-secondary-text: 255, 255, 255, 0.7;
--light-accent-text: 255, 255, 255, 1; --light-accent-text: 255, 255, 255, 1;
--light-warn-text: 255, 255, 255, 1; --light-warn-text: 255, 255, 255, 1;

2
apps/client/src/styles/variables.scss

@ -1,4 +1,4 @@
$dark-primary-text: rgba(black, 0.87); $dark-primary-text: rgba(black, 0.87);
$light-primary-text: white; $light-primary-text: rgba(white, 1);
$mat-css-dark-theme-selector: '.theme-dark'; $mat-css-dark-theme-selector: '.theme-dark';

9
eslint.config.cjs

@ -18,16 +18,19 @@ module.exports = [
files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'], files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
rules: { rules: {
'@nx/enforce-module-boundaries': [ '@nx/enforce-module-boundaries': [
'warn', 'error',
{ {
enforceBuildableLibDependency: true,
allow: [], allow: [],
allowCircularSelfDependency: true,
depConstraints: [ depConstraints: [
{ {
sourceTag: '*', sourceTag: '*',
onlyDependOnLibsWithTags: ['*'] onlyDependOnLibsWithTags: ['*']
} }
] ],
enforceBuildableLibDependency: true,
// Temporary fix, should be removed eventually
ignoredCircularDependencies: [['client', 'ui']]
} }
], ],
'@typescript-eslint/no-extra-semi': 'error', '@typescript-eslint/no-extra-semi': 'error',

0
apps/api/src/app/order/interfaces/activities.interface.ts → libs/common/src/lib/interfaces/activities.interface.ts

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

@ -1,5 +1,6 @@
import type { Access } from './access.interface'; import type { Access } from './access.interface';
import type { AccountBalance } from './account-balance.interface'; import type { AccountBalance } from './account-balance.interface';
import type { Activity, ActivityError } from './activities.interface';
import type { AdminData } from './admin-data.interface'; import type { AdminData } from './admin-data.interface';
import type { AdminJobs } from './admin-jobs.interface'; import type { AdminJobs } from './admin-jobs.interface';
import type { AdminMarketDataDetails } from './admin-market-data-details.interface'; import type { AdminMarketDataDetails } from './admin-market-data-details.interface';
@ -36,6 +37,7 @@ import type { Position } from './position.interface';
import type { Product } from './product'; import type { Product } from './product';
import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccessTokenResponse } from './responses/access-token-response.interface';
import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface';
import type { AccountResponse } from './responses/account-response.interface';
import type { AccountsResponse } from './responses/accounts-response.interface'; import type { AccountsResponse } from './responses/accounts-response.interface';
import type { ActivitiesResponse } from './responses/activities-response.interface'; import type { ActivitiesResponse } from './responses/activities-response.interface';
import type { ActivityResponse } from './responses/activity-response.interface'; import type { ActivityResponse } from './responses/activity-response.interface';
@ -51,6 +53,10 @@ import type { DataEnhancerHealthResponse } from './responses/data-enhancer-healt
import type { DataProviderGhostfolioAssetProfileResponse } from './responses/data-provider-ghostfolio-asset-profile-response.interface'; import type { DataProviderGhostfolioAssetProfileResponse } from './responses/data-provider-ghostfolio-asset-profile-response.interface';
import type { DataProviderGhostfolioStatusResponse } from './responses/data-provider-ghostfolio-status-response.interface'; import type { DataProviderGhostfolioStatusResponse } from './responses/data-provider-ghostfolio-status-response.interface';
import type { DataProviderHealthResponse } from './responses/data-provider-health-response.interface'; import type { DataProviderHealthResponse } from './responses/data-provider-health-response.interface';
import type {
DataProviderResponse,
DataProviderHistoricalResponse
} from './responses/data-provider-response.interface';
import type { DividendsResponse } from './responses/dividends-response.interface'; import type { DividendsResponse } from './responses/dividends-response.interface';
import type { ResponseError } from './responses/errors.interface'; import type { ResponseError } from './responses/errors.interface';
import type { ExportResponse } from './responses/export-response.interface'; import type { ExportResponse } from './responses/export-response.interface';
@ -73,6 +79,7 @@ import type { WatchlistResponse } from './responses/watchlist-response.interface
import type { ScraperConfiguration } from './scraper-configuration.interface'; import type { ScraperConfiguration } from './scraper-configuration.interface';
import type { Statistics } from './statistics.interface'; import type { Statistics } from './statistics.interface';
import type { SubscriptionOffer } from './subscription-offer.interface'; import type { SubscriptionOffer } from './subscription-offer.interface';
import type { SymbolItem } from './symbol-item.interface';
import type { SymbolMetrics } from './symbol-metrics.interface'; import type { SymbolMetrics } from './symbol-metrics.interface';
import type { SystemMessage } from './system-message.interface'; import type { SystemMessage } from './system-message.interface';
import type { TabConfiguration } from './tab-configuration.interface'; import type { TabConfiguration } from './tab-configuration.interface';
@ -86,8 +93,11 @@ export {
AccessTokenResponse, AccessTokenResponse,
AccountBalance, AccountBalance,
AccountBalancesResponse, AccountBalancesResponse,
AccountResponse,
AccountsResponse, AccountsResponse,
ActivitiesResponse, ActivitiesResponse,
Activity,
ActivityError,
ActivityResponse, ActivityResponse,
AdminData, AdminData,
AdminJobs, AdminJobs,
@ -112,7 +122,9 @@ export {
DataProviderGhostfolioAssetProfileResponse, DataProviderGhostfolioAssetProfileResponse,
DataProviderGhostfolioStatusResponse, DataProviderGhostfolioStatusResponse,
DataProviderHealthResponse, DataProviderHealthResponse,
DataProviderHistoricalResponse,
DataProviderInfo, DataProviderInfo,
DataProviderResponse,
DividendsResponse, DividendsResponse,
EnhancedSymbolProfile, EnhancedSymbolProfile,
ExportResponse, ExportResponse,
@ -154,8 +166,9 @@ export {
ScraperConfiguration, ScraperConfiguration,
Statistics, Statistics,
SubscriptionOffer, SubscriptionOffer,
SystemMessage, SymbolItem,
SymbolMetrics, SymbolMetrics,
SystemMessage,
TabConfiguration, TabConfiguration,
ToggleOption, ToggleOption,
User, User,

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

@ -0,0 +1,3 @@
import { AccountWithValue } from '@ghostfolio/common/types';
export interface AccountResponse extends AccountWithValue {}

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

Loading…
Cancel
Save